diff --git a/venv/bin/activate b/venv/bin/activate new file mode 100644 index 0000000..5655bba --- /dev/null +++ b/venv/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "$1" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/gillmannma68984/PycharmProjects/git/demoweb/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(venv) " != x ] ; then + PS1="(venv) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh new file mode 100644 index 0000000..79b6d69 --- /dev/null +++ b/venv/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/gillmannma68984/PycharmProjects/git/demoweb/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("venv" != "") then + set env_name = "venv" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/venv/bin/automat-visualize b/venv/bin/automat-visualize new file mode 100755 index 0000000..5a35a8d --- /dev/null +++ b/venv/bin/automat-visualize @@ -0,0 +1,11 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from automat._visualize import tool + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(tool()) diff --git a/venv/bin/django-admin b/venv/bin/django-admin new file mode 100755 index 0000000..f436aa8 --- /dev/null +++ b/venv/bin/django-admin @@ -0,0 +1,11 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from django.core.management import execute_from_command_line + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(execute_from_command_line()) diff --git a/venv/bin/mailmail b/venv/bin/mailmail new file mode 100755 index 0000000..139c5da --- /dev/null +++ b/venv/bin/mailmail @@ -0,0 +1,12 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'Twisted==19.10.0','console_scripts','mailmail' +__requires__ = 'Twisted==19.10.0' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('Twisted==19.10.0', 'console_scripts', 'mailmail')() + ) diff --git a/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..e04a4d3 --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,12 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==10.0.1','console_scripts','pip' +__requires__ = 'pip==10.0.1' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('pip==10.0.1', 'console_scripts', 'pip')() + ) diff --git a/venv/bin/pip3.7 b/venv/bin/pip3.7 new file mode 100755 index 0000000..27ad998 --- /dev/null +++ b/venv/bin/pip3.7 @@ -0,0 +1,12 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==10.0.1','console_scripts','pip3.7' +__requires__ = 'pip==10.0.1' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('pip==10.0.1', 'console_scripts', 'pip3.7')() + ) diff --git a/venv/bin/trial b/venv/bin/trial new file mode 100755 index 0000000..911880f --- /dev/null +++ b/venv/bin/trial @@ -0,0 +1,12 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'Twisted==19.10.0','console_scripts','trial' +__requires__ = 'Twisted==19.10.0' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('Twisted==19.10.0', 'console_scripts', 'trial')() + ) diff --git a/venv/bin/twist b/venv/bin/twist new file mode 100755 index 0000000..d2ec0b2 --- /dev/null +++ b/venv/bin/twist @@ -0,0 +1,12 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'Twisted==19.10.0','console_scripts','twist' +__requires__ = 'Twisted==19.10.0' +import re +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point('Twisted==19.10.0', 'console_scripts', 'twist')() + ) diff --git a/venv/bin/wamp b/venv/bin/wamp new file mode 100755 index 0000000..4450709 --- /dev/null +++ b/venv/bin/wamp @@ -0,0 +1,11 @@ +#!/Users/gillmannma68984/PycharmProjects/git/demoweb/venv/bin/python + +# -*- coding: utf-8 -*- +import re +import sys + +from autobahn.__main__ import _main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(_main()) diff --git a/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/LICENSE b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/LICENSE new file mode 100644 index 0000000..9773501 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2014 +Rackspace + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/METADATA new file mode 100644 index 0000000..3f0d9a0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/METADATA @@ -0,0 +1,486 @@ +Metadata-Version: 2.1 +Name: Automat +Version: 0.8.0 +Summary: Self-service finite-state machines for the programmer on the go. +Home-page: https://github.com/glyph/Automat +Author: Glyph +Author-email: glyph@twistedmatrix.com +License: MIT +Keywords: fsm finite state machine automata +Platform: UNKNOWN +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Requires-Dist: attrs (>=16.1.0) +Requires-Dist: six +Provides-Extra: visualize +Requires-Dist: graphviz (>0.5.1) ; extra == 'visualize' +Requires-Dist: Twisted (>=16.1.1) ; extra == 'visualize' + +Automat +======= + + +.. image:: https://readthedocs.org/projects/automat/badge/?version=latest + :target: http://automat.readthedocs.io/en/latest/ + :alt: Documentation Status + + +.. image:: https://travis-ci.org/glyph/automat.svg?branch=master + :target: https://travis-ci.org/glyph/automat + :alt: Build Status + + +.. image:: https://coveralls.io/repos/glyph/automat/badge.png + :target: https://coveralls.io/r/glyph/automat + :alt: Coverage Status + + +Self-service finite-state machines for the programmer on the go. +---------------------------------------------------------------- + +Automat is a library for concise, idiomatic Python expression of finite-state +automata (particularly deterministic finite-state transducers). + +Read more here, or on `Read the Docs `_\ , or watch the following videos for an overview and presentation + +Overview and presentation by **Glyph Lefkowitz** at the first talk of the first Pyninsula meetup, on February 21st, 2017: + +.. image:: https://img.youtube.com/vi/0wOZBpD1VVk/0.jpg + :target: https://www.youtube.com/watch?v=0wOZBpD1VVk + :alt: Glyph Lefkowitz - Automat - Pyninsula #0 + + +Presentation by **Clinton Roy** at PyCon Australia, on August 6th 2017: + +.. image:: https://img.youtube.com/vi/TedUKXhu9kE/0.jpg + :target: https://www.youtube.com/watch?v=TedUKXhu9kE + :alt: Clinton Roy - State Machines - Pycon Australia 2017 + + +Why use state machines? +^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes you have to create an object whose behavior varies with its state, +but still wishes to present a consistent interface to its callers. + +For example, let's say you're writing the software for a coffee machine. It +has a lid that can be opened or closed, a chamber for water, a chamber for +coffee beans, and a button for "brew". + +There are a number of possible states for the coffee machine. It might or +might not have water. It might or might not have beans. The lid might be open +or closed. The "brew" button should only actually attempt to brew coffee in +one of these configurations, and the "open lid" button should only work if the +coffee is not, in fact, brewing. + +With diligence and attention to detail, you can implement this correctly using +a collection of attributes on an object; ``has_water``\ , ``has_beans``\ , +``is_lid_open`` and so on. However, you have to keep all these attributes +consistent. As the coffee maker becomes more complex - perhaps you add an +additional chamber for flavorings so you can make hazelnut coffee, for +example - you have to keep adding more and more checks and more and more +reasoning about which combinations of states are allowed. + +Rather than adding tedious 'if' checks to every single method to make sure that +each of these flags are exactly what you expect, you can use a state machine to +ensure that if your code runs at all, it will be run with all the required +values initialized, because they have to be called in the order you declare +them. + +You can read about state machines and their advantages for Python programmers +in considerably more detail +`in this excellent series of articles from ClusterHQ `_. + +What makes Automat different? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are +`dozens of libraries on PyPI implementing state machines `_. +So it behooves me to say why yet another one would be a good idea. + +Automat is designed around this principle: while organizing your code around +state machines is a good idea, your callers don't, and shouldn't have to, care +that you've done so. In Python, the "input" to a stateful system is a method +call; the "output" may be a method call, if you need to invoke a side effect, +or a return value, if you are just performing a computation in memory. Most +other state-machine libraries require you to explicitly create an input object, +provide that object to a generic "input" method, and then receive results, +sometimes in terms of that library's interfaces and sometimes in terms of +classes you define yourself. + +For example, a snippet of the coffee-machine example above might be implemented +as follows in naive Python: + +.. code-block:: python + + class CoffeeMachine(object): + def brew_button(self): + if self.has_water and self.has_beans and not self.is_lid_open: + self.heat_the_heating_element() + # ... + +With Automat, you'd create a class with a ``MethodicalMachine`` attribute: + +.. code-block:: python + + from automat import MethodicalMachine + + class CoffeeBrewer(object): + _machine = MethodicalMachine() + +and then you would break the above logic into two pieces - the ``brew_button`` +*input*\ , declared like so: + +.. code-block:: python + + @_machine.input() + def brew_button(self): + "The user pressed the 'brew' button." + +It wouldn't do any good to declare a method *body* on this, however, because +input methods don't actually execute their bodies when called; doing actual +work is the *output*\ 's job: + +.. code-block:: python + + @_machine.output() + def _heat_the_heating_element(self): + "Heat up the heating element, which should cause coffee to happen." + self._heating_element.turn_on() + +As well as a couple of *states* - and for simplicity's sake let's say that the +only two states are ``have_beans`` and ``dont_have_beans``\ : + +.. code-block:: python + + @_machine.state() + def have_beans(self): + "In this state, you have some beans." + @_machine.state(initial=True) + def dont_have_beans(self): + "In this state, you don't have any beans." + +``dont_have_beans`` is the ``initial`` state because ``CoffeeBrewer`` starts without beans +in it. + +(And another input to put some beans in:) + +.. code-block:: python + + @_machine.input() + def put_in_beans(self): + "The user put in some beans." + +Finally, you hook everything together with the ``upon`` method of the functions +decorated with ``_machine.state``\ : + +.. code-block:: python + + + # When we don't have beans, upon putting in beans, we will then have beans + # (and produce no output) + dont_have_beans.upon(put_in_beans, enter=have_beans, outputs=[]) + + # When we have beans, upon pressing the brew button, we will then not have + # beans any more (as they have been entered into the brewing chamber) and + # our output will be heating the heating element. + have_beans.upon(brew_button, enter=dont_have_beans, + outputs=[_heat_the_heating_element]) + +To *users* of this coffee machine class though, it still looks like a POPO +(Plain Old Python Object): + +.. code-block:: python + + >>> coffee_machine = CoffeeMachine() + >>> coffee_machine.put_in_beans() + >>> coffee_machine.brew_button() + +All of the *inputs* are provided by calling them like methods, all of the +*outputs* are automatically invoked when they are produced according to the +outputs specified to ``upon`` and all of the states are simply opaque tokens - +although the fact that they're defined as methods like inputs and outputs +allows you to put docstrings on them easily to document them. + +How do I get the current state of a state machine? +-------------------------------------------------- + +Don't do that. + +One major reason for having a state machine is that you want the callers of the +state machine to just provide the appropriate input to the machine at the +appropriate time, and *not have to check themselves* what state the machine is +in. So if you are tempted to write some code like this: + +.. code-block:: python + + if connection_state_machine.state == "CONNECTED": + connection_state_machine.send_message() + else: + print("not connected") + +Instead, just make your calling code do this: + +.. code-block:: python + + connection_state_machine.send_message() + +and then change your state machine to look like this: + +.. code-block:: python + + @_machine.state() + def connected(self): + "connected" + @_machine.state() + def not_connected(self): + "not connected" + @_machine.input() + def send_message(self): + "send a message" + @_machine.output() + def _actually_send_message(self): + self._transport.send(b"message") + @_machine.output() + def _report_sending_failure(self): + print("not connected") + connected.upon(send_message, enter=connected, [_actually_send_message]) + not_connected.upon(send_message, enter=not_connected, [_report_sending_failure]) + +so that the responsibility for knowing which state the state machine is in +remains within the state machine itself. + +Input for Inputs and Output for Outputs +--------------------------------------- + +Quite often you want to be able to pass parameters to your methods, as well as +inspecting their results. For example, when you brew the coffee, you might +expect a cup of coffee to result, and you would like to see what kind of coffee +it is. And if you were to put delicious hand-roasted small-batch artisanal +beans into the machine, you would expect a *better* cup of coffee than if you +were to use mass-produced beans. You would do this in plain old Python by +adding a parameter, so that's how you do it in Automat as well. + +.. code-block:: python + + @_machine.input() + def put_in_beans(self, beans): + "The user put in some beans." + +However, one important difference here is that *we can't add any +implementation code to the input method*. Inputs are purely a declaration of +the interface; the behavior must all come from outputs. Therefore, the change +in the state of the coffee machine must be represented as an output. We can +add an output method like this: + +.. code-block:: python + + @_machine.output() + def _save_beans(self, beans): + "The beans are now in the machine; save them." + self._beans = beans + +and then connect it to the ``put_in_beans`` by changing the transition from +``dont_have_beans`` to ``have_beans`` like so: + +.. code-block:: python + + dont_have_beans.upon(put_in_beans, enter=have_beans, + outputs=[_save_beans]) + +Now, when you call: + +.. code-block:: python + + coffee_machine.put_in_beans("real good beans") + +the machine will remember the beans for later. + +So how do we get the beans back out again? One of our outputs needs to have a +return value. It would make sense if our ``brew_button`` method returned the cup +of coffee that it made, so we should add an output. So, in addition to heating +the heating element, let's add a return value that describes the coffee. First +a new output: + +.. code-block:: python + + @_machine.output() + def _describe_coffee(self): + return "A cup of coffee made with {}.".format(self._beans) + +Note that we don't need to check first whether ``self._beans`` exists or not, +because we can only reach this output method if the state machine says we've +gone through a set of states that sets this attribute. + +Now, we need to hook up ``_describe_coffee`` to the process of brewing, so change +the brewing transition to: + +.. code-block:: python + + have_beans.upon(brew_button, enter=dont_have_beans, + outputs=[_heat_the_heating_element, + _describe_coffee]) + +Now, we can call it: + +.. code-block:: python + + >>> coffee_machine.brew_button() + [None, 'A cup of coffee made with real good beans.'] + +Except... wait a second, what's that ``None`` doing there? + +Since every input can produce multiple outputs, in automat, the default return +value from every input invocation is a ``list``. In this case, we have both +``_heat_the_heating_element`` and ``_describe_coffee`` outputs, so we're seeing +both of their return values. However, this can be customized, with the +``collector`` argument to ``upon``\ ; the ``collector`` is a callable which takes an +iterable of all the outputs' return values and "collects" a single return value +to return to the caller of the state machine. + +In this case, we only care about the last output, so we can adjust the call to +``upon`` like this: + +.. code-block:: python + + have_beans.upon(brew_button, enter=dont_have_beans, + outputs=[_heat_the_heating_element, + _describe_coffee], + collector=lambda iterable: list(iterable)[-1] + ) + +And now, we'll get just the return value we want: + +.. code-block:: python + + >>> coffee_machine.brew_button() + 'A cup of coffee made with real good beans.' + +If I can't get the state of the state machine, how can I save it to (a database, an API response, a file on disk...) +-------------------------------------------------------------------------------------------------------------------- + +There are APIs for serializing the state machine. + +First, you have to decide on a persistent representation of each state, via the +``serialized=`` argument to the ``MethodicalMachine.state()`` decorator. + +Let's take this very simple "light switch" state machine, which can be on or +off, and flipped to reverse its state: + +.. code-block:: python + + class LightSwitch(object): + _machine = MethodicalMachine() + @_machine.state(serialized="on") + def on_state(self): + "the switch is on" + @_machine.state(serialized="off", initial=True) + def off_state(self): + "the switch is off" + @_machine.input() + def flip(self): + "flip the switch" + on_state.upon(flip, enter=off_state, outputs=[]) + off_state.upon(flip, enter=on_state, outputs=[]) + +In this case, we've chosen a serialized representation for each state via the +``serialized`` argument. The on state is represented by the string ``"on"``\ , and +the off state is represented by the string ``"off"``. + +Now, let's just add an input that lets us tell if the switch is on or not. + +.. code-block:: python + + @_machine.input() + def query_power(self): + "return True if powered, False otherwise" + @_machine.output() + def _is_powered(self): + return True + @_machine.output() + def _not_powered(self): + return False + on_state.upon(query_power, enter=on_state, outputs=[_is_powered], + collector=next) + off_state.upon(query_power, enter=off_state, outputs=[_not_powered], + collector=next) + +To save the state, we have the ``MethodicalMachine.serializer()`` method. A +method decorated with ``@serializer()`` gets an extra argument injected at the +beginning of its argument list: the serialized identifier for the state. In +this case, either ``"on"`` or ``"off"``. Since state machine output methods can +also affect other state on the object, a serializer method is expected to +return *all* relevant state for serialization. + +For our simple light switch, such a method might look like this: + +.. code-block:: python + + @_machine.serializer() + def save(self, state): + return {"is-it-on": state} + +Serializers can be public methods, and they can return whatever you like. If +necessary, you can have different serializers - just multiple methods decorated +with ``@_machine.serializer()`` - for different formats; return one data-structure +for JSON, one for XML, one for a database row, and so on. + +When it comes time to unserialize, though, you generally want a private method, +because an unserializer has to take a not-fully-initialized instance and +populate it with state. It is expected to *return* the serialized machine +state token that was passed to the serializer, but it can take whatever +arguments you like. Of course, in order to return that, it probably has to +take it somewhere in its arguments, so it will generally take whatever a paired +serializer has returned as an argument. + +So our unserializer would look like this: + +.. code-block:: python + + @_machine.unserializer() + def _restore(self, blob): + return blob["is-it-on"] + +Generally you will want a classmethod deserialization constructor which you +write yourself to call this, so that you know how to create an instance of your +own object, like so: + +.. code-block:: python + + @classmethod + def from_blob(cls, blob): + self = cls() + self._restore(blob) + return self + +Saving and loading our ``LightSwitch`` along with its state-machine state can now +be accomplished as follows: + +.. code-block:: python + + >>> switch1 = LightSwitch() + >>> switch1.query_power() + False + >>> switch1.flip() + [] + >>> switch1.query_power() + True + >>> blob = switch1.save() + >>> switch2 = LightSwitch.from_blob(blob) + >>> switch2.query_power() + True + +More comprehensive (tested, working) examples are present in ``docs/examples``. + +Go forth and machine all the state! + + diff --git a/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/entry_points.txt new file mode 100644 index 0000000..d793199 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +automat-visualize = automat._visualize:tool + diff --git a/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/top_level.txt new file mode 100644 index 0000000..b69387b --- /dev/null +++ b/venv/lib/python3.7/site-packages/Automat-0.8.0.dist-info/top_level.txt @@ -0,0 +1 @@ +automat diff --git a/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/LICENSE b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/LICENSE new file mode 100644 index 0000000..5f4f225 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Django Software Foundation and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Django nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/RECORD b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/RECORD new file mode 100644 index 0000000..2342556 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/RECORD @@ -0,0 +1,4212 @@ +../../../bin/django-admin.py,sha256=OOv0QKYqhDD2O4X3HQx3gFFQ-CC7hSLnWuzZnQXeiiA,115 +django/__init__.py,sha256=S84JZFEH3dIq8PKB-ufoTOa0mgbfcmDWd_JB9MyNRmw,799 +django/__main__.py,sha256=9a5To1vQXqf2Jg_eh8nLvIc0GXmDjEXv4jE1QZEqBFk,211 +django/shortcuts.py,sha256=MA8fTTdbsz58DZV7_aD7ateNi9H_dYwobxHMAevyf94,5588 +django/apps/__init__.py,sha256=t0F4yceU4SbybMeWBvpuE6RsGaENmQCVbNSdSuXiEMs,90 +django/apps/config.py,sha256=kJMPbuGia8AIZ3HKEBsLBC2El0B3NmqRxSceAk6ZLuo,8711 +django/apps/registry.py,sha256=8n9sZPKefWk7i5pYPYcBuge9NymdukwpR2gLsJNvHlc,17558 +django/bin/django-admin.py,sha256=FWxg_nmLPNGqXwSMw0QvZsKNQsiVBHrSsNfgALIXqQ0,128 +django/conf/__init__.py,sha256=0zwFDSYXDOB__3cU9u2Fs6ZO5jKOIO_aJQcvqm5P0Dc,9493 +django/conf/global_settings.py,sha256=xdNBxw207BRGoonyAoEEqFogYeJa5htrGTOUeIYtwQc,21958 +django/conf/app_template/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/app_template/admin.py-tpl,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63 +django/conf/app_template/apps.py-tpl,sha256=lZ1k1B3K5ntPWSn-CSd0cvDuijeoQE43wztE0tXyeMQ,114 +django/conf/app_template/models.py-tpl,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 +django/conf/app_template/tests.py-tpl,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60 +django/conf/app_template/views.py-tpl,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63 +django/conf/app_template/migrations/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/__init__.py,sha256=BObHgz3YwhNajFQXefNvt9xcGCb5Zub1IXwW8-z6nV0,12634 +django/conf/locale/af/LC_MESSAGES/django.mo,sha256=PdT1ZX8UzPBcdhhjpLPEa4p27pyTLd9M9wOsJHchEJ0,26389 +django/conf/locale/af/LC_MESSAGES/django.po,sha256=pVQ0uXZJSnffIq0PoYZiTj-zQoLE0cywfzNx5A_YHt0,28407 +django/conf/locale/ar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ar/formats.py,sha256=nm5cnBh1YYjwD4eydBZ5AoknwN54piwrpB25ijpDT-o,696 +django/conf/locale/ar/LC_MESSAGES/django.mo,sha256=6cugqE9KpudwHt4yr_qBqazc-WNVth60LPfSrEnekIQ,30712 +django/conf/locale/ar/LC_MESSAGES/django.po,sha256=9tVjHdBZa3DDYWeHGdwaHpik-RbDTf3PFZl90iEDgNo,35055 +django/conf/locale/ast/LC_MESSAGES/django.mo,sha256=kmN-K4eQG_EvU565NnThO5qSkfcIMLXizk57RoM0YmM,16665 +django/conf/locale/ast/LC_MESSAGES/django.po,sha256=WnsaXWzvgTohaW7h5L6H5FG7QM8y5FifzB3GaahFLQY,23619 +django/conf/locale/az/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/az/formats.py,sha256=kHDIAAKnVH6nGVRLx4GeztAqeMJ5URMZaMGbtPjUDRA,1191 +django/conf/locale/az/LC_MESSAGES/django.mo,sha256=F65C89ufBAcO_XAdDJojR5Hexh2pXkXEKukV5BPLnCE,26630 +django/conf/locale/az/LC_MESSAGES/django.po,sha256=wT7AS2hDvVDzL6rvTlOMkE_Re5QV-8-uU9YZTxa3yWg,28515 +django/conf/locale/be/LC_MESSAGES/django.mo,sha256=E-Qz-U_GunEhxGnOSbb93aKkY2-QWJkd5OwjYTgiiI4,34765 +django/conf/locale/be/LC_MESSAGES/django.po,sha256=sHrLo3kO2dzfmlV743CH9KELtgRbXroQg-qcnJgAa_c,37039 +django/conf/locale/bg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/bg/formats.py,sha256=iC9zYHKphMaSnluBZfYvH1kV5aDyl3ycsqVjxOoqfOY,705 +django/conf/locale/bg/LC_MESSAGES/django.mo,sha256=oSaycuek5hekuOlUDZvgBWiC8pprSjVlhsPyQqnF2Ss,29687 +django/conf/locale/bg/LC_MESSAGES/django.po,sha256=STgBTki870oeyGqYyPPlyg4WmkdzlDvAUAhsBwHsWTs,32975 +django/conf/locale/bn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/bn/formats.py,sha256=INeNl0xlt9B-YJTkcdC2kSpJLly9d5AKT60GMyS-Bm4,964 +django/conf/locale/bn/LC_MESSAGES/django.mo,sha256=K7EKhxgCWLfWGA8MenkboQ_pNwo45lAkwrZkGrjIc-c,17250 +django/conf/locale/bn/LC_MESSAGES/django.po,sha256=CUr8W_emf9KSw8z-F26P7drK6z_CCovR9AjWycLpAP4,26693 +django/conf/locale/br/LC_MESSAGES/django.mo,sha256=AFyre_o6eLTF8GGkxxjt01RruZs3WLBQEs22Msi82og,15435 +django/conf/locale/br/LC_MESSAGES/django.po,sha256=7atq8nOYrgQn3sE626n_WFf3LtwR3UfVoJA9AxTLmYk,24055 +django/conf/locale/bs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/bs/formats.py,sha256=NltIKZw0-WnZW0QY2D2EqqdctUyNc8FEARZ1RRYKtHo,705 +django/conf/locale/bs/LC_MESSAGES/django.mo,sha256=DKLskkhih8rc42NtUXt-OZXD7r983w9Ddc4qSmakFis,11073 +django/conf/locale/bs/LC_MESSAGES/django.po,sha256=H4rrXQrd0ph_bHUvxgncbH29mhwtm2__XGo7QhH-ROY,21671 +django/conf/locale/ca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ca/formats.py,sha256=rQJTIIy-DNSu0mASIoXLHWpS8rVar64zkJ-NTM1VMTM,951 +django/conf/locale/ca/LC_MESSAGES/django.mo,sha256=kkUhfPNHIlCUH4rjpX14_IFm4e2i9vsrixLrxvcji7E,26667 +django/conf/locale/ca/LC_MESSAGES/django.po,sha256=-IAbFy3EMT0UY_DJgWoQ_pubV9g3ONnRwP_-pii5apQ,28758 +django/conf/locale/cs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/cs/formats.py,sha256=SwI-7bIW0Hc1K8G06IDOuZZ1rocqvtrufcpFdBPuq3Q,1637 +django/conf/locale/cs/LC_MESSAGES/django.mo,sha256=SFQspVDw2FohlraXBMg_ILQu5RCTzc05Ac3Kh1t3UBU,28343 +django/conf/locale/cs/LC_MESSAGES/django.po,sha256=2ebhRfPjcUbFaT0luT_3YSXeqalI74DSPfdIZMX1FGk,30760 +django/conf/locale/cy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/cy/formats.py,sha256=Ukvq4OBLyWTtkeaC8JuX4BJwCzP6BrJE2REEIuh3YWE,1757 +django/conf/locale/cy/LC_MESSAGES/django.mo,sha256=CJL04VXl3vjRWff93fzWDLeEJPw_Il7G5YzjCHdZZok,22280 +django/conf/locale/cy/LC_MESSAGES/django.po,sha256=C14r9gUOnCV5fNb4YZ-NN-fnLlZl1xHBP3H0tu-LgRk,27045 +django/conf/locale/da/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/da/formats.py,sha256=jquE6tLj9nOxcGtH_326w57sH9BKhP4BKtPz6eCi4k8,941 +django/conf/locale/da/LC_MESSAGES/django.mo,sha256=SsHhtghtrU3u3lRIcqpjJtMfQMhb0EdsxwR9RX2-So8,26075 +django/conf/locale/da/LC_MESSAGES/django.po,sha256=dwEwUdqqt2_MbqNGgIJplc3ayb4Z8AqLoGY2_04Gd_8,28152 +django/conf/locale/de/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/de/formats.py,sha256=bbYv_pvU7CcgAK7uwsLP33d4WJKEJ3nHyFjOGoLRSbk,1035 +django/conf/locale/de/LC_MESSAGES/django.mo,sha256=A26uQBVKkIjroEnSsUbwNG57ZkKwvN-hr7Tozl95SjA,27406 +django/conf/locale/de/LC_MESSAGES/django.po,sha256=iVFNqe5Mtn808PEo9_0fy47hiextwdEPfNPyiFOtg-c,29539 +django/conf/locale/de_CH/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/de_CH/formats.py,sha256=Qyry8mSDw2bDA_qGLNA7uWMCD1xMHe7K-5zORrHYF7E,1379 +django/conf/locale/dsb/LC_MESSAGES/django.mo,sha256=okTzL_pawrss_WuJ0fTP0NV2yB9Z1UbNN7UXZxMSPtM,28798 +django/conf/locale/dsb/LC_MESSAGES/django.po,sha256=LkRziiXfT24bg7tX7uXKN0B3oOl2aEDsJAKFSy-gGoc,31019 +django/conf/locale/el/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/el/formats.py,sha256=i6NoGblrfzTMa8YB56ZXwZITwqh1XmVi8TE8a6REOCU,1387 +django/conf/locale/el/LC_MESSAGES/django.mo,sha256=QPWjy3tU8e59mEO_4pGYHQDO5qvtu4-FtP4sbVj0YJA,34441 +django/conf/locale/el/LC_MESSAGES/django.po,sha256=NBgkyK5cIPc8WOnKBJEn7apqiaF9HZ6-hNu4mHg0eO8,36885 +django/conf/locale/en/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/en/formats.py,sha256=QAMybGqJETPG_vx3kQM4UGyaOffkx5no1dqpU9ri9cc,1750 +django/conf/locale/en/LC_MESSAGES/django.mo,sha256=mVpSj1AoAdDdW3zPZIg5ZDsDbkSUQUMACg_BbWHGFig,356 +django/conf/locale/en/LC_MESSAGES/django.po,sha256=HrTXWm-SbDAWr9fEj3bHLUJ1jbPJDEgR7c3I4E3vjBw,28517 +django/conf/locale/en_AU/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/en_AU/formats.py,sha256=ahNtDcF-uKEhsa8J5V2RPn80RCZJIpxSEc2BMEAljKE,2052 +django/conf/locale/en_AU/LC_MESSAGES/django.mo,sha256=vx8-wkZxPq-WseGghwXuLAK5MdDsRScKnrgBATVarwc,16288 +django/conf/locale/en_AU/LC_MESSAGES/django.po,sha256=-9v7S5GrwT9045EePAWwUIqtXmOo_9W9dRQ6kFsCBmQ,23221 +django/conf/locale/en_GB/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/en_GB/formats.py,sha256=qtvBeKK2jv3dTETbbBJDYeFbgTXmAkQsRkyOzR2FGIo,2052 +django/conf/locale/en_GB/LC_MESSAGES/django.mo,sha256=whAV7H3YTMcdt-gFyKY5naykTaV19x1gZoO8SJh2_TI,13133 +django/conf/locale/en_GB/LC_MESSAGES/django.po,sha256=vpqOmBh0ccf7P5-lcwFgxUhCJw35BWi39aALjmEa5nY,22060 +django/conf/locale/eo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/eo/formats.py,sha256=iemUtasv_36Z5WlKy9bSWGzptkBDxsB_MeCBaDqp3W4,2270 +django/conf/locale/eo/LC_MESSAGES/django.mo,sha256=iA9YhYlxq3qn6crp5T45qpMk8nGoed_t5T1oJmnXOV8,26087 +django/conf/locale/eo/LC_MESSAGES/django.po,sha256=2v65pkCQOvPkcTetBe_G-XTrQHivQWCL9HXSiDx6z3I,28260 +django/conf/locale/es/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es/formats.py,sha256=Z-aM3Z7h7Fjk2SAWKhnUYiuKbHpc7nZZ3-wnelK0NwI,949 +django/conf/locale/es/LC_MESSAGES/django.mo,sha256=4qsEQw1K5MumsbKQvv8DC9WQtGRQSGfHOrKyxtgygx8,26778 +django/conf/locale/es/LC_MESSAGES/django.po,sha256=C1fCJZCswMjw2DYwNmGrQsYheZL9FjRWjDuLTIiDy4I,29588 +django/conf/locale/es_AR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_AR/formats.py,sha256=wY64-6a2hajRveIgJLpkKES_v-QejkkgExdnnJdYN1E,935 +django/conf/locale/es_AR/LC_MESSAGES/django.mo,sha256=pkjQMmIWFgJ2CYTJbxnc93Nvcq-priOH17pFO3KrhKA,27233 +django/conf/locale/es_AR/LC_MESSAGES/django.po,sha256=Nl4OM_ypL7vXKBgMe6JY8J6YMQj2SfWKUFhBdV5CcOY,29171 +django/conf/locale/es_CO/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_CO/formats.py,sha256=kvTsKSaK7oDWK6a-SeO3V3e__64SjtDBMWoq0ouVDJ4,700 +django/conf/locale/es_CO/LC_MESSAGES/django.mo,sha256=bXSa4kJtVu9xeQOFgP7RTfirJgEynWk4R32KSKjEezM,22791 +django/conf/locale/es_CO/LC_MESSAGES/django.po,sha256=8X_pdt0Amtvbw3AZUE_fKMy20ItYR-zS1caqnHxKjIE,26533 +django/conf/locale/es_MX/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_MX/formats.py,sha256=tny9CPrJJV5qRJ_myuiQ8fMfg3fnNtv3q6aOSxLdK0E,799 +django/conf/locale/es_MX/LC_MESSAGES/django.mo,sha256=0WYdCPgyC0XpF8to_bbyw__IRA5LGj8izt8DoCH1m6I,15095 +django/conf/locale/es_MX/LC_MESSAGES/django.po,sha256=rwJvZGP-6uQX1bvQSW4pVE4y4dfriVZOCfkWRzC9QBI,23042 +django/conf/locale/es_NI/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_NI/formats.py,sha256=QMfHoEWcpR_8yLaE66w5UjmPjtgTAU7Yli8JHgSxGRI,740 +django/conf/locale/es_PR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/es_PR/formats.py,sha256=mYKWumkfGElGDL92G0nO_loBoSOOFKs0ktsI3--nlLQ,671 +django/conf/locale/es_VE/LC_MESSAGES/django.mo,sha256=93zneQv56yHv9DfaIJ0cIv8wBk_E8RCjUgAZYHgfdYc,23797 +django/conf/locale/es_VE/LC_MESSAGES/django.po,sha256=m5bxw3vZNZwDNt5riWNjAqzgYFsMS2PM124ek3JALus,27070 +django/conf/locale/et/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/et/formats.py,sha256=kD0IrKxW4AlMhS6fUEXUtyPWfsdLuBzdDHiEmdfzadQ,707 +django/conf/locale/et/LC_MESSAGES/django.mo,sha256=yeYl_ISf5h1aXOWUWWF_jk4VKDrcdpt0RgxzJrspF64,24191 +django/conf/locale/et/LC_MESSAGES/django.po,sha256=8ooYBubOrtFkgdAZ22OyMc6KQwwk5PNOGGZ0HYDIpNg,27406 +django/conf/locale/eu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/eu/formats.py,sha256=R-Ex1e1CoDDIul2LGuhXH5-ZBsiRpTerqxqRAmB8gFM,749 +django/conf/locale/eu/LC_MESSAGES/django.mo,sha256=35se1szmuv6UW9flVE5CHy34laOvPhcGgNDmyRZSlWE,26371 +django/conf/locale/eu/LC_MESSAGES/django.po,sha256=aE3SnGoSOVdgHbL6HdmuYWxh5KmeCZxSc5z59Y58yn4,28570 +django/conf/locale/fa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fa/formats.py,sha256=RCDlj-iiAS7MVgWwOFSvQ_-QROhBm-7d8OP6QhkcGZw,722 +django/conf/locale/fa/LC_MESSAGES/django.mo,sha256=FtnxlcyExAxzTRg4UhpKmoNRRy1OH_Ogj1O3qAvK0Qo,30916 +django/conf/locale/fa/LC_MESSAGES/django.po,sha256=Es7wgkOljcbihnH4O82DVyHxrYBFZVXIwEGqX5O2sjU,33247 +django/conf/locale/fi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fi/formats.py,sha256=L4-Y1nX-OwKv__oN5PVgRq3P1uJ8Nwuf72zkd44QiS0,1325 +django/conf/locale/fi/LC_MESSAGES/django.mo,sha256=7XRs-YWV2HX2qqjEZbmUlkcnWkmMhWLoF9G0fKuzeyk,26301 +django/conf/locale/fi/LC_MESSAGES/django.po,sha256=hq9Iivjsd3zM6uiYX59pS4peKqTM1wmJpcbGrrn5siM,28551 +django/conf/locale/fr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fr/formats.py,sha256=fcbOaNmoQWU5O87YsviFsqQ1SXaRZ0opsCvgygCklqE,1389 +django/conf/locale/fr/LC_MESSAGES/django.mo,sha256=x58bCqzU3NFIghpl7npnA6ZGlEu1XEQzm383X2T9634,27684 +django/conf/locale/fr/LC_MESSAGES/django.po,sha256=mlxmIL742Ln3ti3jeGFwU8LOABrYyTQTyBVzPxi1Q-k,29809 +django/conf/locale/fy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/fy/formats.py,sha256=mJXj1dHUnO883PYWPwuI07CNbjmnfBTQVRXZMg2hmOk,658 +django/conf/locale/fy/LC_MESSAGES/django.mo,sha256=N13eBeS5pewXpx3yIAwiqB8ISjw-J2ku99dncOnz_lY,2525 +django/conf/locale/fy/LC_MESSAGES/django.po,sha256=GyR8MjHB6fS3NuxDCsNegt9rZPyst5pMqs0i0WWIXUM,19283 +django/conf/locale/ga/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ga/formats.py,sha256=Kotsp4o-6XvJ1sQrxIaab3qEW2k4oyPdJhcqvlgbGnU,682 +django/conf/locale/ga/LC_MESSAGES/django.mo,sha256=Iw1dcW6tAoIFBgjFAWyfXH7lXz__fRrS7cktYtcQ_IM,15097 +django/conf/locale/ga/LC_MESSAGES/django.po,sha256=Adp1JYadvckm_A4nlXZGM-hPAz_8bcdNw08BlEQNorQ,24000 +django/conf/locale/gd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/gd/formats.py,sha256=tWbR1bTImiH457bq3pEyqdr4H2ONUdhOv2rZ2cYUdC8,715 +django/conf/locale/gd/LC_MESSAGES/django.mo,sha256=6smT7_jkJK2oQTbvfi-crzN6nD5mX6LAlDduSUOd75A,29716 +django/conf/locale/gd/LC_MESSAGES/django.po,sha256=Y9d4Ry4CqmzIBgqrdAf3aoCVs6MuJxzEilxRROTsiYU,32089 +django/conf/locale/gl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/gl/formats.py,sha256=Tr41ECf7XNn4iekgPGUSKI6-lDkcHj1SaHno5gPa5hw,757 +django/conf/locale/gl/LC_MESSAGES/django.mo,sha256=sNVgEfEr_q6kth4MHJvBOZ34H-LkrkiFfjBsfmKA9fc,15342 +django/conf/locale/gl/LC_MESSAGES/django.po,sha256=6Zu_Oi6Xa7igkyjA8jp0BxvkLIYgguXnGFcRwPG3uO8,23283 +django/conf/locale/he/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/he/formats.py,sha256=-3Yt81fQFRo7ZwRpwTdTTDLLtbMdGSyC5n5RWcnqINU,712 +django/conf/locale/he/LC_MESSAGES/django.mo,sha256=2Ucp8PF2To6LwRgcCom3wlY--aUM4fk0yKB7kZA7Hrc,30609 +django/conf/locale/he/LC_MESSAGES/django.po,sha256=gVyChpm3EdPUYiTMx8-fGqAseDLwEL_L-nlgln2-VKE,32825 +django/conf/locale/hi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/hi/formats.py,sha256=dBY0JvWinGeNiDy4ZrnrtPaZQdwU7JugkzHE22C-M0A,684 +django/conf/locale/hi/LC_MESSAGES/django.mo,sha256=4v9ljgKHyBd4tqUr_5CBNS8rNtLsFERsFOK-zx8kYvY,19270 +django/conf/locale/hi/LC_MESSAGES/django.po,sha256=Ennlas9mqLL6pqYRXhEHK8OPyXNq9I0aKoizn0aeKLk,27774 +django/conf/locale/hr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/hr/formats.py,sha256=XfnsPwZiQfga6RwviGwazNIEU0HAjaj5as_nOk-Frts,2041 +django/conf/locale/hr/LC_MESSAGES/django.mo,sha256=Y5qAfjbubIQDJIbkJzw7tfzUsuIlEYUlsvGfvEYiFP8,24409 +django/conf/locale/hr/LC_MESSAGES/django.po,sha256=iOHjAFvvu8OiBeh2IukSFXEkL-Uqr_dDEKKCAlvGtjo,28207 +django/conf/locale/hsb/LC_MESSAGES/django.mo,sha256=QZ1KaImLMOW0brSZeKFQK2bSuDLrMtFT5Ok8YPSdeK4,28550 +django/conf/locale/hsb/LC_MESSAGES/django.po,sha256=bwhH5UUOlRFbVjcj0mEOqxOhp80EuxmMz0qWIdaZDJg,30750 +django/conf/locale/hu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/hu/formats.py,sha256=l-CD1wEvLKcWMTyYIvnPcA6eQYE14-elkQ4jkEtYSZk,1052 +django/conf/locale/hu/LC_MESSAGES/django.mo,sha256=LEBClk35Wyf8myh7JkvqLT28zAK-9NUlMOcBjeFbmH0,27364 +django/conf/locale/hu/LC_MESSAGES/django.po,sha256=WJyHeY3plRpEmMN6haSULQJc52daK2s54T2Jix5upnQ,29541 +django/conf/locale/hy/LC_MESSAGES/django.mo,sha256=HWkyBxPL9p2r1j3skftd0v2J9R_O7sRn8sazj5lWN78,27713 +django/conf/locale/hy/LC_MESSAGES/django.po,sha256=_gXKlEOS74kKHypQqBVtsq8oNae7yEFOOMXfOFR_J3g,31567 +django/conf/locale/ia/LC_MESSAGES/django.mo,sha256=uctHDWY1qKSlNlcdaEGswjWkPYy3BDJawUbAfEddk4Y,23125 +django/conf/locale/ia/LC_MESSAGES/django.po,sha256=ckopqh_kKLtaJC9upyGY4hh9NSkF-iHsZOm9sur4-A4,26641 +django/conf/locale/id/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/id/formats.py,sha256=d6FIM_bRvKVQtOmS1p_Le81y7UqnS5zqfjtq-krGqzo,2070 +django/conf/locale/id/LC_MESSAGES/django.mo,sha256=pJb0w1JOHkn5p9sBadwC6owUQEXsAKyKI7wpMjbwOd0,25925 +django/conf/locale/id/LC_MESSAGES/django.po,sha256=Bdq_oicrrmLto7paQNC-yvBglS1fGw3flRHi7lNKTrg,28000 +django/conf/locale/io/LC_MESSAGES/django.mo,sha256=1PUSoRgjcrjc8OHIvkjAAh0xtSkSaafGZuO6SYkx5CY,14965 +django/conf/locale/io/LC_MESSAGES/django.po,sha256=aURK_SeTtqM8ko_kI_AM5jWyqKAb1iuqNvOKQ1GQ0SE,22892 +django/conf/locale/is/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/is/formats.py,sha256=4BbmtZUfTOsQ818Qi6NEZ54QUwd2I8H2wbnaTe0Df74,688 +django/conf/locale/is/LC_MESSAGES/django.mo,sha256=Cz2_MRbLOArWsezh8fKEGpIEsQqUoSWg_kjEKYPVhuw,24466 +django/conf/locale/is/LC_MESSAGES/django.po,sha256=7MEcOAKRG1v3Z-E6sR9Xh2of5cf_NQy4QDo_S3kvF2E,27899 +django/conf/locale/it/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/it/formats.py,sha256=QK1cnZ4b420JFItMk6tFibOztIalSseiMMFSyoDMco0,2017 +django/conf/locale/it/LC_MESSAGES/django.mo,sha256=Dn15KQTQaJhoxPiDMAnyrbzyaDbEzeL7BsZDl31rFng,26635 +django/conf/locale/it/LC_MESSAGES/django.po,sha256=wvLu9ylPEWS5jOCkLgNhy6DdQMumPWPCX6Faec-tnJ0,29109 +django/conf/locale/ja/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ja/formats.py,sha256=V6eTbaEUuWeJr-2NEAdQr08diKzOlFox1DbugC5xHpk,729 +django/conf/locale/ja/LC_MESSAGES/django.mo,sha256=-Ld36PNPNKdCl5wJQO8mTZtbASP3KB3PpjR_mkO7shg,29182 +django/conf/locale/ja/LC_MESSAGES/django.po,sha256=zsYr7_wqU1_jgH6ltzbjuU0HTE4MP8And4_NugmF6hQ,31180 +django/conf/locale/ka/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ka/formats.py,sha256=He8e8V8LwpCB9R-oZ3xq6XF3OhySg0wIqb16mtME4MQ,2115 +django/conf/locale/ka/LC_MESSAGES/django.mo,sha256=Hf5OQ-xCo_uenldyxOuf7JUymEpBc10QoVW95DOvOqU,29673 +django/conf/locale/ka/LC_MESSAGES/django.po,sha256=mr35hdmo9nW4wnsnwO02Sn4qGhw1dqNsVbMyf9xrzuM,35053 +django/conf/locale/kab/LC_MESSAGES/django.mo,sha256=Y1q3K0U7gFl_0wxVd9BnpaUK8NjBajk_T8lFgyDC_ks,7200 +django/conf/locale/kab/LC_MESSAGES/django.po,sha256=iyxoGXMzvIyj3FedGLNrDDQqv4qRunq_2BZ8_FCOcoY,19730 +django/conf/locale/kk/LC_MESSAGES/django.mo,sha256=q0Un1j5JAPq9T5d6AK-Ks-RlS5c4tidXf0AmuvxvjB0,13916 +django/conf/locale/kk/LC_MESSAGES/django.po,sha256=r9W3U7pAlSsLFL7x9NZLSawT5KvJXJY2W0-ebyv0EG4,24156 +django/conf/locale/km/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/km/formats.py,sha256=o0v-vZQaH-v-7ttAc0H0tSWAQPYQlxHDm0tvLzuPJfw,750 +django/conf/locale/km/LC_MESSAGES/django.mo,sha256=IkYee7gjLxKUUaJ1xrWlm-mGFy-1Q5YQTfOcKaqsdG8,7284 +django/conf/locale/km/LC_MESSAGES/django.po,sha256=BUyjSCQne8sySq1dLsqmKCzCJMja562ocRYcNiZOKPk,21508 +django/conf/locale/kn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/kn/formats.py,sha256=FK0SWt0_88-SJkA1xz01sKOkAce5ZEyF-F0HUlO5N4k,680 +django/conf/locale/kn/LC_MESSAGES/django.mo,sha256=BAaiqXIUfzFjrsvQiyp6zpfUXC28KsWRzCGieZzHzMQ,18634 +django/conf/locale/kn/LC_MESSAGES/django.po,sha256=4LnQc0QMFjrYi6a68ZvzwXpEhHE1BYuKB7IMdTwvxEE,28689 +django/conf/locale/ko/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ko/formats.py,sha256=S2EcLIPMbVxRuWnRzWp2R7VzIVBaa4t6XqliTILwM4I,2255 +django/conf/locale/ko/LC_MESSAGES/django.mo,sha256=-tQKUOCJsq6yDeiQRgWo96VZYJaXeLufTYi8OC1r2XE,27294 +django/conf/locale/ko/LC_MESSAGES/django.po,sha256=bJqRw7f021r7rr3Tka7eTVrXWq-8yznBm_0AXdRTOcg,29665 +django/conf/locale/lb/LC_MESSAGES/django.mo,sha256=3JKBA-zIROxVEJFv8eoUKrVoRFjbY9bBk16jQF7Wp3s,8069 +django/conf/locale/lb/LC_MESSAGES/django.po,sha256=v1_uBQpRI8fT88whqpah66AmaJG_uIX65_sRZEN2LPg,20131 +django/conf/locale/lt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/lt/formats.py,sha256=wnele5vB2HN-LvOli8K7tGZQUJlSmQW_ZhgoULgqa0o,1765 +django/conf/locale/lt/LC_MESSAGES/django.mo,sha256=o8yCAEvftNnmhwCkIs1f3lQMqlHkyRfdulcYf0e3dE8,28609 +django/conf/locale/lt/LC_MESSAGES/django.po,sha256=ji18ceHzldbfAoRv9ON6mpCTxC3-ND9I3g9Y9Zd3AmE,31186 +django/conf/locale/lv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/lv/formats.py,sha256=NodzlrtA6_0k7bmCs6a9-TjhAriGZcTT12M1-aN-j-4,1841 +django/conf/locale/lv/LC_MESSAGES/django.mo,sha256=3D8YQDDCbMEPy3R1EVgUxzjYar1f50sDmVvDlLIVhpY,27473 +django/conf/locale/lv/LC_MESSAGES/django.po,sha256=gq9OZhMMlWW31HSBZgeaQxSXKRwvSTqSHb4wRwr4xfE,29817 +django/conf/locale/mk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/mk/formats.py,sha256=svukojExoWux5uk8K1W3NhbQUvEbWTht5_HybAmTaiU,1677 +django/conf/locale/mk/LC_MESSAGES/django.mo,sha256=GqcYWwCPmQZeBa9sxroK0LQYqlpwE9CPc088bpmv2Kg,29431 +django/conf/locale/mk/LC_MESSAGES/django.po,sha256=VZT-VhVOlcQaJKau3giyN24XA4GG1aLR6U9e-dDmJWQ,32812 +django/conf/locale/ml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ml/formats.py,sha256=QAMybGqJETPG_vx3kQM4UGyaOffkx5no1dqpU9ri9cc,1750 +django/conf/locale/ml/LC_MESSAGES/django.mo,sha256=95ylg5x9-DH6OrRGVAxMEx3sDsHzXRpsB6K7DDhHxsw,36981 +django/conf/locale/ml/LC_MESSAGES/django.po,sha256=96rZup0Fod6fjfDbDBEBZTDvPLexo16q6XBb3LY4Yck,40425 +django/conf/locale/mn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/mn/formats.py,sha256=ET9fum7iEOCGRt9E-tWXjvHHvr9YmAR5UxmEHXjJsTc,676 +django/conf/locale/mn/LC_MESSAGES/django.mo,sha256=DODflchN0ARw3eKToufj-afz-71ziZhZF6iWxXDPI_E,31170 +django/conf/locale/mn/LC_MESSAGES/django.po,sha256=ATP2UnTppKZsT8Tpi1TjFd6Imo9mT_O3O4cX990dZ6M,33395 +django/conf/locale/mr/LC_MESSAGES/django.mo,sha256=Jy_VbHVKhgNj9MSmdLv3ouVYXYjJ_JFTn8_zmYoYcyg,1652 +django/conf/locale/mr/LC_MESSAGES/django.po,sha256=yyPm1I1uqXG8VkS6yTrwECvi6p07RRep5h9iXx_v7eQ,18910 +django/conf/locale/my/LC_MESSAGES/django.mo,sha256=5pYLrTOipARNLlpG5dp0VZYJUQNqdt0vK2blo1x6keg,2650 +django/conf/locale/my/LC_MESSAGES/django.po,sha256=IVACCaTwYgAANqlcrthvSLFK9zvlOLhJTFRWCRBm11U,19193 +django/conf/locale/nb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nb/formats.py,sha256=n2C0JR5Y8JiNXapfAjMHVnaxBL0OhPOwGquca37vI4o,1701 +django/conf/locale/nb/LC_MESSAGES/django.mo,sha256=LgXMq9SNrvX3BB3Ja7LRp1aaJ6Rgk4w47IgnE91WUdo,25948 +django/conf/locale/nb/LC_MESSAGES/django.po,sha256=sZgKv7flqtksUHWMN-ib0WJ3n2zQb98B3NmwxolFnhM,28165 +django/conf/locale/ne/LC_MESSAGES/django.mo,sha256=oFOTWs82az7Vddh8TNtqAC0qgOBbciwC13Xtf2sqcXc,31196 +django/conf/locale/ne/LC_MESSAGES/django.po,sha256=cvlhX4j7aXxp08ZCZHNaiPX9HmvjMoi0iXl5qJL7-oY,35106 +django/conf/locale/nl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nl/formats.py,sha256=kMY8SpEDMdvSD3Bcluz-EdSYdV3VhgTs30Z2qIpN_wM,4407 +django/conf/locale/nl/LC_MESSAGES/django.mo,sha256=N_qx_zK--FQ8RvRR2lsetBLEtohcki9LrrpatiHav0g,25925 +django/conf/locale/nl/LC_MESSAGES/django.po,sha256=KkgdXeKpH128NM804nfWD3mqoFsoOUR0oSTZPg6iOUM,28684 +django/conf/locale/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/nn/formats.py,sha256=UpOmzU0aFIh2MrRZ0PuY4LZ2mXe15SL-_Z_yAVM3fxM,1745 +django/conf/locale/nn/LC_MESSAGES/django.mo,sha256=yfZvfqfpLCx3lV_LMd3Rw0Y4TTUvJQznZGwmf46nhnY,14256 +django/conf/locale/nn/LC_MESSAGES/django.po,sha256=JguzOlZ92jdHfp1eV3U5zKyxTaphpSjGSxXAIxSEspA,22522 +django/conf/locale/os/LC_MESSAGES/django.mo,sha256=GouuR0wncfpOVJurgDeTkrdKvzaH1iZxr-4IsXVEd6Q,19250 +django/conf/locale/os/LC_MESSAGES/django.po,sha256=DFnTZKUg_hGp2Pu8lJ0_vfZONAUl8JpK8UOhQtWFWR8,26392 +django/conf/locale/pa/LC_MESSAGES/django.mo,sha256=MZHSQcl584TTogQpYXzE1o_AqfZlwpvkb1CeXksVseI,11501 +django/conf/locale/pa/LC_MESSAGES/django.po,sha256=-mzScJHrkxIMp4tbbd8NA1EG6V2_pail2PYhaJ8FWxU,22591 +django/conf/locale/pl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pl/formats.py,sha256=UjzylphDLBOy4IlFY3SAvaTIwxsjKz41wZMxUDzM7KA,1082 +django/conf/locale/pl/LC_MESSAGES/django.mo,sha256=-AKiAKdQ_HlnhfIObKljYjhnY1h-jvCvOnbiosrgMhc,28877 +django/conf/locale/pl/LC_MESSAGES/django.po,sha256=x-goz7cZnpiUxwNNXJbOzDosKBruXF5D8jgA1JV0MoE,32117 +django/conf/locale/pt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pt/formats.py,sha256=B7_tX50445cz2hiLJBid1vY0z9BDYouTAaCXLwr117Y,1652 +django/conf/locale/pt/LC_MESSAGES/django.mo,sha256=w4VlviMTuH2lGdpWxvi3ZlHSowcLzhxugR38oIuPA5Y,26396 +django/conf/locale/pt/LC_MESSAGES/django.po,sha256=W4bjTmIOsvK4QpNf_2NEhYR6OIx9MYUDIsbndWaa8nU,28736 +django/conf/locale/pt_BR/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/pt_BR/formats.py,sha256=46QDzg8pNMlw5MAs3U8Rj8SykK8Ck6SZBONk5_VzY2Q,1369 +django/conf/locale/pt_BR/LC_MESSAGES/django.mo,sha256=KIgQma7yqI0YWE7IEtt6FhQERveRoSQEtfdCdodvf9Y,26707 +django/conf/locale/pt_BR/LC_MESSAGES/django.po,sha256=AdhQBpCDQmIGT2Q2Fdba6L8qH9jNsvkuE1t12ew9n2s,29695 +django/conf/locale/ro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ro/formats.py,sha256=hpxpg6HcFGX5HFpypZ-GA4GkAsXCWuivMHLyyV1U2Rw,928 +django/conf/locale/ro/LC_MESSAGES/django.mo,sha256=ma3U3M3i5KWAoFFZmXpFwyTmt2EaRWE12h4d6BGkENs,27531 +django/conf/locale/ro/LC_MESSAGES/django.po,sha256=cTMIF4bOx7ZgipIb1PCagJvSnP4y9NmFAY4v8WPQkzg,29905 +django/conf/locale/ru/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ru/formats.py,sha256=wM47-gl6N2XbknMIUAvNmqxNyso6bNnwU11RzoLK3RM,1202 +django/conf/locale/ru/LC_MESSAGES/django.mo,sha256=B5UT1xP0cyCplkMWoL-XYtdDj5eAFjjQmROlwC5psQM,36963 +django/conf/locale/ru/LC_MESSAGES/django.po,sha256=Uqe3Hlrebp4r_QjLc3a685jLdleMemN0I0xHdpL-uV4,39891 +django/conf/locale/sk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sk/formats.py,sha256=uDeovJ6Oo39vxb_Y2EbwlqBh3F4N6D6EOpYzPMDH4yU,1108 +django/conf/locale/sk/LC_MESSAGES/django.mo,sha256=N8mxZSWdUs3AMRooC-aUYC8oKXcqy8bBivOX_qjl1UY,27960 +django/conf/locale/sk/LC_MESSAGES/django.po,sha256=rzE7u5RtBADW3FTd8PaKkWGRwTVf93Bib_jvoqQZTU4,30339 +django/conf/locale/sl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sl/formats.py,sha256=fChz1Gj0lUVg-BnLITgoKcUXKlRTesowYokrWUbdQtc,2053 +django/conf/locale/sl/LC_MESSAGES/django.mo,sha256=RnfBB1TUFbQl6Ux4fN2A06zGOQf6i0xT0Zbjkl5SLcw,27630 +django/conf/locale/sl/LC_MESSAGES/django.po,sha256=4xZ8TsVvDP1ex0ADRKhQOWLLeWJmEnLjh0q8JGL1k5A,30074 +django/conf/locale/sq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sq/formats.py,sha256=X7IXRLlVWmlgNSa2TSvshv8Vhtjfv0V1Okg0adqVl3o,688 +django/conf/locale/sq/LC_MESSAGES/django.mo,sha256=i6blaU6gB1y0cHDwdWCoMm4fFwSOPTPeUhTH0kUWTeo,26966 +django/conf/locale/sq/LC_MESSAGES/django.po,sha256=OnJeUUXu4HoSg04XbCriKhlBlGTuoWQq869-sbUJiJk,29013 +django/conf/locale/sr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sr/formats.py,sha256=SGrIbHa8LJdOV_nlmwShGOQ1Wz-l4lNpufHQsPMJcFk,1946 +django/conf/locale/sr/LC_MESSAGES/django.mo,sha256=lAZzH3a0Tq5HC8VjQ7-mrU2WIylbkoxPq6_uJrbSNOE,33073 +django/conf/locale/sr/LC_MESSAGES/django.po,sha256=hsS-pEmc3S3GtuNsd-qWLCjluKy3j4uxmXZ2iP9wgrY,35215 +django/conf/locale/sr_Latn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sr_Latn/formats.py,sha256=SGrIbHa8LJdOV_nlmwShGOQ1Wz-l4lNpufHQsPMJcFk,1946 +django/conf/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=eD7DcFzYWpfxvnbngcnBazlBPgJwaAtnB7JDfQ4S_hw,14941 +django/conf/locale/sr_Latn/LC_MESSAGES/django.po,sha256=87XW8LhBwQ2dFtqQnnDPA2sjGheqURIsaDUXMoCK_GY,23344 +django/conf/locale/sv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/sv/formats.py,sha256=25cpkzB06_S54wXu-yGNJ7_6zcsAH39KnvzlWnkzGlI,1504 +django/conf/locale/sv/LC_MESSAGES/django.mo,sha256=38HMVs_MIdAtnYhOTCTESTxkbEhmoXs3Y1PB0cH2Puk,26399 +django/conf/locale/sv/LC_MESSAGES/django.po,sha256=lbmJttaEIp-S_Gt97ZnabZyNBKIo0bFLqfsiv85esT0,28675 +django/conf/locale/sw/LC_MESSAGES/django.mo,sha256=ZHWikD3fPZeBsrQ7qg9iHfzEt5DoQU1rBXvMd5Wzdtk,14903 +django/conf/locale/sw/LC_MESSAGES/django.po,sha256=9BcGhrZMf5gJzw02YCt4QyUdQYVphHUb13oHKy9eTEU,22800 +django/conf/locale/ta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/ta/formats.py,sha256=LbLmzaXdmz4UbzNCbINYOJLggyU1ytxWAME3iHVt9NY,682 +django/conf/locale/ta/LC_MESSAGES/django.mo,sha256=UsBQWhTd5y0OBsH7Zr8cVX7NV7P6waHpc_0RcpWQPH0,7155 +django/conf/locale/ta/LC_MESSAGES/django.po,sha256=EG-DZKUybRWuFEQ8jHIf171sdnZzpjnbaDXJQuffRVo,21547 +django/conf/locale/te/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/te/formats.py,sha256=aSddq7fhlOce3zBLdTNDQA5L_gfAhsmKRCuyQ8O5TyY,680 +django/conf/locale/te/LC_MESSAGES/django.mo,sha256=h0T8JGVo0EzGXSbwDVWulpVs0PLJM0gfro_QTk5SHEY,13321 +django/conf/locale/te/LC_MESSAGES/django.po,sha256=G0x90aGtPjtouO99ZQMN9Nf-YW83d_qxMSc-7CrwhX4,24597 +django/conf/locale/th/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/th/formats.py,sha256=vBGsPtMZkJZN0gVcX3eCDVE3KHsjJJ94EW2_9tCT0W4,1072 +django/conf/locale/th/LC_MESSAGES/django.mo,sha256=Sn7J8bolyiK25-sCKvKHKosEQy2I07XNTLYSUD3zoG8,20155 +django/conf/locale/th/LC_MESSAGES/django.po,sha256=t7Rqy36VExXTYNYnDwhrNq7QElZZw1hRFw7JPgSAizw,28144 +django/conf/locale/tr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/tr/formats.py,sha256=38lfcqhKBQMUh9mXUMcTgpWMheP4hHryt3b9GZNxWjw,1076 +django/conf/locale/tr/LC_MESSAGES/django.mo,sha256=gOhMQ7TdqgzQF4ghundgsZt6C_kxIYZVVQsdV_cwp74,27131 +django/conf/locale/tr/LC_MESSAGES/django.po,sha256=w9hMpMKE_nwpzoE_F0TO4j3laNzbKNpDiXkxWG5b4FU,29388 +django/conf/locale/tt/LC_MESSAGES/django.mo,sha256=2YqPqclnPPiORixIWcuw2Ne-w_LzYjLsV3o1Ye1AQwo,15352 +django/conf/locale/tt/LC_MESSAGES/django.po,sha256=o4_JxmlTXHAEoSx6vHxiKiZP1va_aRT5kFxIjXZcjSI,24745 +django/conf/locale/udm/LC_MESSAGES/django.mo,sha256=eeu0nDatoybuYCF6z3hXG4XA1rs6FgX2x9d8r8cYc4Q,13564 +django/conf/locale/udm/LC_MESSAGES/django.po,sha256=61Shy8V_t2ChpP-ZehJ82iauo12bKnuVnNRkWg1844k,22914 +django/conf/locale/uk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/uk/formats.py,sha256=VOqr0IcT2ab42aP7FWAXMILV1KXBckqt44v0CKSpJHg,1361 +django/conf/locale/uk/LC_MESSAGES/django.mo,sha256=HzJ8-TLYxnCqWpgYqc-C2fWobXSbpJ3DqG2_G-sjQQA,35688 +django/conf/locale/uk/LC_MESSAGES/django.po,sha256=26-bekBlvSZ6w_ZzboEEYRjKZgKkhbhv_7MPB6XSkz8,38561 +django/conf/locale/ur/LC_MESSAGES/django.mo,sha256=TdYByXk7rMGxKyhaBpPX2tH8SaNJpRZKMYdiXDTGiOg,12566 +django/conf/locale/ur/LC_MESSAGES/django.po,sha256=HE5mzhoMdTYdTih4smcZV4N7BMjwiC7jE9urU1D1c8A,23108 +django/conf/locale/vi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/vi/formats.py,sha256=H_lZwBQUKUWjtoN0oZOxXw0SsoNWnXg3pKADPYX3RrI,762 +django/conf/locale/vi/LC_MESSAGES/django.mo,sha256=MDt-w99IwQWBwpqjtPagMXe6UlMGacU2w4PFw1vxYNw,19452 +django/conf/locale/vi/LC_MESSAGES/django.po,sha256=BJ50rmwgIa1K52YOcQ9AidcKx1h_Edw5rS-TDylAqUw,25483 +django/conf/locale/zh_Hans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/zh_Hans/formats.py,sha256=U-1yJketLR187TFCBAzgUCt0UlZNvCxoLgBkYhZz2Ts,1745 +django/conf/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=j4QEh-m0QVHCjl-34-LdufDogFT8G4hZ5opVXm381oE,25378 +django/conf/locale/zh_Hans/LC_MESSAGES/django.po,sha256=6SbePpwTiqg3KNK3YiqeaXS_A1N_qJuDQl7QSy1c9N4,27901 +django/conf/locale/zh_Hant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/locale/zh_Hant/formats.py,sha256=U-1yJketLR187TFCBAzgUCt0UlZNvCxoLgBkYhZz2Ts,1745 +django/conf/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=TEn43zMlXUa9XjkqvXOS98GB77ZNFl3IraNO1zppM1U,24865 +django/conf/locale/zh_Hant/LC_MESSAGES/django.po,sha256=XZABm4NMgxZEz3rfhu256fsk9D-kcHpBcgBbt-zbP-U,26676 +django/conf/project_template/manage.py-tpl,sha256=ytMiojzkr7Qg3VnkI9Hw6KPuozIpMULyOc0oTnqou8A,638 +django/conf/project_template/project_name/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/conf/project_template/project_name/settings.py-tpl,sha256=4JwYHW6nbDUufEkQOQjOY08slnLMETQAJ9dqr4PjsmU,3210 +django/conf/project_template/project_name/urls.py-tpl,sha256=vrokVPIRgYajr3Osw2_D1gCndrJ-waGU3tkpnzhWync,775 +django/conf/project_template/project_name/wsgi.py-tpl,sha256=OCfjjCsdEeXPkJgFIrMml_FURt7msovNUPnjzb401fs,428 +django/conf/urls/__init__.py,sha256=Lp9Zc17tRy3bVwULxq1_8qBloXbgmqiQiIzzbqkqDSk,402 +django/conf/urls/i18n.py,sha256=TG_09WedGtcOhijJtDxxcQkcOU15Dikq0NkLGVvwvCI,1184 +django/conf/urls/static.py,sha256=WHZ7JNbBEQVshD0-sdImvAW635uV-msIyP2VYntzrPk,886 +django/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/__init__.py,sha256=K5IZ6J5ujshspna6ubTvpFfTBjU7p8EhsbvW6G7fMwY,1243 +django/contrib/admin/actions.py,sha256=S7p0NpRADNwhPidrN3rKN_LCJaFCKHXX9wcJyVpplsw,3018 +django/contrib/admin/apps.py,sha256=p0EKbVZEU82JyEKrGA5lIY6uPCWgJGzyJM_kij-Juvg,766 +django/contrib/admin/checks.py,sha256=V_P4Hu_wuxcGf3RTDea32CBpQCbc0Mbyco6UdVAE1VQ,45411 +django/contrib/admin/decorators.py,sha256=jQS6FQ2PxaqGYTYNa4jdx-qSVPV9Uf5bRhbC9PF0BMM,969 +django/contrib/admin/exceptions.py,sha256=lWAupa8HTBROgZbDeYS1n_vOl_85dcmPhDwz0-Ke1ug,331 +django/contrib/admin/filters.py,sha256=7zHCG-Og8bTyhh3nd5cG8KTrzHUd4hNEcZdZpoW1Ye0,17465 +django/contrib/admin/forms.py,sha256=hDFBqCKLLp8_ea0T0gshsgUHw0RgUtNoHCp3Q5fkOhA,1001 +django/contrib/admin/helpers.py,sha256=rFT1Hdh44V0PPOVNRg3YYARAZtiR3UyidOziOrw6jKE,15375 +django/contrib/admin/models.py,sha256=EE_bi6_lSBYUsFgtPgaflgyA_8F4CXlEA-xJ8eDlN4Y,5607 +django/contrib/admin/options.py,sha256=2Htd4qWOFV9r_UuWGX38R4_rOk2WTAmEck783f4mIRo,92174 +django/contrib/admin/sites.py,sha256=xvaibbYlNfGlCdDIeSOnPy3fF7qLVrFMajzoEgLSVFM,20569 +django/contrib/admin/tests.py,sha256=eO-iV08qo6zrNuPibtb5hrQyByq20VDk0pjWSLYTXFE,7301 +django/contrib/admin/utils.py,sha256=9CykVdXQyaJL_fIz_00LiIqItXlD0O3b4Sf0ZOu9ut8,18271 +django/contrib/admin/widgets.py,sha256=yjkibTIrvxmHV7EABBI4wA3Nb2ChIpNgJSQToxKNpdw,17223 +django/contrib/admin/locale/af/LC_MESSAGES/django.mo,sha256=Wbc2ubHv3Zw-N7pIV46MHcjv3Cigaab7rPm8qzBvfQI,16245 +django/contrib/admin/locale/af/LC_MESSAGES/django.po,sha256=HcM8xRLWALn6F2Ynz1KgZl7SRq5zDI7BYI38ste4FcI,17622 +django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo,sha256=dmctO7tPkPwdbpp-tVmZrR0QLZekrJ1aE3rnm6vvUQM,4477 +django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po,sha256=1wwspqp0rsSupVes7zjYLyNT_wY4lFefqhpXH5wBdJM,4955 +django/contrib/admin/locale/am/LC_MESSAGES/django.mo,sha256=UOwMxYH1r5AEBpu-P9zxHazk3kwI4CtsPosGIYtl6Hs,8309 +django/contrib/admin/locale/am/LC_MESSAGES/django.po,sha256=NmsIZoBEQwyBIqbKjkwCJ2_iMHnMKB87atoT0iuNXrw,14651 +django/contrib/admin/locale/ar/LC_MESSAGES/django.mo,sha256=DhTZRYLGi98h9gmQfsIlAms0cCkm0nuozk-lFVNLNVk,17621 +django/contrib/admin/locale/ar/LC_MESSAGES/django.po,sha256=LMfZRZ8yjehdgcLh2HceynRhgDi_XzDEsWZWVXR5noI,19973 +django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo,sha256=gLwHSlr1xGvsbFO1S8mnqM-NVzCUQ75n-X1NCBeANe8,4959 +django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po,sha256=1lgw43gz9MCvcujDQ4eGUvo8Qn5DE2fGvSC_qOs5bEs,6200 +django/contrib/admin/locale/ast/LC_MESSAGES/django.mo,sha256=3uffu2zPbQ1rExUsG_ambggq854Vy8HbullkCYdazA4,2476 +django/contrib/admin/locale/ast/LC_MESSAGES/django.po,sha256=wCWFh9viYUhTGOX0mW3fpN2z0kdE6b7IaA-A5zzb3Yo,11676 +django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.mo,sha256=kiG-lzQidkXER5s_6POO1G91mcAv9VAkAXI25jdYBLE,2137 +django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po,sha256=s4s6aHocTlzGcFi0p7cFGTi3K8AgoPvFCv7-Hji6At0,4085 +django/contrib/admin/locale/az/LC_MESSAGES/django.mo,sha256=qG76OtMvUFnySaBcdaJQAJPDGH8iaktUyQ8PEdFx4Y8,16875 +django/contrib/admin/locale/az/LC_MESSAGES/django.po,sha256=mNS5Fgr1P8lxWFoPdhsbfM9EaFdu4KFPta-EsX8-UxA,18231 +django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo,sha256=lwMWU4eHd5TLqpkeebGktXq1cSsqzE-siTD_IcA3bZk,4621 +django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po,sha256=72nOuDSiU2fb_RgmJ_sNpVpTBSFX1oVydPm-QqD8AX0,5102 +django/contrib/admin/locale/be/LC_MESSAGES/django.mo,sha256=5CbgzJ_iVyPTxTpToPEhgVSSfh-EhyjsCK75ecbQtrE,20007 +django/contrib/admin/locale/be/LC_MESSAGES/django.po,sha256=kRmThfssQtP_dr4JX2U2o-9qwwicZiM7i9QT9eSjrx0,21277 +django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo,sha256=kDqYyYbnP_oh-pw8kOJGGcFtx-MxI-UARlB5f53ow2w,5942 +django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po,sha256=GsjZtvw8_OQNTrNgyUgGfSZvAC1pg2sse8oILC3J6bs,6451 +django/contrib/admin/locale/bg/LC_MESSAGES/django.mo,sha256=iJzYciumvR_r42WmC3yjTdiWrQmS94p_x0gTWvV9lOc,20070 +django/contrib/admin/locale/bg/LC_MESSAGES/django.po,sha256=9ouezfohVViX6NFG57IFXTzcuMSvAafd6NKncMFJBds,21493 +django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo,sha256=TGNzP1smzgZmo5-s4VKD1E-nWTMtCSjp_hco1a0j4BQ,5565 +django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po,sha256=5uiQqnTyz0R-1vJTHqY0opwnQhMfgPoB-PxOkGpxNwk,6016 +django/contrib/admin/locale/bn/LC_MESSAGES/django.mo,sha256=fKmzDwzLp0Qlv4bvWscf0evanPRAXwR04B6IeJ7wGSw,15247 +django/contrib/admin/locale/bn/LC_MESSAGES/django.po,sha256=-go1WtUozfqbnKlUQr-jNnvEXf98eIZjq-C8KjRJ6NA,19812 +django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.mo,sha256=t_OiMyPMsR2IdH65qfD9qvQfpWbwFueNuY72XSed2Io,2313 +django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po,sha256=iFwEJi4k3ULklCq9eQNUhKVblivQPJIoC_6lbyEkotY,4576 +django/contrib/admin/locale/br/LC_MESSAGES/django.mo,sha256=yCuMwrrEB_H44UsnKwY0E87sLpect_AMo0GdBjMZRPs,6489 +django/contrib/admin/locale/br/LC_MESSAGES/django.po,sha256=WMU_sN0ENWgyEbKOm8uVQfTQh9sabvKihtSdMt4XQBM,13717 +django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo,sha256=n7Yx2k9sAVSNtdY-2Ao6VFsnsx4aiExZ3TF_DnnrKU0,1658 +django/contrib/admin/locale/br/LC_MESSAGES/djangojs.po,sha256=gjg-VapbI9n_827CqNYhbtIQ8W9UcMmMObCsxCzReUU,4108 +django/contrib/admin/locale/bs/LC_MESSAGES/django.mo,sha256=44D550fxiO59Pczu5HZ6gvWEClsfmMuaxQWbA4lCW2M,8845 +django/contrib/admin/locale/bs/LC_MESSAGES/django.po,sha256=FrieR1JB4ssdWwYitJVpZO-odzPBKrW4ZsGK9LA595I,14317 +django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.mo,sha256=SupUK-RLDcqJkpLEsOVjgZOWBRKQMALZLRXGEnA623M,1183 +django/contrib/admin/locale/bs/LC_MESSAGES/djangojs.po,sha256=TOtcfw-Spn5Y8Yugv2OlPoaZ5DRwJjRIl-YKiyU092U,3831 +django/contrib/admin/locale/ca/LC_MESSAGES/django.mo,sha256=P1SKN-U1ARdH2lG9QOwVCzBGtoiCOV44Sq_TFIP7KJY,16994 +django/contrib/admin/locale/ca/LC_MESSAGES/django.po,sha256=WVZHjstMczy3zkDEntGzDzLaQxFbpa80aUqB4DzA0Ww,18448 +django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo,sha256=jQuQQAoB-_hggWhGXDFhk71xu70rKF0GqHN-DjR9o-c,4560 +django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po,sha256=Mfn1tgpuhe05MBQShhMoJDZ7L5Nn2p1jFy_jYIt0H0g,5098 +django/contrib/admin/locale/cs/LC_MESSAGES/django.mo,sha256=0g1m3rGwPRGfYBPLQwYVlehZJLLECGHCkMjsSVz7Fnc,17190 +django/contrib/admin/locale/cs/LC_MESSAGES/django.po,sha256=fwfy6A-N0IsVrxW0KQlt1CdFYgG3LsPdN0UKetsHDaI,18683 +django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo,sha256=K9lJ7JQ2BmIxZuZDIlCfMkIo6pvormd3wYIoPxMH8VU,5053 +django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po,sha256=FWiaxDEWDMQjkm5j2CidZoRx8RqbWdmTCd-EHZE6gUo,5666 +django/contrib/admin/locale/cy/LC_MESSAGES/django.mo,sha256=7ifUyqraN1n0hbyTVb_UjRIG1jdn1HcwehugHBiQvHs,12521 +django/contrib/admin/locale/cy/LC_MESSAGES/django.po,sha256=bS_gUoKklZwd3Vs0YlRTt24-k5ure5ObTu-b5nB5qCA,15918 +django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.mo,sha256=fOCA1fXEmJw_QaXEISLkuBhaMnEmP1ssP9lhqdCCC3c,3801 +django/contrib/admin/locale/cy/LC_MESSAGES/djangojs.po,sha256=OVcS-3tlMJS_T58qnZbWLGczHwFyAjbuWr35YwuxAVM,5082 +django/contrib/admin/locale/da/LC_MESSAGES/django.mo,sha256=CVE53i98ItqXZUsxPQnRNi_MylEqoBaQJ3nty_D0JAg,16367 +django/contrib/admin/locale/da/LC_MESSAGES/django.po,sha256=7D_QF_KpOnChFnwE8mAiUq8bdaV5eU9q1gqqs2jQjKo,17752 +django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo,sha256=_K0UgjdfnYyLtno5ibSDtwCNz_4Ak4NASvKMd-2rhP4,4518 +django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po,sha256=KUXicxZHf8rLPKBE64HjMQVB4n3U0hxKGGw_a6Oah3w,5120 +django/contrib/admin/locale/de/LC_MESSAGES/django.mo,sha256=0lfScCgStjRldINiX90iExA4yPncETH4PU98kT7w6ZQ,17151 +django/contrib/admin/locale/de/LC_MESSAGES/django.po,sha256=jXiF0E_apjQ7n5WwyUIymxOkHOObv6IvTchFPvPxMmw,18624 +django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo,sha256=_aUsqSeIo9dHAiy6daB-BLselNy7tuPUEf7kVCgEByM,4602 +django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po,sha256=ilCflt4q60Rr1D9wEPNpZQMvJO1R7udNsRgZiml3PdI,5068 +django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo,sha256=JrZYVI9p980knGzoAeVXRmoJXoxj9LPfpYnGBibIuaY,17280 +django/contrib/admin/locale/dsb/LC_MESSAGES/django.po,sha256=xuj9qjt70E4GOaz4XqYRw5ArPnXhRNZbEjQCc5zSjUE,18516 +django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo,sha256=dXeUPn56ZlRRGbBeHaG6YIwou46k0mu00FU7HCX1ou8,5016 +django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po,sha256=TGt8DJWrQ5Qs0SgJjjjeDmwZTGTPEBgeDFRvUhrrMRA,5490 +django/contrib/admin/locale/el/LC_MESSAGES/django.mo,sha256=7pnFzsUwA3Z3AdqccRmr2K6A2hfrhNGsvtFJFI0uOZU,23088 +django/contrib/admin/locale/el/LC_MESSAGES/django.po,sha256=vnMzGKYAAgZqo03IdyEJQv1jAMPIlQ2INh3P7cR2HDc,24662 +django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo,sha256=vfha6S1wDTxgteeprHdCY6j1SnSWDdbC67aoks7TVFw,5888 +django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po,sha256=GJQytMIHNrJeWWnpaoGud4M6aiJCtJ7csyXzmfS6GZs,6560 +django/contrib/admin/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/admin/locale/en/LC_MESSAGES/django.po,sha256=KSCX2Ly3BuNcwUXpNoOGBMi_lOzprJ-FeZ4cqkjbmOo,23147 +django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po,sha256=02sibdoGO77DCuqCRr_w9-4wd50f-TK1m-TFZ7vVf5o,6601 +django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo,sha256=DVjhYEbArfdAQLuE0YAG99eWxa9_eNEz2o9A6X6MrEY,2894 +django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po,sha256=CO7AV-NmmmwnXyBIybSfNZLdXiavphWsd9LNZQNqDL4,11800 +django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo,sha256=LWNYXUicANYZeiNx4mb6pFpjnsaggPTxTBCbNKxPtFw,1714 +django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po,sha256=UZk0oHToRtHzlviraFzWcZlpVAOk_W2oq4NquxevQoE,3966 +django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo,sha256=pFkTMRDDj76WA91wtGPjUB7Pq2PN7IJEC54Tewobrlc,11159 +django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po,sha256=REUJMGLGRyDMkqh4kJdYXO9R0Y6CULFVumJ_P3a0nv0,15313 +django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.mo,sha256=hW325c2HlYIIdvNE308c935_IaDu7_qeP-NlwPnklhQ,3147 +django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po,sha256=Ol5j1-BLbtSIDgbcC0o7tg_uHImcjJQmkA4-kSmZY9o,4581 +django/contrib/admin/locale/eo/LC_MESSAGES/django.mo,sha256=Kq-XFhLK56KXwDE2r2x93w9JVFSxgXqCU_XKb38DxhU,16252 +django/contrib/admin/locale/eo/LC_MESSAGES/django.po,sha256=Yr37pm5u1xEb9vuUucJmbs9aPErpog9AP9nIr8GQpBU,17752 +django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo,sha256=I1Ue345qSHPmJpX4yiYgomQ8vMgshRt1S1D_ZVJWf7g,4452 +django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po,sha256=BdSRWCYCDxLxtbcPSfRdAMGoTRWOWaxRGpdCIm-3HA0,5040 +django/contrib/admin/locale/es/LC_MESSAGES/django.mo,sha256=xuKy1h77UlayYqn_G4JjJVb1Vy6nVUtiUmdy6MT544Q,17223 +django/contrib/admin/locale/es/LC_MESSAGES/django.po,sha256=YKlRrWfJ1-N_8U9kvLVF9umIfFTtBvw-EpPFsJBITWA,19165 +django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo,sha256=44RpmIC1vT7OGz4ubSAzoiU8OysfLsnueZcIqdF6gjQ,4627 +django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po,sha256=t2Jn5RZo7e-UzqVwgBAejuBceWCidWjXvd--cWEq6rI,5302 +django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo,sha256=7xEd1eMXD0XfwJfRnsjsFE55R0U7MohOzTUmF7OqdYo,17374 +django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po,sha256=KWyaVCv13xvRe9wF66RnUG8JT-565b_JKvvVcaivMTo,18661 +django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo,sha256=am2ZkZFNC_7L7aNKc6imVX-7aY5QK1E26AIe75eEyTU,4892 +django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po,sha256=DB0e4M6Y5sUdEAvByhGA2nhScOnBZx40SManaAWvpyo,5350 +django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo,sha256=0k8kSiwIawYCa-Lao0uetNPLUzd4m_me3tCAVBvgcSw,15156 +django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po,sha256=4T_syIsVY-nyvn5gEAtfN-ejPrJSUpNT2dmzufxaBsE,17782 +django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.mo,sha256=PLS10KgX10kxyy7MUkiyLjqhMzRgkAFGPmzugx9AGfs,3895 +django/contrib/admin/locale/es_CO/LC_MESSAGES/djangojs.po,sha256=Y4bkC8vkJE6kqLbN8t56dR5670B06sB2fbtVzmQygK8,5176 +django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo,sha256=lQwxsrvK8ZQaqErLj2Uc_6ot5QiczaWgFqIr9K0tzwc,14127 +django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po,sha256=b9BB_rwofNmIl98JB6jA-61AnYq-GvbITLtsOEi_NBM,16964 +django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.mo,sha256=2w3CMJFBugP8xMOmXsDU82xUm8cWGRUGZQX5XjiTCpM,3380 +django/contrib/admin/locale/es_MX/LC_MESSAGES/djangojs.po,sha256=OP9cBsdCf3zZAXiKBMJPvY1AHwC_WE1k2vKlzVCtUec,4761 +django/contrib/admin/locale/es_VE/LC_MESSAGES/django.mo,sha256=himCORjsM-U3QMYoURSRbVv09i0P7-cfVh26aQgGnKg,16837 +django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po,sha256=mlmaSYIHpa-Vp3f3NJfdt2RXB88CVZRoPEMfl-tccr0,18144 +django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.mo,sha256=Zy-Hj_Mr2FiMiGGrZyssN7GZJrbxRj3_yKQFZKR36Ro,4635 +django/contrib/admin/locale/es_VE/LC_MESSAGES/djangojs.po,sha256=RI8CIdewjL3bAivniMOl7lA9tD7caP4zEo2WK71cX7c,5151 +django/contrib/admin/locale/et/LC_MESSAGES/django.mo,sha256=s7jzFiU_v46bix73UqilOdDI17yz7LB37eMV6vV3K0c,15553 +django/contrib/admin/locale/et/LC_MESSAGES/django.po,sha256=R5oUNDz0vTUiRaZrboRgqn4RZk54GFgAfWk7Hz3PnaU,17422 +django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo,sha256=GOfcPo6Tge73JsPGShWCmepOAvdGgEcdrVTUI-Fxjm4,4394 +django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po,sha256=6qIvrAmlBVY6KM56LkrAl51R9sL-Hnw4u4GNgCoqbRg,4930 +django/contrib/admin/locale/eu/LC_MESSAGES/django.mo,sha256=sutek-yBmp0yA673dBWQLg11138KCcAn9cBdfl_oVJw,16336 +django/contrib/admin/locale/eu/LC_MESSAGES/django.po,sha256=uR2eY8Y6gS95UYOpd-OjjwFzOVfGCl3QOuWnH3QFCr4,17702 +django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo,sha256=bZHiuTFj8MNrO3AntBAY5iUhmCa6LSluGLYw504RKWg,4522 +django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po,sha256=eMpM70UTWIiCDigCgYVOZ9JKQ2IidYZxYcUWunvG8js,5051 +django/contrib/admin/locale/fa/LC_MESSAGES/django.mo,sha256=sf4By8eUwoXQLf20Bg_xbeeBziWQCJJHD6qSPCNI2l8,19770 +django/contrib/admin/locale/fa/LC_MESSAGES/django.po,sha256=AdPkTplO72E7NU4wvTmPNQfmwrPiHSIMPkcd4OS53n0,21261 +django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo,sha256=VXKiFMQnm3YrvanPhoV24y3O_y4BQe8DaXLa6bDiuQQ,5267 +django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po,sha256=4PJhPH1EiAMiiQo2W0g_jiXp6p7g7FYT973T80rhVng,5915 +django/contrib/admin/locale/fi/LC_MESSAGES/django.mo,sha256=Z3e3GBZbSdFeiRnyzF2DVMl9_j3bZKJuhZgUF9GVYAI,15778 +django/contrib/admin/locale/fi/LC_MESSAGES/django.po,sha256=OAwpDK8PcIQm7881rJ-MPlmiCTp_HyTUcQOmrgBgJz8,17475 +django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo,sha256=ez7WTtE6OE878kSxqXniDOQY-wdURYEfxYQXBQJTVpg,4561 +django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po,sha256=rquknGvUFlWNLcrOc1wwhAPn63PZA48qBN8oWiINiQ0,5045 +django/contrib/admin/locale/fr/LC_MESSAGES/django.mo,sha256=mHE7xvetA6F5IOx5jtwNGF7H1Ax6PIL3mCvtDtkufYU,17947 +django/contrib/admin/locale/fr/LC_MESSAGES/django.po,sha256=ZyWTeeml8HGuVi1d_PlxDad103yi8bez5LwlyIa1PQg,19235 +django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo,sha256=KewGnfKOxbAlC7VgPnSkNM-5ASAHw36d_HdKBt06ecw,4735 +django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po,sha256=xa0hANFCx2bR98OHtpYWny5ggyJhzX2C01umaCxqqQE,5228 +django/contrib/admin/locale/fy/LC_MESSAGES/django.mo,sha256=mWnHXGJUtiewo1F0bsuJCE_YBh7-Ak9gjTpwjOAv-HI,476 +django/contrib/admin/locale/fy/LC_MESSAGES/django.po,sha256=oSKEF_DInUC42Xzhw9HiTobJjE2fLNI1VE5_p6rqnCE,10499 +django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/admin/locale/fy/LC_MESSAGES/djangojs.po,sha256=efBDCcu43j4SRxN8duO5Yfe7NlpcM88kUPzz-qOkC04,2864 +django/contrib/admin/locale/ga/LC_MESSAGES/django.mo,sha256=cIOjVge5KC37U6g-0MMaP5p8N0XJxzK6oJqWNUw9jfI,15075 +django/contrib/admin/locale/ga/LC_MESSAGES/django.po,sha256=Qx1D0cEGIIPnO10I_83IfU3faEYpp0lm-KHg48lJMxE,17687 +django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo,sha256=G-9VfhiMcooTbAI1IMvbvUwj_h_ttNyxGS89nIgrpw4,5247 +django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po,sha256=DsDMYhm5PEpFBBGepf2iRD0qCkh2r45Y4tIHzFtjJAo,5920 +django/contrib/admin/locale/gd/LC_MESSAGES/django.mo,sha256=5D_bPlVaOxjWUAddUHgltyfItGzTcI1LcvWF_KQyVTk,18685 +django/contrib/admin/locale/gd/LC_MESSAGES/django.po,sha256=MSWiN5WA9ffzb1DjSAyvi3xXrUx6gGs71wcN4K9fi7c,20005 +django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo,sha256=GwtvzwSO_lE6yHEdZLNl3Vzxk0E8KAjhJyIn6aSyc0s,5304 +django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po,sha256=RJv2lrB2UamHczIbCzzLBnEWodMLqgNX9ihofmL6XRo,5809 +django/contrib/admin/locale/gl/LC_MESSAGES/django.mo,sha256=_9JW7LdCw2on4M1oz3Iyl_VMrhrw_0oVIQl4h_rCX6g,13246 +django/contrib/admin/locale/gl/LC_MESSAGES/django.po,sha256=xqdcVwIX5zPxq471crW0yxcOYcbZVaRwKiKx-MAGiqk,16436 +django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo,sha256=YkT7l3U9ffSGqXmu6S41Ex0r7tbK-0BKH5lS6O8PAGs,3279 +django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po,sha256=EDccOpm1mpT8mVRvu5LBsq8nao50oP1V7aKEnuRmtF8,4803 +django/contrib/admin/locale/he/LC_MESSAGES/django.mo,sha256=vq46ZBK67ZmRBQaY9oP_5rTKzXGDIfYWEs_zM1eR_Nw,18109 +django/contrib/admin/locale/he/LC_MESSAGES/django.po,sha256=eVzhoSXRetzNkVi7BGIN3t6MjEf-I-DUiG3n1-4AOKA,19428 +django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo,sha256=14LdNNgLoQTtB49gWUMp32cywmgMRIwizD19p3CAgE4,5157 +django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po,sha256=rUeEfJBwQNNSrkxCpjPu3tKD2sc8DrBto4QOdUiuuY0,5737 +django/contrib/admin/locale/hi/LC_MESSAGES/django.mo,sha256=EogCHT8iAURSuE34kZ0kwEIoz5VjgUQUG2eAIqDxReU,18457 +django/contrib/admin/locale/hi/LC_MESSAGES/django.po,sha256=NcTFbFyHhWOIieUpzIVL7aSDWZ8ZNmfnv5gcxhON1zc,21770 +django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo,sha256=yCUHDS17dQDKcAbqCg5q8ualaUgaa9qndORgM-tLCIw,4893 +django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po,sha256=U9rb5tPMICK50bRyTl40lvn-tvh6xL_6o7xIPkzfKi0,6378 +django/contrib/admin/locale/hr/LC_MESSAGES/django.mo,sha256=3TR3uFcd0pnkDi551WaB9IyKX1aOazH7USxqc0lA0KQ,14702 +django/contrib/admin/locale/hr/LC_MESSAGES/django.po,sha256=qcW7tvZoWZIR8l-nMRexGDD8VlrOD7l5Fah6-ecilMk,17378 +django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo,sha256=KR34lviGYh1esCkPE9xcDE1pQ_q-RxK1R2LPjnG553w,3360 +django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.po,sha256=w7AqbYcLtu88R3KIKKKXyRt2gwBBBnr-ulxONWbw01I,4870 +django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo,sha256=pqQAcYbKErsLPgW4d5YCywu9zlol9rRB0ovn5SN6XiY,17024 +django/contrib/admin/locale/hsb/LC_MESSAGES/django.po,sha256=U_JoRC-HraehdZVlHPu6s5ojCSMHWW14Rq1l_MXYttI,18236 +django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo,sha256=w_gJCnB7aw68UzYwwMPmBaj5pHpXRx6AQgFdQkKsgZ4,5087 +django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po,sha256=t4S38sEiNXswarvPUFKzP4rms0AfQgydGv7W4qIa9eQ,5564 +django/contrib/admin/locale/hu/LC_MESSAGES/django.mo,sha256=udUPQkbtYXnfW5KO8tSAZw20bRPMcyV2n-5B82ChkK0,16903 +django/contrib/admin/locale/hu/LC_MESSAGES/django.po,sha256=WHNUlkrweKlo56lDsiwahxerPRx6ysNPTvbcX7J2urM,18431 +django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo,sha256=l3pXOmu379TYVMwPD-6rT4YtBff_MQPtbzfKz1C-jzY,4524 +django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po,sha256=fVI0wNWgfHJ68cM9RgQgdQ_2KpaZRMDfNeSiXjJ5Dlg,5105 +django/contrib/admin/locale/hy/LC_MESSAGES/django.mo,sha256=Dcx9cOsYBfbgQgoAQoLhn_cG1d2sKGV6dag4DwnUTaY,18274 +django/contrib/admin/locale/hy/LC_MESSAGES/django.po,sha256=CnQlRZ_DUILMIqVEgUTT2sufAseEKJHHjWsYr_LAqi8,20771 +django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.mo,sha256=ttfGmyEN0-3bM-WmfCge2lG8inubMPOzFXfZrfX9sfw,5636 +django/contrib/admin/locale/hy/LC_MESSAGES/djangojs.po,sha256=jf94wzUOMQaKSBR-77aijQXfdRAqiYSeAQopiT_8Obc,6046 +django/contrib/admin/locale/ia/LC_MESSAGES/django.mo,sha256=SRKlr8RqW8FQhzMsXdA9HNqttO3hc0xf4QdQJd4Dy8c,11278 +django/contrib/admin/locale/ia/LC_MESSAGES/django.po,sha256=pBQLQsMinRNh0UzIHBy3qEW0etUWMhFALu4-h-woFyE,15337 +django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo,sha256=28MiqUf-0-p3PIaongqgPQp2F3D54MLAujPslVACAls,3177 +django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.po,sha256=CauoEc8Fiowa8k6K-f9N8fQDle40qsgtXdNPDHBiudQ,4567 +django/contrib/admin/locale/id/LC_MESSAGES/django.mo,sha256=HRBCQYRozKfzAOvc5xmzibUQmZnJYM79I-JC1gqi4OU,16118 +django/contrib/admin/locale/id/LC_MESSAGES/django.po,sha256=-xTpxTvtSaPa11Dbq6hwYKSHCvkezYXu0T3RTlclAiA,17588 +django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo,sha256=IsrbImLKoye0KHfaJ1ddPh2TXtvcuoq5aRskTAUwRhE,4407 +django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po,sha256=o7zQcSD2QkF_DVwHOKS4jxZi7atLPsQQIoG_szM4xFg,4915 +django/contrib/admin/locale/io/LC_MESSAGES/django.mo,sha256=URiYZQZpROBedC-AkpVo0q3Tz78VfkmwN1W7j6jYpMo,12624 +django/contrib/admin/locale/io/LC_MESSAGES/django.po,sha256=y0WXY7v_9ff-ZbFasj33loG-xWlFO8ttvCB6YPyF7FQ,15562 +django/contrib/admin/locale/io/LC_MESSAGES/djangojs.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 +django/contrib/admin/locale/io/LC_MESSAGES/djangojs.po,sha256=WLh40q6yDs-8ZG1hpz6kfMQDXuUzOZa7cqtEPDywxG4,2852 +django/contrib/admin/locale/is/LC_MESSAGES/django.mo,sha256=9409JxMb_350BPnUEhNTwV6JVCb-Rw2PhUt2_qBV_zU,16598 +django/contrib/admin/locale/is/LC_MESSAGES/django.po,sha256=YML6qQMeENR29jpZWvOa_vL7sY1Veaet-LPy2Efh0fo,17989 +django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo,sha256=H7vMdlTEejHg-lYjxS11mVa4o7alXMxcAIfsxrM0gpc,4559 +django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po,sha256=AU39DyYbiu8fMzJhL9cVFc2bfqKcm2Si6HHGGtbewpw,5109 +django/contrib/admin/locale/it/LC_MESSAGES/django.mo,sha256=lRyBpAkHnXkYEJFua2-NVO5ggQu0h_SnnrMyZAG6BfM,16882 +django/contrib/admin/locale/it/LC_MESSAGES/django.po,sha256=AF4U5mPjraniCRtgMlfpdNCc-_oLTHOG_uXxyWmZCjQ,18547 +django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo,sha256=QHgE9TmlziDuR3XooAHLhp6fAYrBHj7JkZGwZMeutQM,4537 +django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po,sha256=5VcM_25w9a2d_H57l24q5mJUXMlhLF0WjuAdiWOG2MI,5171 +django/contrib/admin/locale/ja/LC_MESSAGES/django.mo,sha256=jKU98XwvgSo0TtfLPoDza7qXI1_P81D_ZJNH1IyILl8,18026 +django/contrib/admin/locale/ja/LC_MESSAGES/django.po,sha256=FYrAGD67fiKMhcBQTFaACtXtUEYemK1I6KvEOAJxcGY,19389 +django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo,sha256=e1psnvl2PWI9RpwDRY0UV5cqn_jhz_ms6OlKUQnEBt0,4688 +django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po,sha256=5-4GlF-p7REuRaMvRGBTuTMJW6slZLqdR-UrEEEJjtA,5098 +django/contrib/admin/locale/ka/LC_MESSAGES/django.mo,sha256=M3FBRrXFFa87DlUi0HDD_n7a_0IYElQAOafJoIH_i60,20101 +django/contrib/admin/locale/ka/LC_MESSAGES/django.po,sha256=abkt7pw4Kc-Y74ZCpAk_VpFWIkr7trseCtQdM6IUYpQ,23527 +django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.mo,sha256=GlPU3qUavvU0FXPfvCl-8KboYhDOmMsKM-tv14NqOac,5516 +django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po,sha256=jDpB9c_edcLoFPHFIogOSPrFkssOjIdxtCA_lum8UCs,6762 +django/contrib/admin/locale/kab/LC_MESSAGES/django.mo,sha256=9QKEWgr8YQV17OJ14rMusgV8b79ZgOOsX4aIFMZrEto,3531 +django/contrib/admin/locale/kab/LC_MESSAGES/django.po,sha256=cSOG_HqsNE4tA5YYDd6txMFoUul8d5UKvk77ZhaqOK0,11711 +django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.mo,sha256=nqwZHJdtjHUSFDJmC0nPNyvWcAdcoRcN3f-4XPIItvs,1844 +django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po,sha256=tF3RH22p2E236Cv6lpIWQxtuPFeWOvJ-Ery3vBUv6co,3713 +django/contrib/admin/locale/kk/LC_MESSAGES/django.mo,sha256=f2WU3e7dOz0XXHFFe0gnCm1MAPCJ9sva2OUnWYTHOJg,12845 +django/contrib/admin/locale/kk/LC_MESSAGES/django.po,sha256=D1vF3nqANT46f17Gc2D2iGCKyysHAyEmv9nBei6NRA4,17837 +django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.mo,sha256=cBxp5pFJYUF2-zXxPVBIG06UNq6XAeZ72uRLwGeLbiE,2387 +django/contrib/admin/locale/kk/LC_MESSAGES/djangojs.po,sha256=Y30fcDpi31Fn7DU7JGqROAiZY76iumoiW9qGAgPCCbU,4459 +django/contrib/admin/locale/km/LC_MESSAGES/django.mo,sha256=eOe9EcFPzAWrTjbGUr-m6RAz2TryC-qHKbqRP337lPY,10403 +django/contrib/admin/locale/km/LC_MESSAGES/django.po,sha256=RSxy5vY2sgC43h-9sl6eomkFvxClvH_Ka4lFiwTvc2I,17103 +django/contrib/admin/locale/km/LC_MESSAGES/djangojs.mo,sha256=Ja8PIXmw6FMREHZhhBtGrr3nRKQF_rVjgLasGPnU95w,1334 +django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po,sha256=LH4h4toEgpVBb9yjw7d9JQ8sdU0WIZD-M025JNlLXAU,3846 +django/contrib/admin/locale/kn/LC_MESSAGES/django.mo,sha256=955iPq05ru6tm_iPFVMebxwvZMtEa5_7GaFG1mPt6HU,9203 +django/contrib/admin/locale/kn/LC_MESSAGES/django.po,sha256=xMGtsVCItMTs18xdFQHELdVZKCwTNNyKfb8n1ARcFws,16053 +django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo,sha256=dHzxizjDQWiZeRfBqnVFcK1yk1-M5p1KOfQ1ya9TMVU,1872 +django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po,sha256=MqRj6ozyr1e9-qNORUTJXNahe6SL3ee3OveSm3efV4g,4214 +django/contrib/admin/locale/ko/LC_MESSAGES/django.mo,sha256=no1vLxHWNTc38iNPdTSZPxHl8rdTvWsVSQPc1XFGSi4,17405 +django/contrib/admin/locale/ko/LC_MESSAGES/django.po,sha256=3uqoSRni2pVbvHD-PqhdTV2scUU1MNxPpcGVW6Bc96k,19001 +django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo,sha256=ziL3F4ymY5DChHli3ZJqvkOz1YLzDgDbLl_mL3meomY,4493 +django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po,sha256=0oGHxYVwtQEz0sTPE1DoksK-LRTQOyuLzcT2tqcU15U,5029 +django/contrib/admin/locale/lb/LC_MESSAGES/django.mo,sha256=8GGM2sYG6GQTQwQFJ7lbg7w32SvqgSzNRZIUi9dIe6M,913 +django/contrib/admin/locale/lb/LC_MESSAGES/django.po,sha256=PZ3sL-HvghnlIdrdPovNJP6wDrdDMSYp_M1ok6dodrw,11078 +django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/admin/locale/lb/LC_MESSAGES/djangojs.po,sha256=fiMelo6K0_RITx8b9k26X1R86Ck2daQXm86FLJpzt20,2862 +django/contrib/admin/locale/lt/LC_MESSAGES/django.mo,sha256=SpaNUiaGtDlX5qngVj0dWdqNLSin8EOXXyBvRM9AnKg,17033 +django/contrib/admin/locale/lt/LC_MESSAGES/django.po,sha256=tHnRrSNG2ENVduP0sOffCIYQUn69O6zIev3Bb7PjKb0,18497 +django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.mo,sha256=vZtnYQupzdTjVHnWrtjkC2QKNpsca5yrpb4SDuFx0_0,5183 +django/contrib/admin/locale/lt/LC_MESSAGES/djangojs.po,sha256=dMjFClA0mh5g0aNFTyHC8nbYxwmFD0-j-7gCKD8NFnw,5864 +django/contrib/admin/locale/lv/LC_MESSAGES/django.mo,sha256=uABhT4xd_JMJcCQrXaLlLiP6Tx6Tz93pvQD0yOV833Q,16662 +django/contrib/admin/locale/lv/LC_MESSAGES/django.po,sha256=Kt6cfkKmvipb6CheRUzRH1HHnbAp4LqGN8N3qV9hsY4,18114 +django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo,sha256=eZAxtfdIDk07LhKgbWG0nAdHLn88mmWXbFX9ZvPPZdo,4903 +django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po,sha256=xCNNC4beYfhQWx8iC-qS8Hx7J5BGi2O2zq7Y2tQ96J4,5418 +django/contrib/admin/locale/mk/LC_MESSAGES/django.mo,sha256=luKonZA7H7yeCILl4BWXsYn_BncPzYy7_sfCWq7vlI4,20661 +django/contrib/admin/locale/mk/LC_MESSAGES/django.po,sha256=LyznsrasvV6Rtq7X6NnIrdZESGo_PlhISShHrCTbDgc,22056 +django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo,sha256=ZyQQ49zqs8GiS73XBaSd5l3Rh3vOA0glMpX98GH6nhU,5633 +django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po,sha256=bWph0TVgwC-Fmlof8_4SiR21uCFm9rftp59AMZ3WIYA,6188 +django/contrib/admin/locale/ml/LC_MESSAGES/django.mo,sha256=Z4V5iPKuJ8Y2ELZOt7E0HTFKPE_A0Jio7bdpwHN3aXc,24622 +django/contrib/admin/locale/ml/LC_MESSAGES/django.po,sha256=kmzKDsaZjEMwkfpS7kuGosBtLu_paMso_gcp7uFQ6GQ,27000 +django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo,sha256=JNbys0qhoL4w7yi0McbvY6p-yBVHusGOTykHgvPaIoU,7547 +django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po,sha256=R29OQ5pqJkeFOTwh-Fm1T1ZSN4APdJAkPhGY5MYcdL8,8084 +django/contrib/admin/locale/mn/LC_MESSAGES/django.mo,sha256=tsi1Lc7qcDD5dTjMQKy-9Hq-V2Akzyi994QY8wVaqNk,20545 +django/contrib/admin/locale/mn/LC_MESSAGES/django.po,sha256=T9WZQ5k0M9_pLCf5A-fDFIXKgN9fRisfsoZNnm4u-jk,21954 +django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo,sha256=H7fIPdWTK3_iuC0WRBJdfXN8zO77p7-IzTviEUVQJ2U,5228 +django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po,sha256=vJIqqVG34Zd7q8-MhTgZcXTtl6gukOSb6egt70AOyAc,5757 +django/contrib/admin/locale/mr/LC_MESSAGES/django.mo,sha256=UAxGnGliid2PTx6SMgIuHVfbCcqVvcwC4FQUWtDuSTc,468 +django/contrib/admin/locale/mr/LC_MESSAGES/django.po,sha256=TNARpu8Pfmu9fGOLUP0bRwqqDdyFmlh9rWjFspboTyc,10491 +django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po,sha256=uGe9kH2mwrab97Ue77oggJBlrpzZNckKGRUMU1vaigs,2856 +django/contrib/admin/locale/my/LC_MESSAGES/django.mo,sha256=xvlgM0vdYxZuA7kPQR7LhrLzgmyVCHAvqaqvFhKX9wY,3677 +django/contrib/admin/locale/my/LC_MESSAGES/django.po,sha256=zdUCYcyq2-vKudkYvFcjk95YUtbMDDSKQHCysmQ-Pvc,12522 +django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo,sha256=1fS9FfWi8b9NJKm3DBKETmuffsrTX-_OHo9fkCCXzpg,3268 +django/contrib/admin/locale/my/LC_MESSAGES/djangojs.po,sha256=-z1j108uoswi9YZfh3vSIswLXu1iUKgDXNdZNEA0yrA,5062 +django/contrib/admin/locale/nb/LC_MESSAGES/django.mo,sha256=0u3-bzPhkEo7UqaySnw8m1S_iI4FAgLlN2wKkPOPuWk,15980 +django/contrib/admin/locale/nb/LC_MESSAGES/django.po,sha256=5IczKWtpLRqnXvChpXS1CvAr72auWDXO1thqJwuxthU,17451 +django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo,sha256=M9-bGaylF_ZgF9PN_IcNSlwmJASh9UCp-XTt70OI-GE,4375 +django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po,sha256=RfP3ay2dJ7jIVoOw923KR9yJUGKs6SBQiiprgB-rFJ0,4915 +django/contrib/admin/locale/ne/LC_MESSAGES/django.mo,sha256=vkGnGxQFgLe9TFxEalAj-wLa0mos4ylG24clOGzRWr8,15710 +django/contrib/admin/locale/ne/LC_MESSAGES/django.po,sha256=qWDifq6NZdeyYS2uM7OFuypxeWCmBkCZBKhVEOAvd5g,19569 +django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo,sha256=mJdtpLT9k4vDbN9fk2fOeiy4q720B3pLD3OjLbAjmUI,5362 +django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.po,sha256=N91RciTV1m7e8-6Ihod5U2xR9K0vrLoFnyXjn2ta098,6458 +django/contrib/admin/locale/nl/LC_MESSAGES/django.mo,sha256=tjAj_NusfeSE-0aiSVZak5HpL08RNKdPv-R4JabPusY,16768 +django/contrib/admin/locale/nl/LC_MESSAGES/django.po,sha256=gN88Exe4S4OHPuLksvmNq5JxQxEbTsmLFWb1k6VMrxs,18402 +django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo,sha256=Nd46ratsRnVbXjiXX2APfWMhN6tLL0gQOxhxVXgweXI,4619 +django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po,sha256=Nsp0T7IvLgqMuDZ-dh5ZlMmXyy3PmjT_Djg6A6KXfEc,5382 +django/contrib/admin/locale/nn/LC_MESSAGES/django.mo,sha256=zKIlvBLMvoqrXO90TqPJcdTEXkVweUWpz6ynsWeg8mU,10943 +django/contrib/admin/locale/nn/LC_MESSAGES/django.po,sha256=-CFana0-PPFwv1jcdyjYuLK2OYOPva-xxMjlVhvsoCw,14999 +django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo,sha256=A7MT59BoyOSiM7W0phx8LLKQyH4Q8AEu6jUsBjUBOoE,3120 +django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po,sha256=tCXUV4F6FhMa-K0SBw9lQ0U2KY5kcMpGzT7jzKSvceo,4578 +django/contrib/admin/locale/os/LC_MESSAGES/django.mo,sha256=c51PwfOeLU2YcVNEEPCK6kG4ZyNc79jUFLuNopmsRR8,14978 +django/contrib/admin/locale/os/LC_MESSAGES/django.po,sha256=yugDw7iziHto6s6ATNDK4yuG6FN6yJUvYKhrGxvKmcY,18188 +django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo,sha256=0gMkAyO4Zi85e9qRuMYmxm6JV98WvyRffOKbBVJ_fLQ,3806 +django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po,sha256=skiTlhgUEN8uKk7ihl2z-Rxr1ZXqu5qV4wB4q9qXVq0,5208 +django/contrib/admin/locale/pa/LC_MESSAGES/django.mo,sha256=n31qIjOVaJRpib4VU4EHZRua3tBnBM6t_ukH9Aj37GM,10185 +django/contrib/admin/locale/pa/LC_MESSAGES/django.po,sha256=MR6ZOTypay-qCvafn0J0rZF06rOsWz771CLDD1qvISE,16446 +django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo,sha256=vdEMaVBuJtK1bnECgbqd_dS06PcmN7cgdv0hKGH5UKA,1207 +django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po,sha256=xU8tchSEH3MCLFSu4-71oVCR8pliKmILqFevM13IQ5M,3717 +django/contrib/admin/locale/pl/LC_MESSAGES/django.mo,sha256=_G5S3k029aCFnrMPnioRGQQ6B3vvmhRc4Da_I-YbmMk,17192 +django/contrib/admin/locale/pl/LC_MESSAGES/django.po,sha256=gv7GvvPRtl3mPWDAuWWg3quys5WXJi0_ougOTfqRHjk,18881 +django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo,sha256=fY0vkeI4ag4tE2LnWQfJ6ce4BTLN3ye9jsthZ2rGLZo,5106 +django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po,sha256=-MiZMJeuoyfD17nrkEIc3uLYSWZ2na7lqWWuJq-vDQk,5852 +django/contrib/admin/locale/pt/LC_MESSAGES/django.mo,sha256=MTFRTfUKot-0r-h7qtggPe8l_q0JPAzVF9GzdtB9600,16912 +django/contrib/admin/locale/pt/LC_MESSAGES/django.po,sha256=gzRkbl35HZ-88mlA1Bdj1Y-CUJ752pZKCUIG-NNw2os,18436 +django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo,sha256=D6-8QwX6lsACkEcYXq1tK_4W2q_NMc6g5lZQJDZRFHw,4579 +django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po,sha256=__a9WBgO_o0suf2xvMhyRk_Wkg2tfqNHmJOM5YF86sk,5118 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo,sha256=pONUdKb8LJNcAzaIaqFjGB60E0cHw4XUqxLZZVgGpKk,16830 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po,sha256=9OyvOYSQOCmOoiNXEkPGB5UbhJM5gHERRTMj6-1gv4k,18864 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo,sha256=a7KPhFtcwVa7PX1XK1cgF3HOOcRSkT-XYSiRCFyFQFQ,4619 +django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po,sha256=ENE4HAsUNcYJq2KvLrfBOLuxr1chEyEi39OSlaQU98g,5256 +django/contrib/admin/locale/ro/LC_MESSAGES/django.mo,sha256=cxCSHovSF-TTgFinvBLp-2higIfyFf964OQUVGkJCmA,16893 +django/contrib/admin/locale/ro/LC_MESSAGES/django.po,sha256=y7DK9RPD3dUw9nNeibefjogQ05MOgrXn7w0I4eERG2U,18391 +django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo,sha256=pb_H0zmtdSjvpacoMnLZuZy3B2PSeUGteL6-MoldLpg,4686 +django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po,sha256=OlT5yOHT3MK7M0ZXy467gJfsqNSLgUlUnXqQBhfHy3I,5387 +django/contrib/admin/locale/ru/LC_MESSAGES/django.mo,sha256=W2UrhegkVjKehjb74quRYDiITHWLWkLG8aizytjRHJM,21726 +django/contrib/admin/locale/ru/LC_MESSAGES/django.po,sha256=9QKhB52AqWhGSr7pKcPdezpy_oCm3vW371mhdroF6RU,23383 +django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo,sha256=LnAupy3FSz9zH6axWnvh1wtW27O5e8N6Apl5jFeFj0k,6560 +django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po,sha256=BMFEVFmYedhcRprutX1VBnoD6OuC79hExVt-h4Ep-ng,7360 +django/contrib/admin/locale/sk/LC_MESSAGES/django.mo,sha256=sLMYAOOz90NPuWJJyQdA_pbK31-mdrtsL68d8Xd7Bps,16288 +django/contrib/admin/locale/sk/LC_MESSAGES/django.po,sha256=PDyJDjKEHPc_-y55W_FimqaHVTLDUey4-XHfqn8feAU,18228 +django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo,sha256=0FifzbnJmubmNNUsePBcbM2MwExXmtnt699xtY2_uzo,4677 +django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po,sha256=F9lWj_7Ir6-VBYosrtbQnkxHR_tOVFO1V3VUnvfWNeI,5382 +django/contrib/admin/locale/sl/LC_MESSAGES/django.mo,sha256=iqcg1DYwwDVacRAKJ3QR4fTmKQhRGXU4WkwYco9ASaA,16136 +django/contrib/admin/locale/sl/LC_MESSAGES/django.po,sha256=VeIJDh1PojyUy-4AdPcVezbQ-XVWqp04vFE_u3KU2tU,17508 +django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo,sha256=0jqGv5lgcfyxh9pdnB0Nt7e0bF2G0nO-iVWJjKwyZqI,4724 +django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po,sha256=1DEs7obfCCf-hNM2nIkMizcRcq1KoLBvngMaXLlozUo,5269 +django/contrib/admin/locale/sq/LC_MESSAGES/django.mo,sha256=JKs3yvLPDCmt5aAGXbFoHAv6gYSfkxQm8sfBh2UfSBE,17053 +django/contrib/admin/locale/sq/LC_MESSAGES/django.po,sha256=vTCzTYhe6_fbXILaRbymZTUDAiK9yDAkd044f5pEuEQ,18301 +django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo,sha256=Y8QxQzzoGCTZ61b1Y9OSbPosunTPmRv3fGa1anV6vTg,4590 +django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po,sha256=LbSmumf9GglYFGM60mFvPFoEayWFVL72rPJ1WUYO_d8,5052 +django/contrib/admin/locale/sr/LC_MESSAGES/django.mo,sha256=7OEFKgKl8bhP5sYQQ3GWGuof8fgFUvWI16fjZLL-X4A,20855 +django/contrib/admin/locale/sr/LC_MESSAGES/django.po,sha256=TRKZvSIH8dDUsq8AQsneQmcsDndxUFftOq9jzgCOTdg,22213 +django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo,sha256=No_O4m32WrmnovKZ7CgusTPZOiMRDvMusQNS9FAg_pg,5221 +django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po,sha256=lj1TZE6I5YK0KUBD7ZVGMLV97sYwlIIwZjC5WQyxSyE,5729 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=8wcRn4O2WYMFJal760MvjtSPBNoDgHAEYtedg8CC7Ao,12383 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po,sha256=N4fPEJTtUrQnc8q1MioPZ2a7E55YXrE-JvfAcWZubfA,16150 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo,sha256=GxyIGHkAtSwuAnIgnjBlO6t_w589LloYIQw4zB-QiGM,4337 +django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po,sha256=GyBQ4gDVdhcmwbYod5MFhO-c8XVhv5eHyA6hyxOz_ZA,4862 +django/contrib/admin/locale/sv/LC_MESSAGES/django.mo,sha256=dIBd7h7WcZPWgi8pfGncEgsot4-xQkMYM1EwCiMNl8g,16348 +django/contrib/admin/locale/sv/LC_MESSAGES/django.po,sha256=h0KqMky8fKxucE8ZZkrALgY8U5P4bUkPEnSV6PhOQiQ,17916 +django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo,sha256=Q9UBnIR3KTna0BtGSZyXiehzxj8rP2I2NEi_2tTKUTU,4541 +django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po,sha256=SfGsoatvFSE1fsWsg_aVZl7gNsI0dtEmaro_0cGu9m4,5206 +django/contrib/admin/locale/sw/LC_MESSAGES/django.mo,sha256=Mtj7jvbugkVTj0qyJ_AMokWEa2btJNSG2XrhpY0U1Mc,14353 +django/contrib/admin/locale/sw/LC_MESSAGES/django.po,sha256=ElU-s0MgtNKF_aXdo-uugBnuJIDzHqMmy1ToMDQhuD0,16419 +django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.mo,sha256=p0pi6-Zg-qsDVMDjNHO4aav3GfJ3tKKhy6MK7mPtC50,3647 +django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po,sha256=lZFP7Po4BM_QMTj-SXGlew1hqyJApZxu0lxMP-YduHI,4809 +django/contrib/admin/locale/ta/LC_MESSAGES/django.mo,sha256=ZdtNRZLRqquwMk7mE0XmTzEjTno9Zni3mV6j4DXL4nI,10179 +django/contrib/admin/locale/ta/LC_MESSAGES/django.po,sha256=D0TCLM4FFF7K9NqUGXNFE2KfoEzx5IHcJQ6-dYQi2Eg,16881 +django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo,sha256=2-37FOw9Bge0ahIRxFajzxvMkAZL2zBiQFaELmqyhhY,1379 +django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po,sha256=Qs-D7N3ZVzpZVxXtMWKOzJfSmu_Mk9pge5W15f21ihI,3930 +django/contrib/admin/locale/te/LC_MESSAGES/django.mo,sha256=aIAG0Ey4154R2wa-vNe2x8X4fz2L958zRmTpCaXZzds,10590 +django/contrib/admin/locale/te/LC_MESSAGES/django.po,sha256=-zJYrDNmIs5fp37VsG4EAOVefgbBNl75c-Pp3RGBDAM,16941 +django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo,sha256=VozLzWQwrY-USvin5XyVPtUUKEmCr0dxaWC6J14BReo,1362 +django/contrib/admin/locale/te/LC_MESSAGES/djangojs.po,sha256=HI8IfXqJf4I6i-XZB8ELGyp5ZNr-oi5hW9h7n_8XSaQ,3919 +django/contrib/admin/locale/th/LC_MESSAGES/django.mo,sha256=7X6-Mgf5QiBV7xbcl_rwxyNF63v3zKAAAVqjFO6c8gg,18986 +django/contrib/admin/locale/th/LC_MESSAGES/django.po,sha256=bt87Nyr9UXksedki4Hlr3pPF4V1shsBAlBp583vmzEI,22157 +django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo,sha256=ukj5tyDor9COi5BT9oRLucO2wVTI6jZWclOM-wNpXHM,6250 +django/contrib/admin/locale/th/LC_MESSAGES/djangojs.po,sha256=3L5VU3BNcmfiqzrAWK0tvRRVOtgR8Ceg9YIxL54RGBc,6771 +django/contrib/admin/locale/tr/LC_MESSAGES/django.mo,sha256=gpdN8G40GoN4aETdOzb0_JlmaoRiDJHbagAH-Mw0RPU,16966 +django/contrib/admin/locale/tr/LC_MESSAGES/django.po,sha256=SgK4ajuBY-NwJCIm3Ar3isY8Lx9yYc3d1oCnpu3MJqI,18490 +django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo,sha256=1kem0Biv2nHRWs89KfqJew6Vk-uxsFiBV7Do7NB5ykE,4547 +django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po,sha256=ctZld3zOFwulpBGoE26KbbQxeaaZmbwLSWbERrNeKhs,5070 +django/contrib/admin/locale/tt/LC_MESSAGES/django.mo,sha256=ObJ8zwVLhFsS6XZK_36AkNRCeznoJJwLTMh4_LLGPAA,12952 +django/contrib/admin/locale/tt/LC_MESSAGES/django.po,sha256=VDjg5nDrLqRGXpxCyQudEC_n-6kTCIYsOl3izt1Eblc,17329 +django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo,sha256=Sz5qnMHWfLXjaCIHxQNrwac4c0w4oeAAQubn5R7KL84,2607 +django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.po,sha256=_Uh3yH_RXVB3PP75RFztvSzVykVq0SQjy9QtTnyH3Qk,4541 +django/contrib/admin/locale/udm/LC_MESSAGES/django.mo,sha256=2Q_lfocM7OEjFKebqNR24ZBqUiIee7Lm1rmS5tPGdZA,622 +django/contrib/admin/locale/udm/LC_MESSAGES/django.po,sha256=L4TgEk2Fm2mtKqhZroE6k_gfz1VC-_dXe39CiJvaOPE,10496 +django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/admin/locale/udm/LC_MESSAGES/djangojs.po,sha256=ZLYr0yHdMYAl7Z7ipNSNjRFIMNYmzIjT7PsKNMT6XVk,2811 +django/contrib/admin/locale/uk/LC_MESSAGES/django.mo,sha256=Wc1E8kLHTeu0GRg1vkj_kataySFcnrVk_oCLYMUpa6M,20988 +django/contrib/admin/locale/uk/LC_MESSAGES/django.po,sha256=n7NqZajp0dDWD9r5o1Aot8pQski1gtp6eZziqHg0gEU,22827 +django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo,sha256=YL-bL4CeoOsvcXKY30FsakS6A8kG0egbvDf2yYdFfU8,5930 +django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po,sha256=lKHsuFkzp8_evIKm8mVyZKIf99EIo8BsLYkIiyN29UY,6654 +django/contrib/admin/locale/ur/LC_MESSAGES/django.mo,sha256=HvyjnSeLhUf1JVDy759V_TI7ygZfLaMhLnoCBJxhH_s,13106 +django/contrib/admin/locale/ur/LC_MESSAGES/django.po,sha256=BFxxLbHs-UZWEmbvtWJNA7xeuvO9wDc32H2ysKZQvF4,17531 +django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo,sha256=eYN9Q9KKTV2W0UuqRc-gg7y42yFAvJP8avMeZM-W7mw,2678 +django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.po,sha256=Nj-6L6axLrqA0RHUQbidNAT33sXYfVdGcX4egVua-Pk,4646 +django/contrib/admin/locale/vi/LC_MESSAGES/django.mo,sha256=nkSrBQaktbMGWr8IMNoPoOVQBAIR1GJF13BvKLu2CeM,14860 +django/contrib/admin/locale/vi/LC_MESSAGES/django.po,sha256=FxcEsnT3-FvPXjnHp9y51jFPILUgSx27egwtwU_wbS0,17847 +django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo,sha256=M_wqHg1NO-I7xfY-mMZ29BqUAqGzlizgJ3_DIGBWOUc,3733 +django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po,sha256=d3YtQhNuCqtfMO3u5-6zoNhhGBNYkoUhTrxz7I3PRkQ,5018 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=rCQfiVkB9807tUwp69DfXRpiCbOknSaP6mzgdyM0xIg,15531 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po,sha256=p18ukLOOh1pW6AmdV8MxoUd7TePeunCTpPbXszY1kBY,17403 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo,sha256=ypJV8qNOfp5NDdC4bciIoSST2txTnQZWFJD0bIUNd78,4245 +django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po,sha256=p48E5tOcZbks7JipYsUOg3FWuG_6mP2wSWJeb5otzHQ,4982 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=kEKX-cQPRFCNkiqNs1BnyzEvJQF-EzA814ASnYPFMsw,15152 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po,sha256=iH3w7Xt_MelkZefKi8F0yAWN6QGdQCJBz8VaFY4maUg,16531 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo,sha256=yFwS8aTJUAG5lN4tYLCxx-FLfTsiOxXrCEhlIA-9vcs,4230 +django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po,sha256=C4Yk5yuYcmaovVs_CS8YFYY2iS4RGi0oNaUpTm7akeU,4724 +django/contrib/admin/migrations/0001_initial.py,sha256=0p5TjterT80FOrCxhO7YqZPag-xnyRin_mQ01Qj579o,1893 +django/contrib/admin/migrations/0002_logentry_remove_auto_add.py,sha256=_7XFWubtQ7NG0eQ02MqtxXQmjBmYc6Od5rwcAiT1aCs,554 +django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py,sha256=UCS9mPrkhZ5YL_9RMSrgA7uWDTzvLzqSLq_LSXVXimM,539 +django/contrib/admin/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/static/admin/css/autocomplete.css,sha256=MGqRzeZ1idtUnRM7MnEHw7ClmOVe_Uo7SdLoudapNMU,8440 +django/contrib/admin/static/admin/css/base.css,sha256=yLG2UJK97FigjWpkXt2RUKn3tl7E6GkcL5l9ofptVqs,16378 +django/contrib/admin/static/admin/css/changelists.css,sha256=z-w-H416nJzM01ysLRhynHH-4zyjtkoDlzRPFDARX6U,6170 +django/contrib/admin/static/admin/css/dashboard.css,sha256=M_duSlzrcec1HXMWlLXJQkFw4m6v2dgB3PRaJlWQo14,412 +django/contrib/admin/static/admin/css/fonts.css,sha256=SnBl3KjeUZqRmZw3F0iNm1YpqFhjrNC_fNN0H2TkuYc,423 +django/contrib/admin/static/admin/css/forms.css,sha256=qKCiNqApMyCIUgHvCOQp9YC5t54Gm3-zRmeBGXu9dj8,8518 +django/contrib/admin/static/admin/css/login.css,sha256=X9WSvQoBXD7zH-Vo2UZS1zHobGILGAKmtlXoGKPfRck,1233 +django/contrib/admin/static/admin/css/responsive.css,sha256=l7tqC8lSj_UP0sjiMOwxDL0-COeMDfbF7YsF_f7DWKY,17944 +django/contrib/admin/static/admin/css/responsive_rtl.css,sha256=vlnAVsfb5I8QSoN5GsrabXa65EGTKCKfvcU8NbBZxDA,1921 +django/contrib/admin/static/admin/css/rtl.css,sha256=c3MpnLYEUwyE8vcBXF3dYdgisrEYcFM0MsPePGJGnIQ,3808 +django/contrib/admin/static/admin/css/widgets.css,sha256=FbxIKiGYkWjZwRMm5A_Qv-kKrhsPnfzhsF1j28eSqnA,10340 +django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md,sha256=Py5KwtTr_nv_wJAqcAa1YqXiIY_0XyS08UQXZhXiqNo,1124 +django/contrib/admin/static/admin/css/vendor/select2/select2.css,sha256=xqxV4FDj5tslOz6MV13pdnXgf63lJwViadn__ciKmIs,17604 +django/contrib/admin/static/admin/css/vendor/select2/select2.min.css,sha256=xJOZHfpxLR_uhh1BwYFS5fhmOAdIRQaiOul5F_b7v3s,15196 +django/contrib/admin/static/admin/fonts/LICENSE.txt,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560 +django/contrib/admin/static/admin/fonts/README.txt,sha256=E4rvl9Y9cvKx2wpkrgQZjhaKfRhEUG8pNLCoZoBq-rE,214 +django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff,sha256=sXZ6DD5d-zpQCe_uREX_FdY2LpKFRh4Xve0Ybx6UVvA,86184 +django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff,sha256=GIJzScf-vUuNAaqQfGfqm4ARJCB4MmskcDl4RU_fNRo,85692 +django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff,sha256=munWVF19fYI_ipQBDbd8Gg_3Hjcei7FY3xy5g5UWJQc,85876 +django/contrib/admin/static/admin/img/LICENSE,sha256=0RT6_zSIwWwxmzI13EH5AjnT1j2YU3MwM9j3U19cAAQ,1081 +django/contrib/admin/static/admin/img/README.txt,sha256=XqN5MlT1SIi6sdnYnKJrOiJ6h9lTIejT7nLSY-Y74pk,319 +django/contrib/admin/static/admin/img/calendar-icons.svg,sha256=gbMu26nfxZphlqKFcVOXpcv5zhv5x_Qm_P4ba0Ze84I,1094 +django/contrib/admin/static/admin/img/icon-addlink.svg,sha256=kBtPJJ3qeQPWeNftvprZiR51NYaZ2n_ZwJatY9-Zx1Q,331 +django/contrib/admin/static/admin/img/icon-alert.svg,sha256=aXtd9PA66tccls-TJfyECQrmdWrj8ROWKC0tJKa7twA,504 +django/contrib/admin/static/admin/img/icon-calendar.svg,sha256=_bcF7a_R94UpOfLf-R0plVobNUeeTto9UMiUIHBcSHY,1086 +django/contrib/admin/static/admin/img/icon-changelink.svg,sha256=clM2ew94bwVa2xQ6bvfKx8xLtk0i-u5AybNlyP8k-UM,380 +django/contrib/admin/static/admin/img/icon-clock.svg,sha256=k55Yv6R6-TyS8hlL3Kye0IMNihgORFjoJjHY21vtpEA,677 +django/contrib/admin/static/admin/img/icon-deletelink.svg,sha256=06XOHo5y59UfNBtO8jMBHQqmXt8UmohlSMloUuZ6d0A,392 +django/contrib/admin/static/admin/img/icon-no.svg,sha256=QqBaTrrp3KhYJxLYB5E-0cn_s4A_Y8PImYdWjfQSM-c,560 +django/contrib/admin/static/admin/img/icon-unknown-alt.svg,sha256=LyL9oJtR0U49kGHYKMxmmm1vAw3qsfXR7uzZH76sZ_g,655 +django/contrib/admin/static/admin/img/icon-unknown.svg,sha256=ePcXlyi7cob_IcJOpZ66uiymyFgMPHl8p9iEn_eE3fc,655 +django/contrib/admin/static/admin/img/icon-viewlink.svg,sha256=NL7fcy7mQOQ91sRzxoVRLfzWzXBRU59cFANOrGOwWM0,581 +django/contrib/admin/static/admin/img/icon-yes.svg,sha256=_H4JqLywJ-NxoPLqSqk9aGJcxEdZwtSFua1TuI9kIcM,436 +django/contrib/admin/static/admin/img/inline-delete.svg,sha256=Ni1z8eDYBOveVDqtoaGyEMWG5Mdnt9dniiuBWTlnr5Y,560 +django/contrib/admin/static/admin/img/search.svg,sha256=HgvLPNT7FfgYvmbt1Al1yhXgmzYHzMg8BuDLnU9qpMU,458 +django/contrib/admin/static/admin/img/selector-icons.svg,sha256=0RJyrulJ_UR9aYP7Wbvs5jYayBVhLoXR26zawNMZ0JQ,3291 +django/contrib/admin/static/admin/img/sorting-icons.svg,sha256=cCvcp4i3MAr-mo8LE_h8ZRu3LD7Ma9BtpK-p24O3lVA,1097 +django/contrib/admin/static/admin/img/tooltag-add.svg,sha256=fTZCouGMJC6Qq2xlqw_h9fFodVtLmDMrpmZacGVJYZQ,331 +django/contrib/admin/static/admin/img/tooltag-arrowright.svg,sha256=GIAqy_4Oor9cDMNC2fSaEGh-3gqScvqREaULnix3wHc,280 +django/contrib/admin/static/admin/img/gis/move_vertex_off.svg,sha256=ou-ppUNyy5QZCKFYlcrzGBwEEiTDX5mmJvM8rpwC5DM,1129 +django/contrib/admin/static/admin/img/gis/move_vertex_on.svg,sha256=DgmcezWDms_3VhgqgYUGn-RGFHyScBP0MeX8PwHy_nE,1129 +django/contrib/admin/static/admin/js/SelectBox.js,sha256=-pJXLh1cmNQoO6vSjCzs3r1SSRW79LwhHRIuqb6e-iI,5753 +django/contrib/admin/static/admin/js/SelectFilter2.js,sha256=udd2Tcy3mIirjTGRYBloPDjOj1QhG6EwNzr-D7yrFi0,12322 +django/contrib/admin/static/admin/js/actions.js,sha256=jjrnOzXX5kmAFiVPaaMhqQ3uZjs6xDR1MGPKyXh32wE,6766 +django/contrib/admin/static/admin/js/actions.min.js,sha256=wqvSFm3FGV8KnCfsA2XgxsJM7-QhBT4kLAMFKnCBMrY,3195 +django/contrib/admin/static/admin/js/autocomplete.js,sha256=LgImTP2VTEaJKqxBqvJKRa-mfenZBjeVg7LnHetaxQU,1124 +django/contrib/admin/static/admin/js/calendar.js,sha256=8ej_F8SBtoFhNmmoLwONpyVwOJHd5JBWUMe1mwgxpwE,7777 +django/contrib/admin/static/admin/js/cancel.js,sha256=fudRj-OLtq41WGdkpAsE6-gsUBpsgMivJC7n2E_zEPs,409 +django/contrib/admin/static/admin/js/change_form.js,sha256=J-beGDyqR6uyb3iW_OI9Yo0ZFrfwJVqNFFDeL7-njqA,712 +django/contrib/admin/static/admin/js/collapse.js,sha256=gRoPWDtJq4PljhSPGILwk-YueznqwMbZQRij_yhGUVs,2239 +django/contrib/admin/static/admin/js/collapse.min.js,sha256=IZVWAF7T9I3OFywxNZ2EbxmSA0TYUSF9S_v50PBk7bM,1063 +django/contrib/admin/static/admin/js/core.js,sha256=j6UsHGO_VJ9_NFRHD8PoF4e-BhT0wR1DzlxZTyG1Zyg,7099 +django/contrib/admin/static/admin/js/inlines.js,sha256=TlTcEud29JXh9Vo5HhSwFhrDqRIHgL_HueMu94RGnRs,13773 +django/contrib/admin/static/admin/js/inlines.min.js,sha256=7hU_NQKXczvSsYBNL_ClcRgP-b8o1TzOzgocZuXI8Ao,5864 +django/contrib/admin/static/admin/js/jquery.init.js,sha256=Gr-yEd61wY6uBDMhOaVq-amfciz7EZhMvJfai_WxrHE,363 +django/contrib/admin/static/admin/js/popup_response.js,sha256=7XyHe9SDYkB8OMxF7fhL6N5l4Oxf-gXqzGlpPK63tcc,569 +django/contrib/admin/static/admin/js/prepopulate.js,sha256=jBV6-T9KNi-JCczRf_bOkA9tjjWpIYbXxRhG_vNbadc,1530 +django/contrib/admin/static/admin/js/prepopulate.min.js,sha256=j3KNblf8i0JjoV5w5HAd4vEDogZ421xolYqGrzdSC9o,379 +django/contrib/admin/static/admin/js/prepopulate_init.js,sha256=uD3_ZoYfJ62mcSgqzHfePA3Y5jaOBjxn7SU0LuYFgEE,495 +django/contrib/admin/static/admin/js/timeparse.js,sha256=oVk0xpGmRjS0V2sMsjGulzMSNDvIr1gQ6_fpivvh_kQ,2984 +django/contrib/admin/static/admin/js/urlify.js,sha256=J8yD9aydZ2CB6R5zVi4KJG88m7zo5l1ScpkQqdSlJr4,8941 +django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js,sha256=ZdQsCjY1Lcp_cCIbYKwciL7SwZWrE30wcVwVUFgNUVw,20218 +django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js,sha256=9LIqZywmXGzPkc8sRJEmAsYzScCMZDM_xZrjtIjuPyE,6918 +django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt,sha256=GIg3JQapSjFSu38FkC7Wm4cW4HUcvoWPb0YdP5LxKfU,1282 +django/contrib/admin/static/admin/js/vendor/jquery/jquery.js,sha256=S56QM9rZN2QyB1f-DVE2umnlEiPFtpcfnW193zA4pxA,271817 +django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js,sha256=rVGRxDk2lHmnx1RLTVAyE2k48fa6BG4EwQ-CJbFjikY,86944 +django/contrib/admin/static/admin/js/vendor/select2/LICENSE.md,sha256=Py5KwtTr_nv_wJAqcAa1YqXiIY_0XyS08UQXZhXiqNo,1124 +django/contrib/admin/static/admin/js/vendor/select2/select2.full.js,sha256=nwWu44AW64pJgDdb4wY7wcWkfUPTfBgwjHkIsnBFUE4,161832 +django/contrib/admin/static/admin/js/vendor/select2/select2.full.min.js,sha256=FJuLxhiJiX-5Qgs0c2JYLIyJ5i0o4ccg6DQ6zgitCYY,75005 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ar.js,sha256=fgVH5qCYQqvtWwa8MGiOx4VSKCg5d_BkMbaknNoncWw,887 +django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js,sha256=WWCwFlKHxZLGDAAacF2YQr1PG6tyPXg7We5DluFuhy4,701 +django/contrib/admin/static/admin/js/vendor/select2/i18n/bg.js,sha256=Lk9-DE7eC6VpLXhcuqR8ggkcZ_AgwJEG3dLADTyMbZs,906 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ca.js,sha256=f1f8z2aYYgqr6cv7AUE_opdjU_XIUDAMvzsSvODkZpA,876 +django/contrib/admin/static/admin/js/vendor/select2/i18n/cs.js,sha256=6WZZ97shyY3gGqfAXak1RDwtD2lVkMPA0jEwwqR30d0,1236 +django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js,sha256=Q-ozOz1DL2NBOPIypU8vjoCxaCiZqJ2rY7_JBQcjrBk,818 +django/contrib/admin/static/admin/js/vendor/select2/i18n/de.js,sha256=mtjCIpmIYVw5CLf7IpjBWp6VtFzdKh_YtZFtpIeIStc,775 +django/contrib/admin/static/admin/js/vendor/select2/i18n/el.js,sha256=HbjnKG1fGks6EHWR6103C5kk8rMLE5_rsPGx9d1jxKY,1132 +django/contrib/admin/static/admin/js/vendor/select2/i18n/en.js,sha256=B-OOZousHwJa-Uuf48D4XzfPJSKCQ3vH_LidT-9KT0c,827 +django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js,sha256=yqV8yK-bz_cS9XBVDUQmbKSykDsXHcqgxlKbPyxDIdw,871 +django/contrib/admin/static/admin/js/vendor/select2/i18n/et.js,sha256=mewAy-15ytAbjTqxZrEZj3p9KebGjBMphc2mIlpgeAE,775 +django/contrib/admin/static/admin/js/vendor/select2/i18n/eu.js,sha256=pmySl5IBT6bSgcOVug5n-518CxqpGf63RUYnwfdq-m8,844 +django/contrib/admin/static/admin/js/vendor/select2/i18n/fa.js,sha256=47-FmirjxeJnuR_90g3OU4DyBYdDXSL0_8qjZ2rnI7U,1004 +django/contrib/admin/static/admin/js/vendor/select2/i18n/fi.js,sha256=CqyMDXQHszgqi0HzoPM0-DtJQGVKAHFCxQq8JDO7zxY,703 +django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js,sha256=pjC1r5EyH3ebWwWk_DF2mH0Y58yQvOEG6slmjh__SoQ,902 +django/contrib/admin/static/admin/js/vendor/select2/i18n/gl.js,sha256=WObjYM2vK4OgLqH8fS5H_25e_GjqvAOwshQEwJiUT_k,800 +django/contrib/admin/static/admin/js/vendor/select2/i18n/he.js,sha256=RHcoZ7GaEGyF6TaLim-eW4FoQHJJZkPX1XCLpxuakDg,951 +django/contrib/admin/static/admin/js/vendor/select2/i18n/hi.js,sha256=hTkDBVj8ZSlpkXv7JXNWBN3NWxc8lZPBio3ERyy5NQw,1125 +django/contrib/admin/static/admin/js/vendor/select2/i18n/hr.js,sha256=83bnotTzaNwZmyOhQYT6UlRKflq2tqTWn7Wd9SNbY18,839 +django/contrib/admin/static/admin/js/vendor/select2/i18n/hu.js,sha256=OiDzwQj-cuXGt3NNDQw1wN2jaOjob4uDPUk2mU8D5Bs,727 +django/contrib/admin/static/admin/js/vendor/select2/i18n/id.js,sha256=4ccurwgeaJOSzk97ZFplJ2j4UePW47_mZ14fd1l9k5Y,752 +django/contrib/admin/static/admin/js/vendor/select2/i18n/is.js,sha256=6XBFQypKZoXi46_cW5oCQVFnbOvV0tmbsylkIuf2jNI,773 +django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js,sha256=0u_2rM4AQ5f31vCb-GyMsqRm5UiioLlYZQML0GJZft0,876 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ja.js,sha256=iVNfAjWOdeLGYsPy54JSqQ70Q7LGO7T9BshHeos1YoQ,848 +django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js,sha256=CEd7gx5c131ZQEim-sdwFnM-8R_W4ILk3s3B59pqMcI,1065 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js,sha256=PZqna7eaSjadvZWOF-EwX0oQ9MD1jHRpRqsv3ieZXHc,854 +django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js,sha256=4aX2ESzIxXXM_45PjloFzbdOkEBvG8l0Lzbn9a07S-Y,913 +django/contrib/admin/static/admin/js/vendor/select2/i18n/lv.js,sha256=m_9yurF2g_oLJPoFsrFyyUOooOjSde5x9jLllVgYa68,872 +django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js,sha256=AzBhv0x9TUGCUeNsuSSN3UnT1wSBZhtgp9B7LoXccHs,979 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js,sha256=--btj7UZrXBbhKESfI-z_6YxYJXAlkTxPIEXateVQ54,791 +django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js,sha256=gQM3p_YY-hjZ9own3O0rZJYHqK4CYxFBJTrkTvICyK8,785 +django/contrib/admin/static/admin/js/vendor/select2/i18n/nl.js,sha256=4N5ht1J1MjVCGRqU8Dzo81MZhKeQxAo-fvMDqaiQosg,896 +django/contrib/admin/static/admin/js/vendor/select2/i18n/pl.js,sha256=ir3_tPNqhQ6ri-J3YyOlsZJrbdBvUC3ibpYsEfdMtgg,925 +django/contrib/admin/static/admin/js/vendor/select2/i18n/pt-BR.js,sha256=nfaZQpzSrOFJ0VRsxEmlH6azVlcRQpilM7-uHZbD3r0,853 +django/contrib/admin/static/admin/js/vendor/select2/i18n/pt.js,sha256=0Hmb5IG2hPFnhMzYFjMOza5OIqJEiD7WlqHy6YDNzQA,859 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js,sha256=oLsIzIZQGT7HZqhJ8DXqoiP1JE4OnSQPRBAMWXhvdSM,909 +django/contrib/admin/static/admin/js/vendor/select2/i18n/ru.js,sha256=YOIol4UzD2BGvz28zaarwdUDawpKTmEpIcvkwakmAHQ,1127 +django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js,sha256=T5nCVJX52HimSLw8yrMKTSdvLbSysaopsKtoknIoNhg,1184 +django/contrib/admin/static/admin/js/vendor/select2/i18n/sr-Cyrl.js,sha256=s5f_D0U7r2thU6UPBAJJ8rzKFUQmRgzE5Y3K07amhbk,1067 +django/contrib/admin/static/admin/js/vendor/select2/i18n/sr.js,sha256=zRM5Y0fpg0u0V7rkR4-ZgHELW2gj4YDEDa0sx_zye2o,938 +django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js,sha256=UEGr4C1Cs20s2iaMBzmWDew9hlVg8h9ZQZvVpwGnwXI,786 +django/contrib/admin/static/admin/js/vendor/select2/i18n/th.js,sha256=TbMY7IxUby7KiZKng-SEHvCavoks7d8hN77192lLfMY,951 +django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js,sha256=yqv5e--8eGpw9uZDk0GAfR0nxYnYdj5qegnFHxSAjM4,720 +django/contrib/admin/static/admin/js/vendor/select2/i18n/uk.js,sha256=LsPBQ5q5xisqXxgdV4Yf8CU8FO7mhnYRUxm7tJXNl4E,1117 +django/contrib/admin/static/admin/js/vendor/select2/i18n/vi.js,sha256=ZWpJDPBtRbDJ3YyQ4Z02Le6BRnN0gRxSAoFzYqFE7Nw,801 +django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js,sha256=J4dFzbG57aghBD5x1PmkURHSi5y6AytiJgcl9iq-3z0,769 +django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-TW.js,sha256=zqyrNXby3B33G7De41AQ-OFpy-Cgi3vTXZm_-IGnsXY,708 +django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt,sha256=tyAi9RwLIDwjSrjyBhtyJIkgOHWM469_UzZTr1MmRys,1103 +django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js,sha256=TjYx21bQgQXDFTdvSqSUh7S8TkYRjT4L4X-SlWNR8CE,128820 +django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js,sha256=E-Plu9EZfyt0PJCSYrCkHuPquVVj9V7g7jQklIOgGDU,62474 +django/contrib/admin/templates/admin/404.html,sha256=o528Ro8Q0JMgd7mtszp8nl1ADHNA12AyclVdmGQnYGc,268 +django/contrib/admin/templates/admin/500.html,sha256=AUIdN7Ka_1KRAGzvo1GvwAHCSJNIbo8oNSF07cMKcj4,527 +django/contrib/admin/templates/admin/actions.html,sha256=dLU-S_iMBWkrzc1LRJd3TKViD8lhHoGkl3ok8u4F-TI,1200 +django/contrib/admin/templates/admin/app_index.html,sha256=BSJsWtgum_H2hCxcb2xe-XJozbVOVpUBN_KTe8pcRts,385 +django/contrib/admin/templates/admin/base.html,sha256=2H2owQZumUnSZL6O80Z-wYYWKtUE1lwz4xQcBWKVmJ8,3656 +django/contrib/admin/templates/admin/base_site.html,sha256=1v0vGrcN4FNEIF_VBiQE6yf2HPdkKhag2_v0AUsaGmM,316 +django/contrib/admin/templates/admin/change_form.html,sha256=E-zUkd_ONrRG2BwHE9kHexGmKbzLhOIq16YYlgapMnE,3043 +django/contrib/admin/templates/admin/change_form_object_tools.html,sha256=jrTmQiU24E7srnWpjTkKABohw9LNoMevSqKSoS4GrqQ,395 +django/contrib/admin/templates/admin/change_list.html,sha256=Z3qYnsgVudK2kCyRgccQAaEN7MqtmWEnXzgEYadaxek,2983 +django/contrib/admin/templates/admin/change_list_object_tools.html,sha256=7usDFjSpWHUv3m4mjtRPOqgoY_heo3950PJvgvLCaC8,370 +django/contrib/admin/templates/admin/change_list_results.html,sha256=HlV3Tqxx6G4oTR8oGDP6lwEz22qrGM6VmTFLoDObww4,1569 +django/contrib/admin/templates/admin/date_hierarchy.html,sha256=I9Nj9WJb3JM_9ZBHrg4xIFku_a59U-KoqO5yuSaqVJQ,518 +django/contrib/admin/templates/admin/delete_confirmation.html,sha256=yomrRPvVB5SORbn38IGiApTvv75RUke4hHZHoBPOH8Y,2397 +django/contrib/admin/templates/admin/delete_selected_confirmation.html,sha256=BPRdmt4BerVSQnzI4wQzbTUYLYWIRdFp0TJukKTypUI,2312 +django/contrib/admin/templates/admin/filter.html,sha256=A59SgwTTgEf2iYjV0IiDIixSZ7yCu1Fs66n0Vguu-NI,330 +django/contrib/admin/templates/admin/index.html,sha256=JkWPzNip--iek76cnSycjo3GIa1dpWOHt-2C6uyu4t8,3181 +django/contrib/admin/templates/admin/invalid_setup.html,sha256=58ugkYPi6FHmS--y77fhLAdUr4PyrtGwTg6-hm0_Xxg,437 +django/contrib/admin/templates/admin/login.html,sha256=-lORxVDc8VDNcfuKzMqIgJTL5bPttOnJC2TznlfbtFE,1870 +django/contrib/admin/templates/admin/object_history.html,sha256=tjE0pTYaSM43e8QxjNabL2FmrB5wPKm8V3jpuziwPdI,1444 +django/contrib/admin/templates/admin/pagination.html,sha256=T4ssv7ALQ776tE6NKMGFmYLfoBhi4ZeMya_Up91889A,553 +django/contrib/admin/templates/admin/popup_response.html,sha256=m_9AnbMHEhmLXcJHiep4cs5MW_bG_eN_0j5z4USB0Ks,358 +django/contrib/admin/templates/admin/prepopulated_fields_js.html,sha256=Q3QxBgVvxePpiz502FjSHOS3szSlHkvUQoPe8sF1YDs,245 +django/contrib/admin/templates/admin/search_form.html,sha256=Qq_vEbQup3hzfbuCmS8pyCfzMdnm_9NUZ5iJHfLl7_M,1020 +django/contrib/admin/templates/admin/submit_line.html,sha256=LOQvzN_sZIx96s4VqeNNABGEdkMlPAaVVGqE0lEoc24,1024 +django/contrib/admin/templates/admin/auth/user/add_form.html,sha256=pMsoxDLGJDzjIkcMmKdTYEnUzZ1ESEhBeDLCW17XN5k,310 +django/contrib/admin/templates/admin/auth/user/change_password.html,sha256=qQhT2rSRdZK-VJ3Tc4H8gtAcWKh-Rsj2E7YWmEw5Hss,2339 +django/contrib/admin/templates/admin/edit_inline/stacked.html,sha256=kW6E_qrLX_qSqYOONeBsT7HaW5MT3qfTiZbqO2d0omk,2358 +django/contrib/admin/templates/admin/edit_inline/tabular.html,sha256=iNULOY_oHawtveA66nmsYB89ibRNHiOJT9K88uT6-nE,4230 +django/contrib/admin/templates/admin/includes/fieldset.html,sha256=DgcBbVUfkho33IMZGEg42Xr9P5y3ZAefFzqkxf74v1Q,1787 +django/contrib/admin/templates/admin/includes/object_delete_summary.html,sha256=i_I2BADSutoccAxARIwbP4VRlDHsag-llDOi3kjcoXw,188 +django/contrib/admin/templates/admin/widgets/clearable_file_input.html,sha256=w6Lx3NII4fh2e6BNbJ-VahriO8FA9aOB7opUalGZPjs,568 +django/contrib/admin/templates/admin/widgets/foreign_key_raw_id.html,sha256=0-PzMOEe3KSRVOBeivruUc8nJRcziIqWO-DyU8pvgEE,346 +django/contrib/admin/templates/admin/widgets/many_to_many_raw_id.html,sha256=w18JMKnPKrw6QyqIXBcdPs3YJlTRtHK5HGxj0lVkMlY,54 +django/contrib/admin/templates/admin/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 +django/contrib/admin/templates/admin/widgets/related_widget_wrapper.html,sha256=bif78V69e6H9kvo0YtWHPJYivYs1xlFNDPHPwZ-5pjc,1454 +django/contrib/admin/templates/admin/widgets/split_datetime.html,sha256=BQ9XNv3eqtvNqZZGW38VBM2Nan-5PBxokbo2Fm_wwCQ,238 +django/contrib/admin/templates/admin/widgets/url.html,sha256=Tf7PwdoKAiimfmDTVbWzRVxxUeyfhF0OlsuiOZ1tHgI,218 +django/contrib/admin/templates/registration/logged_out.html,sha256=9NdzlTMq7QQpj2ftUqZ7FPeHDv0KYbjETF8qMJVGGqI,374 +django/contrib/admin/templates/registration/password_change_done.html,sha256=ldLa6UAVgn_FiKQ9TkO2EZraTBZx1URJrRGOn-_VZJs,671 +django/contrib/admin/templates/registration/password_change_form.html,sha256=Q1-5p82B7oFkbFocUSBaelomL4u8NIadxzgbY3fE70I,2046 +django/contrib/admin/templates/registration/password_reset_complete.html,sha256=RD0DbFybLTVfHtkU4yN7HG3YXY-xs_BLVgl3vSB7czU,505 +django/contrib/admin/templates/registration/password_reset_confirm.html,sha256=a1jISSwO_3OkJD1-Q_20Sv4oB8NhEcn7dcQBcm9ipI8,1369 +django/contrib/admin/templates/registration/password_reset_done.html,sha256=ofGCzPs--2mOPLlGcTbZJAoZQkEpfwFb5reLxaKq12g,669 +django/contrib/admin/templates/registration/password_reset_email.html,sha256=d_NtuuiWTS9AZu6qObmp-lux0UkUCdA9ZUIUKyYJeHE,582 +django/contrib/admin/templates/registration/password_reset_form.html,sha256=NGW3MhDnsD3bmrLEhEtJuMaHByN79uUTyr0QJXP20Pg,966 +django/contrib/admin/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/templatetags/admin_list.py,sha256=9bs3ES12mt-2vZvuR1UvfYha8Q10JWlpWMpuhBk6ANs,17799 +django/contrib/admin/templatetags/admin_modify.py,sha256=yr73KRXuizBIiKrSsgf8jatziGrUTMF7vwfm4mHlAcg,4222 +django/contrib/admin/templatetags/admin_static.py,sha256=WQitV4udeLfD8B36sRJn7QqncP0KWc5a8A83LsIOIeU,399 +django/contrib/admin/templatetags/admin_urls.py,sha256=b_RxDLR7yLBTMe-_ylzO-m0R3ITq3ZP_pnddRyM_Nos,1791 +django/contrib/admin/templatetags/base.py,sha256=54mdDPyCnaMS4N0WNgZBJakx_e1204CNSn68vaLP5Bg,1321 +django/contrib/admin/templatetags/log.py,sha256=mxV6mvfVJo0qRCelkjRBNWfrurLABhZvGQlcp5Bn4IU,2079 +django/contrib/admin/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/admin/views/autocomplete.py,sha256=vfLa2YPZNRSHlbZXVNnlpBtTwLtY-GQ1yvvCd8D1fHY,1962 +django/contrib/admin/views/decorators.py,sha256=J4wYcyaFr_-xY1ANl6QF4cFhOupRvjjmBotN0FshVYg,658 +django/contrib/admin/views/main.py,sha256=rMEbv_0VRKCVTzrWQM4w-4f_Q1VN-tzZ5NoGcSAljuM,21004 +django/contrib/admindocs/__init__.py,sha256=oY-eBzAOwpf5g222-vlH5BWHpDzpkj_DW7_XGDj7zgI,69 +django/contrib/admindocs/apps.py,sha256=rV3aWVevgI6o8_9WY0yQ62O5CSMRRZrVwZFt1gpfKk0,216 +django/contrib/admindocs/middleware.py,sha256=AZpS3DbqX7jhGl3Va1ylGl7IXrRS-5xaBiDA8CLEyT0,1302 +django/contrib/admindocs/urls.py,sha256=zdHaV60yJMjuLqO9xU0H-j7hz1PmSsepEWZA2GH-eI0,1310 +django/contrib/admindocs/utils.py,sha256=ZxXUYcj8uyz-87jGOeKj28x4Ii-fs6qEJjk-G1O1cx4,7983 +django/contrib/admindocs/views.py,sha256=3p1uR4r0Gga1BfsVX2v2afV19Xe_VOSwTj9BF-e9swc,16619 +django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo,sha256=RnpPLulXkAXe6s5TmlkNbHWyK5R-0nGlOv-3TOFT_JU,702 +django/contrib/admindocs/locale/af/LC_MESSAGES/django.po,sha256=18HnMLlT8NzeujAJRPHGmwkKesl9Uy8Fllt3AP_lYgw,4608 +django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo,sha256=IoUExlNwqSYql6zMAuXcFt0cmkjMc_i0fb0qp7cBQlA,7286 +django/contrib/admindocs/locale/ar/LC_MESSAGES/django.po,sha256=KT8AOJeiYBk4dyJCyLnHAQJcOP3Fjw6XHOjmHsJ9pEY,7924 +django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo,sha256=d4u-2zZXnnueWm9CLSnt4TRWgZk2NMlrA6gaytJ2gdU,715 +django/contrib/admindocs/locale/ast/LC_MESSAGES/django.po,sha256=TUkc-Hm4h1kD0NKyndteW97jH6bWcJMFXUuw2Bd62qo,4578 +django/contrib/admindocs/locale/az/LC_MESSAGES/django.mo,sha256=yWjmqVrGit7XjELYepZ9R48eOKma5Wau2RkkSSiJrgc,1687 +django/contrib/admindocs/locale/az/LC_MESSAGES/django.po,sha256=wGdq-g4u8ssHHvODJB-knjZdrP6noxRW9APn_kmOz7w,4993 +django/contrib/admindocs/locale/be/LC_MESSAGES/django.mo,sha256=KY94OxY-NFsFbfZG9cFw77xw68YLDWyuYs04rxwpyU8,8185 +django/contrib/admindocs/locale/be/LC_MESSAGES/django.po,sha256=ijhluxI7Wn9PcZUDG3O8VpRsRVU6AYwZEdkUBfgXAS0,8707 +django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo,sha256=n9GdBZljKJBmfups8Zt82lpHgEWvonacXztOS6qbAjM,7837 +django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po,sha256=SrmOtJ6nOi3lrgEwr-s76jYzN7lZs05dbEwh9OFxFHU,8692 +django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo,sha256=NOKVcE8id9G1OctSly4C5lm64CgEF8dohX-Pdyt4kCM,3794 +django/contrib/admindocs/locale/bn/LC_MESSAGES/django.po,sha256=6M7LjIEjvDTjyraxz70On_TIsgqJPLW7omQ0Fz_zyfQ,6266 +django/contrib/admindocs/locale/br/LC_MESSAGES/django.mo,sha256=UsPTado4ZNJM_arSMXyuBGsKN-bCHXQZdFbh0GB3dtg,1571 +django/contrib/admindocs/locale/br/LC_MESSAGES/django.po,sha256=SHOxPSgozJbOkm8u5LQJ9VmL58ZSBmlxfOVw1fAGl2s,5139 +django/contrib/admindocs/locale/bs/LC_MESSAGES/django.mo,sha256=clvhu0z3IF5Nt0tZ85hOt4M37pnGEWeIYumE20vLpsI,1730 +django/contrib/admindocs/locale/bs/LC_MESSAGES/django.po,sha256=1-OrVWFqLpeXQFfh7JNjJtvWjVww7iB2s96dcSgLy90,5042 +django/contrib/admindocs/locale/ca/LC_MESSAGES/django.mo,sha256=RZp6R180mKEuO_zKKaMfhP8qDQge9obnuF4qKxvn7Mk,6681 +django/contrib/admindocs/locale/ca/LC_MESSAGES/django.po,sha256=xZfd_o522aYaeqISmPK9vpSuDAWS4XJ1ODULTzaDFg8,7337 +django/contrib/admindocs/locale/cs/LC_MESSAGES/django.mo,sha256=qbdYC_4t3scD3GqnJC76t31ln3xFGfqzf-QuYf2pmSg,6641 +django/contrib/admindocs/locale/cs/LC_MESSAGES/django.po,sha256=jWCCrjIsQv5sucbv9TP2BW8d9YzIRmL4NSa0uWJlSQ0,7206 +django/contrib/admindocs/locale/cy/LC_MESSAGES/django.mo,sha256=sYeCCq0CMrFWjT6rKtmFrpC09OEFpYLSI3vu9WtpVTY,5401 +django/contrib/admindocs/locale/cy/LC_MESSAGES/django.po,sha256=GhdikiXtx8Aea459uifQtBjHuTlyUeiKu0_rR_mDKyg,6512 +django/contrib/admindocs/locale/da/LC_MESSAGES/django.mo,sha256=SWw8DiXbYPQCc8nwUPOt68FRUgrd_Eb7Dw9SqKXWrhY,6458 +django/contrib/admindocs/locale/da/LC_MESSAGES/django.po,sha256=_j2DkNr1pVGMcVLA4F1lzurLyS8ElKR4w8qWyhSlUOw,7062 +django/contrib/admindocs/locale/de/LC_MESSAGES/django.mo,sha256=6KJ9OfmvE6yzBF-n6sboLq4vv_o0uhLeevUEAZj-uEo,6585 +django/contrib/admindocs/locale/de/LC_MESSAGES/django.po,sha256=y2kXww5nrZpLJZtWm45d1hUCCq2HeplU9hAtDiOj9qo,7097 +django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.mo,sha256=jJNiddLBOMe9oeadm1h4iDRUqaTmfbJ28fS3h141VCk,6836 +django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po,sha256=MQQidlh2Ljp0ChO92tVJ_gkbTC0kpEbNAMOC2F903qM,7314 +django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo,sha256=dJy15irtJqzPFc_yHS3LTeXYmPu0-bIlyrDPfbE5pSE,8598 +django/contrib/admindocs/locale/el/LC_MESSAGES/django.po,sha256=82wcERwp7_v3l66v3GKdlT-lVGhwGs8DK0184SbV3zk,9259 +django/contrib/admindocs/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/admindocs/locale/en/LC_MESSAGES/django.po,sha256=nR84XXUZlLxu-CriBHo6ljWVqGmeARQvZVvyIIF6JHY,10680 +django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.mo,sha256=BQ54LF9Tx88m-pG_QVz_nm_vqvoy6pVJzL8urSO4l1Q,486 +django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po,sha256=ho7s1uKEs9FGooyZBurvSjvFz1gDSX6R4G2ZKpF1c9Q,5070 +django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.mo,sha256=xKGbswq1kuWCbn4zCgUQUb58fEGlICIOr00oSdCgtU4,1821 +django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po,sha256=No09XHkzYVFBgZqo7bPlJk6QD9heE0oaI3JmnrU_p24,4992 +django/contrib/admindocs/locale/eo/LC_MESSAGES/django.mo,sha256=cwozZwZY0TylDQe7JguENqwGIqVhq0PCHK0htOixhsA,6391 +django/contrib/admindocs/locale/eo/LC_MESSAGES/django.po,sha256=WvbW_97wH7tBCbQqzDi0sr4hbsL74V621Bn7lFrMQ4U,6879 +django/contrib/admindocs/locale/es/LC_MESSAGES/django.mo,sha256=OYjdorHASk8cvZfzh4S1tzsB8ukZZQqEP8CJ8ZZD_-w,6673 +django/contrib/admindocs/locale/es/LC_MESSAGES/django.po,sha256=0d-YNcIC4QxJ4c0J62mqCjz7CbrgZZx1J_E4t7PPk7M,7516 +django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.mo,sha256=1-41H1OzEb3L-4LV9OfnbazGm0VQ5oPRxjOpxnjvjLA,6691 +django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po,sha256=VBSHCqICgxdcVhVH4OvIvocIlv5BOP2QI6xQBgWp3Lk,7247 +django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo,sha256=KFjQyWtSxH_kTdSJ-kNUDAFt3qVZI_3Tlpg2pdkvJfs,6476 +django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.po,sha256=dwrTVjYmueLiVPu2yiJ_fkFF8ZeRntABoVND5H2WIRI,7038 +django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo,sha256=3hZiFFVO8J9cC624LUt4lBweqmpgdksRtvt2TLq5Jqs,1853 +django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po,sha256=gNmx1QTbmyMxP3ftGXGWJH_sVGThiSe_VNKkd7M9jOY,5043 +django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.mo,sha256=sMwJ7t5GqPF496w-PvBYUneZ9uSwmi5jP-sWulhc6BM,6663 +django/contrib/admindocs/locale/es_VE/LC_MESSAGES/django.po,sha256=ZOcE0f95Q6uD9SelK6bQlKtS2c3JX9QxNYCihPdlM5o,7201 +django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo,sha256=cQwLB8r0hRdWCxp2P8atYGambrKLR18GorVlp_O995M,6402 +django/contrib/admindocs/locale/et/LC_MESSAGES/django.po,sha256=Q3hVcRl3jtexQufNAZWacz3F_VRL1IctRMXYxdXArNE,7009 +django/contrib/admindocs/locale/eu/LC_MESSAGES/django.mo,sha256=WHgK7vGaqjO4MwjBkWz2Y3ABPXCqfnwSGelazRhOiuo,6479 +django/contrib/admindocs/locale/eu/LC_MESSAGES/django.po,sha256=718XgJN7UQcHgE9ku0VyFp7Frs-cvmCTO1o-xS5kpqc,7099 +django/contrib/admindocs/locale/fa/LC_MESSAGES/django.mo,sha256=5LnONa6ZHXFffSvhtIHOc-nnbltpgasyeZK8nUkoyIs,7533 +django/contrib/admindocs/locale/fa/LC_MESSAGES/django.po,sha256=LqY_cJ3KiQ_SbRvn1gffAv4-8N64cpWuoMsJ53dm3UQ,8199 +django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo,sha256=-iPQyWSVn46CF-huqytiomENda1cM0VGAnnVRlwlezQ,6413 +django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po,sha256=AG_WPvp2-c8mQy_Gp4tUACvqN-ACKbr-jxMKb86ilKQ,6945 +django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo,sha256=Dfrp3u91kvkvJA7cwSnud9adSGWIE8iVl8V_Ku6CYZ4,6786 +django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po,sha256=ojxKajQOZkHXlNN6FE324WustYzdUu4iyjVG0bTG9vs,7313 +django/contrib/admindocs/locale/fy/LC_MESSAGES/django.mo,sha256=_xVO-FkPPoTla_R0CzktpRuafD9fuIP_G5N-Q08PxNg,476 +django/contrib/admindocs/locale/fy/LC_MESSAGES/django.po,sha256=b3CRH9bSUl_jjb9s51RlvFXp3bmsmuxTfN_MTmIIVNA,5060 +django/contrib/admindocs/locale/ga/LC_MESSAGES/django.mo,sha256=PkY5sLKd7gEIE2IkuuNJXP5RmjC-D4OODRv6KCCUDX8,1940 +django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po,sha256=-l6VME96KR1KKNACVu7oHzlhCrnkC1PaJQyskOUqOvk,5211 +django/contrib/admindocs/locale/gd/LC_MESSAGES/django.mo,sha256=g_HxI2sDlCSI4QMkXmCM1BaBLyA_zm605-lrwWklIWI,6995 +django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po,sha256=8EmFRNWJ1zAdwlK6BMgYe6aw7KwGyDkdUujaYyZJxlI,7477 +django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo,sha256=CYtHrSyH_Lw0YxmmmndEnMPU-cw5TMr-8NHUjz6v7JM,2265 +django/contrib/admindocs/locale/gl/LC_MESSAGES/django.po,sha256=0S2CJju3EIiEp6kqJIn0Jl1IyRAg2-5ovYMOW0YRtVA,5188 +django/contrib/admindocs/locale/he/LC_MESSAGES/django.mo,sha256=mWWnjeFI5eoi-al_VB03RT-7LtP7VvdUKh9EJufU-9E,7006 +django/contrib/admindocs/locale/he/LC_MESSAGES/django.po,sha256=O1shu9ypDpw9zk4_2xyVnTRX6ivw6SpXbNet-xJHedg,7505 +django/contrib/admindocs/locale/hi/LC_MESSAGES/django.mo,sha256=sZhObIxqrmFu5Y-ZOQC0JGM3ly4IVFr02yqOOOHnDag,2297 +django/contrib/admindocs/locale/hi/LC_MESSAGES/django.po,sha256=X6UfEc6q0BeaxVP_C4priFt8irhh-YGOUUzNQyVnEYY,5506 +django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo,sha256=fMsayjODNoCdbpBAk9GHtIUaGJGFz4sD9qYrguj-BQA,2550 +django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po,sha256=qi2IB-fBkGovlEz2JAQRUNE54MDdf5gjNJWXM-dIG1s,5403 +django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.mo,sha256=ft4a_FXwxSoabWHHBrX9e9g3SzQG5aYBkOAFki6OK0M,6797 +django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po,sha256=eQY8M7whVdInK2EeqaeyZCWTH33-qlB2a1IU8eF3uLs,7278 +django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo,sha256=pAK3eTIgFlPjtJw-3rkd765P78o-LhgM94O8yNBJab8,6660 +django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po,sha256=pJnWzCsWYOZhu0MjMdP3CsTe7Fff4REALZR1SmsJ22Y,7196 +django/contrib/admindocs/locale/ia/LC_MESSAGES/django.mo,sha256=KklX2loobVtA6PqHOZHwF1_A9YeVGlqORinHW09iupI,1860 +django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po,sha256=Z7btOCeARREgdH4CIJlVob_f89r2M9j55IDtTLtgWJU,5028 +django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo,sha256=ls_B8o3QtpvZj8Wbjye1ls_LqgOP3oP-6jcuJzHslkE,6367 +django/contrib/admindocs/locale/id/LC_MESSAGES/django.po,sha256=fHTl0NjPK9xFvhLwLZqgfzTRtrvs6QTpLcAtNaZSQmI,6989 +django/contrib/admindocs/locale/io/LC_MESSAGES/django.mo,sha256=5t9Vurrh6hGqKohwsZIoveGeYCsUvRBRMz9M7k9XYY8,464 +django/contrib/admindocs/locale/io/LC_MESSAGES/django.po,sha256=SVZZEmaS1WbXFRlLLGg5bzUe09pXR23TeJtHUbhyl0w,5048 +django/contrib/admindocs/locale/is/LC_MESSAGES/django.mo,sha256=pEr-_MJi4D-WpNyFaQe3tVKVLq_9V-a4eIF18B3Qyko,1828 +django/contrib/admindocs/locale/is/LC_MESSAGES/django.po,sha256=-mD5fFnL6xUqeW4MITzm8Lvx6KXq4C9DGsEM9kDluZ8,5045 +django/contrib/admindocs/locale/it/LC_MESSAGES/django.mo,sha256=AhGl2DDlIiX9AS3VSj14Hpl86Khrh0USuIIrNajfAvA,6480 +django/contrib/admindocs/locale/it/LC_MESSAGES/django.po,sha256=EWpNc6wFL9vzmTjeB323GlnyuIQ3zy3H-5swX9FIPYA,7155 +django/contrib/admindocs/locale/ja/LC_MESSAGES/django.mo,sha256=F4QwDOvTwCEzGa1E9PoX-VHkF5uJoUcHDVzGl-Fkvc0,7377 +django/contrib/admindocs/locale/ja/LC_MESSAGES/django.po,sha256=Cljuw8oHQafTq2Uw6oDhM4C0Lt_JlQKFebkpkr_zWhA,7936 +django/contrib/admindocs/locale/ka/LC_MESSAGES/django.mo,sha256=w2cHLI1O3pVt43H-h71cnNcjNNvDC8y9uMYxZ_XDBtg,4446 +django/contrib/admindocs/locale/ka/LC_MESSAGES/django.po,sha256=omKVSzNA3evF5Mk_Ud6utHql-Do7s9xDzCVQGQA0pSg,6800 +django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo,sha256=XTuWnZOdXhCFXEW4Hp0zFtUtAF0wJHaFpQqoDUTWYGw,1289 +django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po,sha256=lQWewMZncWUvGhpkgU_rtwWHcgAyvhIkrDfjFu1l-d8,4716 +django/contrib/admindocs/locale/kk/LC_MESSAGES/django.mo,sha256=mmhLzn9lo4ff_LmlIW3zZuhE77LoSUfpaMMMi3oyi38,1587 +django/contrib/admindocs/locale/kk/LC_MESSAGES/django.po,sha256=72sxLw-QDSFnsH8kuzeQcV5jx7Hf1xisBmxI8XqSCYw,5090 +django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo,sha256=Fff1K0qzialXE_tLiGM_iO5kh8eAmQhPZ0h-eB9iNOU,1476 +django/contrib/admindocs/locale/km/LC_MESSAGES/django.po,sha256=E_CaaYc4GqOPgPh2t7iuo0Uf4HSQQFWAoxSOCG-uEGU,4998 +django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo,sha256=lisxE1zzW-Spdm7hIzXxDAfS7bM-RdrAG_mQVwz9WMU,1656 +django/contrib/admindocs/locale/kn/LC_MESSAGES/django.po,sha256=fbiHUPdw_iXrOvgiIvPTJI3WPLD_T77VBfhqW6gjq1c,5178 +django/contrib/admindocs/locale/ko/LC_MESSAGES/django.mo,sha256=eZaKtL6wL4GjEnx6wKO2wJoV-BrTjGyPpKHx8pZ7Fug,6609 +django/contrib/admindocs/locale/ko/LC_MESSAGES/django.po,sha256=mlCXxR8y6pV9egVZTsCucsKAi4D-wiSSwq1wMGqHjcg,7285 +django/contrib/admindocs/locale/lb/LC_MESSAGES/django.mo,sha256=N0hKFuAdDIq5clRKZirGh4_YDLsxi1PSX3DVe_CZe4k,474 +django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po,sha256=B46-wRHMKUMcbvMCdojOCxqIVL5qVEh4Czo20Qgz6oU,5058 +django/contrib/admindocs/locale/lt/LC_MESSAGES/django.mo,sha256=KOnpaVeomKJIHcVLrkeRVnaqQHzFdYM_wXZbbqxWs4g,6741 +django/contrib/admindocs/locale/lt/LC_MESSAGES/django.po,sha256=-uzCS8193VCZPyhO8VOi11HijtBG9CWVKStFBZSXfI4,7444 +django/contrib/admindocs/locale/lv/LC_MESSAGES/django.mo,sha256=lHUI2I_Xj9zQQXReg_StrXPNvNxqme0fcjHqQO545jM,6487 +django/contrib/admindocs/locale/lv/LC_MESSAGES/django.po,sha256=uPOUrYKB-osuZ0Hg9vSSvirrKT1gdSOy1gDRHLGe9-g,7049 +django/contrib/admindocs/locale/mk/LC_MESSAGES/django.mo,sha256=8H9IpRASM7O2-Ql1doVgM9c4ybZ2KcfnJr12PpprgP4,8290 +django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po,sha256=Uew7tEljjgmslgfYJOP9JF9ELp6NbhkZG_v50CZgBg8,8929 +django/contrib/admindocs/locale/ml/LC_MESSAGES/django.mo,sha256=bm4tYwcaT8XyPcEW1PNZUqHJIds9CAq3qX_T1-iD4k4,6865 +django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po,sha256=yNINX5M7JMTbYnFqQGetKGIXqOjGJtbN2DmIW9BKQ_c,8811 +django/contrib/admindocs/locale/mn/LC_MESSAGES/django.mo,sha256=KqdcvSpqmjRfA8M4nGB9Cnu9Auj4pTu9aH07XtCep3I,7607 +django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po,sha256=PGhlnzDKyAIRzaPCbNujpxSpf_JaOG66LK_NMlnZy6I,8316 +django/contrib/admindocs/locale/mr/LC_MESSAGES/django.mo,sha256=LDGC7YRyVBU50W-iH0MuESunlRXrNfNjwjXRCBdfFVg,468 +django/contrib/admindocs/locale/mr/LC_MESSAGES/django.po,sha256=5cUgPltXyS2Z0kIKF5ER8f5DuBhwmAINJQyfHj652d0,5052 +django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo,sha256=AsdUmou0FjCiML3QOeXMdbHiaSt2GdGMcEKRJFonLOQ,1721 +django/contrib/admindocs/locale/my/LC_MESSAGES/django.po,sha256=c75V-PprKrWzgrHbfrZOpm00U_zZRzxAUr2U_j8MF4w,5189 +django/contrib/admindocs/locale/nb/LC_MESSAGES/django.mo,sha256=-bqqbUhhOeXaLpNaBPdvAOMVOcUycSn_LMc4KQZ3-cI,6346 +django/contrib/admindocs/locale/nb/LC_MESSAGES/django.po,sha256=Pinb5oYBHqxDF0X5PXcZ4ypW2awXBE4q2p3eYVjTDRo,6935 +django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo,sha256=vx3Rcm4p1TNT1NXHEVk5q6C5Cux_5zK3ozwNorGzUjk,1505 +django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po,sha256=FTpLzGCFoGAAeZjGI-ZlyaLVfUKwsV758Ca8o5AjREQ,5009 +django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo,sha256=q2AkgM7vSz-4oNmeBdkzlJ6CYeHotSz46pouZzRfrRM,6349 +django/contrib/admindocs/locale/nl/LC_MESSAGES/django.po,sha256=051HnemeTAcVvvNxkFKzYzxQso-WwM0u1pnRPJil688,6998 +django/contrib/admindocs/locale/nn/LC_MESSAGES/django.mo,sha256=Dx-A4dlDEoOKrtvis1mWfvwA2Urj-QAiKNmBy--v0oY,1662 +django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po,sha256=VAHAyol0YEaHd0TaGxaQuVUIR72QB3VUnB1ARtr-AWw,4974 +django/contrib/admindocs/locale/os/LC_MESSAGES/django.mo,sha256=zSQBgSj4jSu5Km0itNgDtbkb1SbxzRvQeZ5M9sXHI8k,2044 +django/contrib/admindocs/locale/os/LC_MESSAGES/django.po,sha256=hZlMmmqfbGmoiElGbJg7Fp791ZuOpRFrSu09xBXt6z4,5215 +django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo,sha256=yFeO0eZIksXeDhAl3CrnkL1CF7PHz1PII2kIxGA0opQ,1275 +django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po,sha256=DA5LFFLOXHIJIqrrnj9k_rqL-wr63RYX_i-IJFhBuc0,4900 +django/contrib/admindocs/locale/pl/LC_MESSAGES/django.mo,sha256=EesxAXz7TGC7Llv85MWiqgXmJboTTCXcTw-58RvOQH0,6652 +django/contrib/admindocs/locale/pl/LC_MESSAGES/django.po,sha256=F9BXW5MygjhwJ0yw672hRl7c6612caR60KOxfcaZcKM,7455 +django/contrib/admindocs/locale/pt/LC_MESSAGES/django.mo,sha256=WcXhSlbGdJgVMvydkPYYee7iOQ9SYdrLkquzgIBhVWU,6566 +django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po,sha256=J98Hxa-ApyzRevBwcAldK9bRYbkn5DFw3Z5P7SMEwx0,7191 +django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.mo,sha256=7R52AIZM0NjoASXDmNLzv4x1fePtn9Fj3HJy3iSOsz4,6601 +django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po,sha256=gIraoQfr6DLWV418adqzym7untmC4fN42WT6X057_A4,7404 +django/contrib/admindocs/locale/ro/LC_MESSAGES/django.mo,sha256=wEimPgw2SwK1LDEuAc1cw9LBO-a09LZrR0b6qcpyxXk,6755 +django/contrib/admindocs/locale/ro/LC_MESSAGES/django.po,sha256=SOA9H817U6hntoqJ5Bf5PAEXr1tMwcuG5yWE29KL4Qc,7391 +django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo,sha256=m6sfSIxFI5WJjxdSXZvDcm9A1xIxXJD2r5-UdeIbdlc,8569 +django/contrib/admindocs/locale/ru/LC_MESSAGES/django.po,sha256=i0xEq4zScDKrmRJODgIewx_kUMkmeIPxPNE42Vw9AsI,9226 +django/contrib/admindocs/locale/sk/LC_MESSAGES/django.mo,sha256=Y9vQluxcGX9liYofnZb80iwgrdLs9WneKHX4-JX4evY,6644 +django/contrib/admindocs/locale/sk/LC_MESSAGES/django.po,sha256=X9eNfQfHj-SBIEUq5beCU3l5hpVPgv5ktn7GHT__2Qc,7337 +django/contrib/admindocs/locale/sl/LC_MESSAGES/django.mo,sha256=FMg_s9ZpeRD42OsSF9bpe8pRQ7wP7-a9WWnaVliqXpU,6508 +django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po,sha256=JWO_WZAwBpXw-4FoB7rkWXGhi9aEVq1tH2fOC69rcgg,7105 +django/contrib/admindocs/locale/sq/LC_MESSAGES/django.mo,sha256=lbUhjyQWbGARQ6BggqWH1tO6kNi5lMwu-523mC9JCMA,6565 +django/contrib/admindocs/locale/sq/LC_MESSAGES/django.po,sha256=ZA_o7xIUMTVYadovn4Yxl7W54nGzPnIBjkrL66V8pAE,7081 +django/contrib/admindocs/locale/sr/LC_MESSAGES/django.mo,sha256=PyE8DXRYELzSs4RWh1jeADXOPrDEN3k-nLr8sbM1Ssw,3672 +django/contrib/admindocs/locale/sr/LC_MESSAGES/django.po,sha256=ri7v9WHXORY-3Dl-YDKGsCFfQzH-a5y8t1vT6yziIyo,6108 +django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=au90IT43VR162L2jEsYqhRpso2dvOjpCPSCFiglokTc,1932 +django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po,sha256=tJ4tHLJj0tDaVZba3WIkI0kg95_jEYWTmqXD0rFb6T8,5140 +django/contrib/admindocs/locale/sv/LC_MESSAGES/django.mo,sha256=FsErCRG8EAsZB7DhFxnvU_GeAv9gy5VC0gOYgV7-teA,6417 +django/contrib/admindocs/locale/sv/LC_MESSAGES/django.po,sha256=1sPLsQ6XXpmeIvqtKTFrsYpD39tg1ijy37iaBEmsq5Y,7042 +django/contrib/admindocs/locale/sw/LC_MESSAGES/django.mo,sha256=pyJfGL7UdPrJAVlCB3YimXxTjTfEkoZQWX-CSpDkcWc,1808 +django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po,sha256=SIywrLX1UGx4OiPxoxUYelmQ1YaY2LMa3dxynGQpHp8,4929 +django/contrib/admindocs/locale/ta/LC_MESSAGES/django.mo,sha256=8SjQ9eGGyaZGhkuDoZTdtYKuqcVyEtWrJuSabvNRUVM,1675 +django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po,sha256=k593yzVqpSQOsdpuF-rdsSLwKQU8S_QFMRpZXww__1A,5194 +django/contrib/admindocs/locale/te/LC_MESSAGES/django.mo,sha256=eAzNpYRy_G1erCcKDAMnJC4809ITRHvJjO3vpyAC_mk,1684 +django/contrib/admindocs/locale/te/LC_MESSAGES/django.po,sha256=oDg_J8JxepFKIe5m6lDKVC4YWQ_gDLibgNyQ3508VOM,5204 +django/contrib/admindocs/locale/th/LC_MESSAGES/django.mo,sha256=bHK49r45Q1nX4qv0a0jtDja9swKbDHHJVLa3gM13Cb4,2167 +django/contrib/admindocs/locale/th/LC_MESSAGES/django.po,sha256=_GMgPrD8Zs0lPKQOMlBmVu1I59yXSV42kfkrHzeiehY,5372 +django/contrib/admindocs/locale/tr/LC_MESSAGES/django.mo,sha256=qK7BooitjyWEj-KtIR6mkGVfqrAh92un_D2RDYqHfK0,6625 +django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po,sha256=9Q2F3sWt8Y5WA6y8is8BZb74g80PaazArlZmim7X40E,7235 +django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo,sha256=pQmAQOPbrBVzBqtoQ0dsFWFwC6LxA5mQZ9QPqL6pSFw,1869 +django/contrib/admindocs/locale/tt/LC_MESSAGES/django.po,sha256=NCLv7sSwvEficUOSoMJlHGqjgjYvrvm2V3j1Gkviw80,5181 +django/contrib/admindocs/locale/udm/LC_MESSAGES/django.mo,sha256=hwDLYgadsKrQEPi9HiuMWF6jiiYUSy4y-7PVNJMaNpY,618 +django/contrib/admindocs/locale/udm/LC_MESSAGES/django.po,sha256=29fpfn4p8KxxrBdg4QB0GW_l8genZVV0kYi50zO-qKs,5099 +django/contrib/admindocs/locale/uk/LC_MESSAGES/django.mo,sha256=8LrLmRaZCxJL76RqROdH49rLsvq2TVuMTfuhsp8Wfjg,8449 +django/contrib/admindocs/locale/uk/LC_MESSAGES/django.po,sha256=uxziDeiYiDJ6TVk_fiquHe-6pxrGBtgK8ZRIn92KuJQ,9279 +django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo,sha256=VNg9o_7M0Z2LC0n3_-iwF3zYmncRJHaFqqpxuPmMq84,1836 +django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po,sha256=QTg85c4Z13hMN_PnhjaLX3wx6TU4SH4hPTzNBfNVaMU,5148 +django/contrib/admindocs/locale/vi/LC_MESSAGES/django.mo,sha256=F6dyo00yeyUND_w1Ocm9SL_MUdXb60QQpmAQPto53IU,1306 +django/contrib/admindocs/locale/vi/LC_MESSAGES/django.po,sha256=JrVKjT848Y1cS4tpH-eRivFNwM-cUs886UEhY2FkTPw,4836 +django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ofyr93DAtNADnsn3OWY5fo8Rh6VL8w9DRJXeUe2zod8,6110 +django/contrib/admindocs/locale/zh_Hans/LC_MESSAGES/django.po,sha256=bMvp2QdcvV36p7SOvqGgCE6ov1nPyU-EDiHJzNVGTHI,6761 +django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=R7NJ9FsGg7h6sETHiXL8jCN6vk_R5AP5vSY9u6R2d1I,4747 +django/contrib/admindocs/locale/zh_Hant/LC_MESSAGES/django.po,sha256=lFWmaYFnY4pf8HQ1WJSAlX6HrOGIdHp_aqMb4e5pgVY,6138 +django/contrib/admindocs/templates/admin_doc/bookmarklets.html,sha256=KbUjr9cygmTvlCiilIGvDTvLuYDdvi4HqzLLK_UBAHw,1333 +django/contrib/admindocs/templates/admin_doc/index.html,sha256=o1Z-Z6Dx8jzLwjihNnhROUOUKK_ILALjWGlMYz4U8u8,1313 +django/contrib/admindocs/templates/admin_doc/missing_docutils.html,sha256=LA8fyI_q_kRmE0e99XgiIDry3GRQ7ZjAu9EYBuCLT3Q,734 +django/contrib/admindocs/templates/admin_doc/model_detail.html,sha256=OfrSMc1vE_qItQrHO6GBBkwlhOQKex03ogvJJSyr2Jg,1824 +django/contrib/admindocs/templates/admin_doc/model_index.html,sha256=ow10WgNZUa6fUCp23ZmvR-kVdYUL29i3HBJ_iwlezfw,1322 +django/contrib/admindocs/templates/admin_doc/template_detail.html,sha256=xN-QihBsDVvpAI3C219Q__FMijnxw8j-wevYkk_mxMQ,995 +django/contrib/admindocs/templates/admin_doc/template_filter_index.html,sha256=QB9_QWIvHCGACzOo6yPOZtKIoKsJM8XLVgWhb5nJxmc,1747 +django/contrib/admindocs/templates/admin_doc/template_tag_index.html,sha256=rAyUTvECyomyB9u2er8oJE_FIMbQOd1auABqEHIupzE,1703 +django/contrib/admindocs/templates/admin_doc/view_detail.html,sha256=4mNkUt1_Q8ZGsvsZ1XMirPWNzJyptYMXZVIdPo9UVMc,896 +django/contrib/admindocs/templates/admin_doc/view_index.html,sha256=ewSVys3o1hzMjKmHJFZHqBdASsJnV6BJDlvnRuAMrs4,1682 +django/contrib/auth/__init__.py,sha256=BR69jz0xC6a1r7qyMur4YG5eoB9-4snK-TSQvJWxYB0,7986 +django/contrib/auth/admin.py,sha256=YbVtoNYWSkoLWKePeJ0Pl6u6wrhaoxeS8dTd3n7hXws,8607 +django/contrib/auth/apps.py,sha256=NGdy1h4yrogCn9YZOkhnO7LcVFHZAS60j-Bb7-Rz17A,1168 +django/contrib/auth/backends.py,sha256=rYAJ-B2kL5SkQn0l8SWUxdcJeEME5cRDRYkDdjjFios,7119 +django/contrib/auth/base_user.py,sha256=gXmS3Me_xTfKTTf5PSQRxn0sPJmDp044YrncXr5xQ7U,4450 +django/contrib/auth/checks.py,sha256=eml6rKyw4rEIHxBJUcqChUdvfEh69Monyjkm9FDTOoY,6355 +django/contrib/auth/common-passwords.txt.gz,sha256=CnCdMuzzpa5EVwTpCqtO7-x3CIPsy47PWWw7GUT9C5M,81355 +django/contrib/auth/context_processors.py,sha256=Vb91feuKV9a3BBgR0hrrGmZvVPw0JyYgeA_mRX9QK1c,1822 +django/contrib/auth/decorators.py,sha256=2iowUAGrkZBzaX_Wf0UkUbd0po00UCxtdFQxXj1HIyo,2892 +django/contrib/auth/forms.py,sha256=YK-5Y73-Pwj2OqZ58EcsYv34UdMfxD97ceGZh1vedzI,15057 +django/contrib/auth/hashers.py,sha256=p6eRs4Itse8BWvhmSgvGgHO9R1A1tglyD624jsCpDZc,22084 +django/contrib/auth/middleware.py,sha256=ihtkwdqyINaDDix1w3WKE9GayaGABY88j6drV0mHGDs,5399 +django/contrib/auth/mixins.py,sha256=qdnrUp7L9WTCVimH1ULAoZcsaO5g6_2iE_pT4dea0dY,3846 +django/contrib/auth/models.py,sha256=tGyNAtuQsYxKZret2qhR3vC17m6ctg6j568TV0OwcCg,14364 +django/contrib/auth/password_validation.py,sha256=2YyJVWx6UiA1jKxfgwJVWckHXS7acEkCQAYDbKew9ew,7631 +django/contrib/auth/signals.py,sha256=_QNYY-RzkwTvY3FRo01AW1S-D9l8lVb3ebt6F1GBfMU,227 +django/contrib/auth/tokens.py,sha256=JxZ6aEPibAvAoDNTIlIrYDz8_V8UZQs8KOYKRUTJfKo,3567 +django/contrib/auth/urls.py,sha256=6M54eTFdCFEqW0pzzKND4R5-8S9JrzoPcaVt0qA3JXc,1054 +django/contrib/auth/validators.py,sha256=AXlNhfwEd2sonzVAsitbBvKLnBc9CqdGuAmjUB8mEPM,685 +django/contrib/auth/views.py,sha256=aX2frKj1DrVCs-kSusIWUIaqffzXWWXdA5oD77fXRPw,13410 +django/contrib/auth/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/auth/handlers/modwsgi.py,sha256=bTXKVMezywsn1KA2MVyDWeHvTNa2KrwIxn2olH7o_5I,1248 +django/contrib/auth/locale/af/LC_MESSAGES/django.mo,sha256=tRVmdxgSniXopRvpzie69lomr-NLoM3oqICKnxltnQw,7427 +django/contrib/auth/locale/af/LC_MESSAGES/django.po,sha256=E-HRXA5g27P73zQq3wsySxV-4o-yIwL_0-tikfkw5MU,7607 +django/contrib/auth/locale/ar/LC_MESSAGES/django.mo,sha256=lw7pjDDz5lRnSE6bvyGjdcuX06-mUxRZ6AOGreBP8o0,8705 +django/contrib/auth/locale/ar/LC_MESSAGES/django.po,sha256=3RZUD_C65heRnHppLoljc8REA_l1Df-vJ5rvhjEPr-g,9762 +django/contrib/auth/locale/ast/LC_MESSAGES/django.mo,sha256=Pt3gYY3j8Eroo4lAEmf-LR6u9U56mpE3vqLhjR4Uq-o,2250 +django/contrib/auth/locale/ast/LC_MESSAGES/django.po,sha256=Kiq4s8d1HnYpo3DQGlgUl3bOkxmgGW8CvGp9AbryRk8,5440 +django/contrib/auth/locale/az/LC_MESSAGES/django.mo,sha256=oE-fzJ6uz7Tdhs-8V9C65I-x1AakaxYR1rR8H1XqmQk,7450 +django/contrib/auth/locale/az/LC_MESSAGES/django.po,sha256=YnDzQ-iinkAcbYm_F7MHaj5-dEyVyiXtTZ_yS0IL7Kc,7691 +django/contrib/auth/locale/be/LC_MESSAGES/django.mo,sha256=YmJ7Gh14qYbk1OTHXqR4GEVdHcxGRHnpgf7xqzUKCR8,10008 +django/contrib/auth/locale/be/LC_MESSAGES/django.po,sha256=vPm5UJWEbhpoAslJhfvHyeTw6MGAfkrvSMd3EbnnmGk,10285 +django/contrib/auth/locale/bg/LC_MESSAGES/django.mo,sha256=ZwwXfAeWM92GObhxU6zzGu36KJUpkGOuEeprRMu5mZc,8751 +django/contrib/auth/locale/bg/LC_MESSAGES/django.po,sha256=_a2hoIiJRbvW3ymKAkAp-UZNk5AiUy5HqPBBby74Jew,9492 +django/contrib/auth/locale/bn/LC_MESSAGES/django.mo,sha256=cJSawQn3rNh2I57zK9vRi0r1xc598Wr26AyHh6D50ZQ,5455 +django/contrib/auth/locale/bn/LC_MESSAGES/django.po,sha256=5Vqd4n9ab98IMev4GHLxpO7f4r9nnhC3Nfx27HQNd8s,7671 +django/contrib/auth/locale/br/LC_MESSAGES/django.mo,sha256=nxLj88BBhT3Hudev1S_BRC8P6Jv7eoR8b6CHGt5eoPo,1436 +django/contrib/auth/locale/br/LC_MESSAGES/django.po,sha256=rFo68wfXMyju633KCAhg0Jcb3GVm3rk4opFQqI89d6Y,5433 +django/contrib/auth/locale/bs/LC_MESSAGES/django.mo,sha256=1i1CxyXwfskDZtItZQuEpZFlV3cpIo6Ls7Ocs0X3VTA,2963 +django/contrib/auth/locale/bs/LC_MESSAGES/django.po,sha256=C5CQ5vqjuLscWSKHVu0niGzmhxX0y-pf_eiuEr-ZmGU,5793 +django/contrib/auth/locale/ca/LC_MESSAGES/django.mo,sha256=ausOBfdpUjtBq1XQrP8tLsdC9rVVXNLOD5-C1tZ05AI,7641 +django/contrib/auth/locale/ca/LC_MESSAGES/django.po,sha256=wMkKe4lSk-kJVGd7HCJ4-PpFymyZDezvxePEF2gI2TQ,8019 +django/contrib/auth/locale/cs/LC_MESSAGES/django.mo,sha256=opNGqnxvwf68Cw8_D1tY45Pj8AV4eVTPhOK1JD2wVWY,7805 +django/contrib/auth/locale/cs/LC_MESSAGES/django.po,sha256=vCe6Lp8o9XnAywf_-W1c5UmQCPrVVWMfLLZS59IrgYc,8211 +django/contrib/auth/locale/cy/LC_MESSAGES/django.mo,sha256=lSfCwEVteW4PDaiGKPDxnSnlDUcGMkPfsxIluExZar0,4338 +django/contrib/auth/locale/cy/LC_MESSAGES/django.po,sha256=-LPAKGXNzB77lVHfCRmFlH3SUaLgOXk_YxfC0BomcEs,6353 +django/contrib/auth/locale/da/LC_MESSAGES/django.mo,sha256=NJ-Kky5bcJ2Typ8Kfu3FI7aG4qqmnzpBkd_nkO32VGc,7443 +django/contrib/auth/locale/da/LC_MESSAGES/django.po,sha256=HZHuz-_mdoBAyntlHeZnPwy8JIXoCZ351vaeF0FVz94,7790 +django/contrib/auth/locale/de/LC_MESSAGES/django.mo,sha256=Z4KFdT7BIn3DIVkwpdodfiFcvWTeVQEPUWU4QgMOYcc,7514 +django/contrib/auth/locale/de/LC_MESSAGES/django.po,sha256=plqGyseVxlR310SFqvPrkXParg-7Z-MfdNBk1UiD52Y,7919 +django/contrib/auth/locale/dsb/LC_MESSAGES/django.mo,sha256=BAAXuvUHRZYPdNoKFh1UiqBYAbyOC2SQRCpQGuW1zR4,8096 +django/contrib/auth/locale/dsb/LC_MESSAGES/django.po,sha256=UopznBtYDxdKbSenij3cIiBcdnsDhzyCnieIdVlkJEU,8350 +django/contrib/auth/locale/el/LC_MESSAGES/django.mo,sha256=tfjgL-_ZACj_GjsfR7jw1PTjxovgR51-LSo5ngtRX-U,10150 +django/contrib/auth/locale/el/LC_MESSAGES/django.po,sha256=IXkrUAGvMZrQTUb6DpdgftRkWg4aKy9vwyO6i-ajsjU,10753 +django/contrib/auth/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/auth/locale/en/LC_MESSAGES/django.po,sha256=m_pwsxUew88m8RWQ-67V473WosKFWfV2nkSTWxIyt50,7918 +django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo,sha256=74v8gY8VcSrDgsPDaIMET5frCvtzgLE8oHgX1xNWUvw,3650 +django/contrib/auth/locale/en_AU/LC_MESSAGES/django.po,sha256=lg-LFEeZXxGsNNZ656ePDvAAncjuy0LKuQxUFvQCUJk,5921 +django/contrib/auth/locale/en_GB/LC_MESSAGES/django.mo,sha256=p57gDaYVvgEk1x80Hq4Pn2SZbsp9ly3XrJ5Ttlt2yOE,3179 +django/contrib/auth/locale/en_GB/LC_MESSAGES/django.po,sha256=-yDflw5-81VOlyqkmLJN17FRuwDrhYXItFUJwx2aqpE,5787 +django/contrib/auth/locale/eo/LC_MESSAGES/django.mo,sha256=4deiZv4tbjsp2HHn3O5DAidWPpI8gfhpoLbw9Mq_0a4,7347 +django/contrib/auth/locale/eo/LC_MESSAGES/django.po,sha256=KpeJqyXFj1ns0beDaXamNC6P7Rdq0Qff9i8rfHFKQug,7671 +django/contrib/auth/locale/es/LC_MESSAGES/django.mo,sha256=fu-Qpqz4XyYu1_irM742YYT4KUFa2niDZuVo1bbXpTM,7766 +django/contrib/auth/locale/es/LC_MESSAGES/django.po,sha256=U3C1QK5ZVLREVepW6oLVnD3hBNhdlv7ZrjzzMyDLcY4,8427 +django/contrib/auth/locale/es_AR/LC_MESSAGES/django.mo,sha256=DnK67G_cBQ62T8FzOeT9UAe5dkYOOYo__cUoCRAcv8w,7920 +django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po,sha256=vcwNz5PSwMs5vOIFR-xN4ZIjYfzTOAmiYTJHAFFDaxU,8146 +django/contrib/auth/locale/es_CO/LC_MESSAGES/django.mo,sha256=K5VaKTyeV_WoKsLR1x8ZG4VQmk3azj6ZM8Phqjs81So,6529 +django/contrib/auth/locale/es_CO/LC_MESSAGES/django.po,sha256=qJywTaYi7TmeMB1sjwsiwG8GXtxAOaOX0voj7lLVZRw,7703 +django/contrib/auth/locale/es_MX/LC_MESSAGES/django.mo,sha256=WUwyvMgNFfKTRfzP4hExhNVMsZ0pee_ZT0p5mwMsu3E,7860 +django/contrib/auth/locale/es_MX/LC_MESSAGES/django.po,sha256=K-QHks0l3VP9R2LXsgcPcSIvRYlYQ7zNIkekMHr2_4o,8166 +django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo,sha256=GwpZytNHtK7Y9dqQKDiVi4SfA1AtPlk824_k7awqrdI,7415 +django/contrib/auth/locale/es_VE/LC_MESSAGES/django.po,sha256=G3mSCo_XGRUfOAKUeP_UNfWVzDPpbQrVYQt8Hv3VZVM,7824 +django/contrib/auth/locale/et/LC_MESSAGES/django.mo,sha256=DgY1GY3M_oBtdW692gk2RxcrGMiy7Eqdg2mD0iHsNVo,7432 +django/contrib/auth/locale/et/LC_MESSAGES/django.po,sha256=Wvqd4XplrtEA2dXg1SLGFgWcchkh3gPHgj8cOovQ3XU,7842 +django/contrib/auth/locale/eu/LC_MESSAGES/django.mo,sha256=K0AoFJGJJSnD1IzYqCY9qB4HZHwx-F7QaDTAGehyo7w,7396 +django/contrib/auth/locale/eu/LC_MESSAGES/django.po,sha256=y9BAASQYTTYfoTKWFVQUYs5-zPlminfJ6C5ZORD6g-s,7749 +django/contrib/auth/locale/fa/LC_MESSAGES/django.mo,sha256=7oQ_0XxUniTEDAGKLXODgouH80NdkDANKBQ749gLkok,8963 +django/contrib/auth/locale/fa/LC_MESSAGES/django.po,sha256=OUGU1vy0hLFb8Bv8V6gykbOB9Qw2Gk1MVMR7aHXS4FU,9362 +django/contrib/auth/locale/fi/LC_MESSAGES/django.mo,sha256=g8UTplFBR9rPuglnruZtE0Vo6tkhDhqbSlc1eh0DSFE,7514 +django/contrib/auth/locale/fi/LC_MESSAGES/django.po,sha256=1znv9S6mls8uwk6AVt8pYkYEG9Qr7TnHNOwL8rB6b-A,7824 +django/contrib/auth/locale/fr/LC_MESSAGES/django.mo,sha256=U1cycgOoKsx65naJRvcEa0qaI40olHZpH2I7IKluStM,8116 +django/contrib/auth/locale/fr/LC_MESSAGES/django.po,sha256=Dap58AsfuLC7Z4tWpoZzoUAP2Sz_wxRB7aUiGPHBSCA,8451 +django/contrib/auth/locale/fy/LC_MESSAGES/django.mo,sha256=95N-77SHF0AzQEer5LuBKu5n5oWf3pbH6_hQGvDrlP4,476 +django/contrib/auth/locale/fy/LC_MESSAGES/django.po,sha256=8XOzOFx-WerF7whzTie03hgO-dkbUFZneyrpZtat5JY,3704 +django/contrib/auth/locale/ga/LC_MESSAGES/django.mo,sha256=Nd02Ed9ACCY6JCCSwtiWl3DTODLFFu9Mq6JVlr5YbYk,3572 +django/contrib/auth/locale/ga/LC_MESSAGES/django.po,sha256=FQJMR5DosuKqo4vvF0NAQnjfqbH54MSzqL2-4BO4-uM,6127 +django/contrib/auth/locale/gd/LC_MESSAGES/django.mo,sha256=VviVmi6nVpH5U3za23353_MXTIkExdVJOFzdu1FDCgo,8720 +django/contrib/auth/locale/gd/LC_MESSAGES/django.po,sha256=Vn_dHeBR4q-Nb-Z14MGE9xFiDKK7eaNa8ySM0dhT-2Q,9018 +django/contrib/auth/locale/gl/LC_MESSAGES/django.mo,sha256=ZqVb1YCn_0_HyVtb_rnxmn0BSYAuKTVTFNHf2gftt5c,4022 +django/contrib/auth/locale/gl/LC_MESSAGES/django.po,sha256=YN_7iJTGc1Kh5llxHnwqq1kZmdQVMUMv1bkti30fMCI,6371 +django/contrib/auth/locale/he/LC_MESSAGES/django.mo,sha256=IbmufFuUd40JE8YBQgF4mnJZ4jENwFcJBr3oZXQnmeQ,8624 +django/contrib/auth/locale/he/LC_MESSAGES/django.po,sha256=LbZF6SdPBdItnr7_AQpFbtLjF0axZmOXRwQn6TjKzdU,8937 +django/contrib/auth/locale/hi/LC_MESSAGES/django.mo,sha256=7CxV1H37hMbgKIhnAWx-aJmipLRosJe1qg8BH2CABfw,5364 +django/contrib/auth/locale/hi/LC_MESSAGES/django.po,sha256=DU5YM6r1kd5fo40yqFXzEaNh42ezFQFQ-0dmVqkaKQ0,7769 +django/contrib/auth/locale/hr/LC_MESSAGES/django.mo,sha256=GEap3QClwCkuwQZKJE7qOZl93RRxmyyvTTnOTYaAWUo,5894 +django/contrib/auth/locale/hr/LC_MESSAGES/django.po,sha256=ALftoYSaI1U90RNDEvnaFATbw1SL0m8fNXAyl6DkSvo,7355 +django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo,sha256=PanVy6rcRBJ_Mr-BVKk8GIQOFZvtNz5Frga_GC5Ulmc,7925 +django/contrib/auth/locale/hsb/LC_MESSAGES/django.po,sha256=ZctqPoxjR1ofZ35OjDqaFi4QWcPXW6U_uGkudpOiAAc,8170 +django/contrib/auth/locale/hu/LC_MESSAGES/django.mo,sha256=JG0ZJ06LWE0XHjm7oS2n5tycMRkNGAV1qDJVkR7O45I,7691 +django/contrib/auth/locale/hu/LC_MESSAGES/django.po,sha256=3GSfUuXh7T7xH4_bLtgihH575dP63o1pSH0o7c8df2o,7999 +django/contrib/auth/locale/hy/LC_MESSAGES/django.mo,sha256=zoLe0EqIH8HQYC5XAWd8b8mA2DpbmDSEBsF-WIKX_OQ,8001 +django/contrib/auth/locale/hy/LC_MESSAGES/django.po,sha256=wIWLbz6f0n44ZcjEbZZsgoWTpzXRGND15hudr_DQ3l0,8787 +django/contrib/auth/locale/ia/LC_MESSAGES/django.mo,sha256=oTzOm7fRjn79_pU9zy6D_Ehex5FK7hjQYe4soeHhRkk,3314 +django/contrib/auth/locale/ia/LC_MESSAGES/django.po,sha256=LzJOXjj1Fa61zk3v2d-aWS48eva2S0b0jJ9r5CqiFDY,5881 +django/contrib/auth/locale/id/LC_MESSAGES/django.mo,sha256=LUcZxGYRwKz6C6nQ-AaXeYUlxjGU-7Yr6frh93xFDsI,7169 +django/contrib/auth/locale/id/LC_MESSAGES/django.po,sha256=p3i1D8-qZYdBAfhzZRIuzEJNOZm59ABx8qy5IKNFaoI,7583 +django/contrib/auth/locale/io/LC_MESSAGES/django.mo,sha256=YwAS3aWljAGXWcBhGU_GLVuGJbHJnGY8kUCE89CPdks,464 +django/contrib/auth/locale/io/LC_MESSAGES/django.po,sha256=W36JXuA1HQ72LspixRxeuvxogVxtk7ZBbT0VWI38_oM,3692 +django/contrib/auth/locale/is/LC_MESSAGES/django.mo,sha256=04pHypFYzzOUc9O0fS0n9EiPjG5w3KV96ffMYtXddrA,7540 +django/contrib/auth/locale/is/LC_MESSAGES/django.po,sha256=Pdy1izQ1K718XqGdb8OZaxY7yoTnzq300x-etW9mdvo,7890 +django/contrib/auth/locale/it/LC_MESSAGES/django.mo,sha256=msIGxB__lTtLXQT_SdoVxBN6j2RbXrbXWHxxZIhGHxA,7583 +django/contrib/auth/locale/it/LC_MESSAGES/django.po,sha256=EQqX3Zr1LsRLAdW6zqOIKl8BmS-3WBPfJe0vNM4laJ0,8067 +django/contrib/auth/locale/ja/LC_MESSAGES/django.mo,sha256=t3UJj76znV0oWwddRywtKiTeNKgmV3N3moLgEuaFZoo,8062 +django/contrib/auth/locale/ja/LC_MESSAGES/django.po,sha256=xGmVEPon-B6__imklMQ-mvcuRMEl62Czjo5wDToV7Nw,8335 +django/contrib/auth/locale/ka/LC_MESSAGES/django.mo,sha256=0QWYd58Dz5Az3OfZo7wV3o-QCre2oc5dgEPu0rnLVJI,10625 +django/contrib/auth/locale/ka/LC_MESSAGES/django.po,sha256=oCtz7gS4--mhv7biS1rIh43I4v1UpZX4DKdrB-xZ2RA,11217 +django/contrib/auth/locale/kab/LC_MESSAGES/django.mo,sha256=9qKeQ-gDByoOdSxDpSbLaM4uSP5sIi7qlTn8tJidVDs,2982 +django/contrib/auth/locale/kab/LC_MESSAGES/django.po,sha256=8cq5_rjRXPzTvn1jPo6H_Jcrv6IXkWr8n9fTPvghsS8,5670 +django/contrib/auth/locale/kk/LC_MESSAGES/django.mo,sha256=RJablrXpRba6YVB_8ACSt2q_BjmxrHQZzX6RxMJImlA,3542 +django/contrib/auth/locale/kk/LC_MESSAGES/django.po,sha256=OebwPN9iWBvjDu0P2gQyBbShvIFxFIqCw8DpKuti3xk,6360 +django/contrib/auth/locale/km/LC_MESSAGES/django.mo,sha256=FahcwnCgzEamtWcDEPOiJ4KpXCIHbnSowfSRdRQ2F9U,2609 +django/contrib/auth/locale/km/LC_MESSAGES/django.po,sha256=lvRHHIkClbt_8-9Yn0xY57dMxcS72z4sUkxLb4cohP0,5973 +django/contrib/auth/locale/kn/LC_MESSAGES/django.mo,sha256=u0YygqGJYljBZwI9rm0rRk_DdgaBEMA1etL-Lk-7Mls,4024 +django/contrib/auth/locale/kn/LC_MESSAGES/django.po,sha256=HKQ1t2yhh9OwsqvMft337VpPmi8KU8PhF2M8gKOdtXw,6951 +django/contrib/auth/locale/ko/LC_MESSAGES/django.mo,sha256=r1de3B_rb-ImWCAmmZ8_c1y7bUK3Hyi7kRvcSKCTiFg,7612 +django/contrib/auth/locale/ko/LC_MESSAGES/django.po,sha256=V4hYbR-Vj32MeFWyD4D1iQ7HhbdPx4ZNLT1FKGxepkU,8205 +django/contrib/auth/locale/lb/LC_MESSAGES/django.mo,sha256=OFhpMA1ZXhrs5fwZPO5IjubvWDiju4wfwWiV94SFkiA,474 +django/contrib/auth/locale/lb/LC_MESSAGES/django.po,sha256=dOfY9HjTfMQ0nkRYumw_3ZaywbUrTgT-oTXAnrRyfxo,3702 +django/contrib/auth/locale/lt/LC_MESSAGES/django.mo,sha256=-nlZHl7w__TsFUmBb5pQV_XJtKGsi9kzP6CBZXkfM8M,8146 +django/contrib/auth/locale/lt/LC_MESSAGES/django.po,sha256=-rdhB6eroSSemsdZkG1Jl4CruNZc_7dj4m5IVoyRBUQ,8620 +django/contrib/auth/locale/lv/LC_MESSAGES/django.mo,sha256=U5tO0SjCBU0Tx_Cu4PxnSiUEFJGWv0UIrbAr3Gas1nA,7599 +django/contrib/auth/locale/lv/LC_MESSAGES/django.po,sha256=t9BhUX5fNT7F-_Q9nCU0hdXylb0UW2Jyc6BZtYJ0neI,7908 +django/contrib/auth/locale/mk/LC_MESSAGES/django.mo,sha256=XS9dslnD_YBeD07P8WQkss1gT7GIV-qLiCx4i5_Vd_k,9235 +django/contrib/auth/locale/mk/LC_MESSAGES/django.po,sha256=QOLgcwHub9Uo318P2z6sp69MI8syIIWCcr4VOom9vfs,9799 +django/contrib/auth/locale/ml/LC_MESSAGES/django.mo,sha256=UEaqq7nnGvcZ8vqFicLiuqsuEUhEjd2FpWfyzy2HqdU,12611 +django/contrib/auth/locale/ml/LC_MESSAGES/django.po,sha256=xBROIwJb5h2LmyBLAafZ2tUlPVTAOcMgt-olq5XnPT8,13107 +django/contrib/auth/locale/mn/LC_MESSAGES/django.mo,sha256=hBYT0p3LcvIKKPtIn2NzPk_2di9L8jYrUt9j3TcVvaY,9403 +django/contrib/auth/locale/mn/LC_MESSAGES/django.po,sha256=R3wAEwnefEHZsma8J-XOn4XlLtuWYKDPLwJ99DUYmvE,9913 +django/contrib/auth/locale/mr/LC_MESSAGES/django.mo,sha256=zGuqUTqcWZZn8lZY56lf5tB0_lELn7Dd0Gj78wwO5T4,468 +django/contrib/auth/locale/mr/LC_MESSAGES/django.po,sha256=yLW9WuaBHqdp9PXoDEw7c05Vt0oOtlks5TS8oxYPAO8,3696 +django/contrib/auth/locale/my/LC_MESSAGES/django.mo,sha256=gYzFJKi15RbphgG1IHbJF3yGz3P2D9vaPoHZpA7LoH8,1026 +django/contrib/auth/locale/my/LC_MESSAGES/django.po,sha256=lH5mrq-MyY8gvrNkH2_20rkjFnbviq23wIUqIjPIgFI,5130 +django/contrib/auth/locale/nb/LC_MESSAGES/django.mo,sha256=Lg5Yf7DbiD8m_MUIYyD8u5GE3yuL5NE2DYLZ9fcaMrk,7222 +django/contrib/auth/locale/nb/LC_MESSAGES/django.po,sha256=zy1cf3zV3nFpE8ZwKKKJea2LxBw0VWZQ_F38OzlSfTY,7570 +django/contrib/auth/locale/ne/LC_MESSAGES/django.mo,sha256=x1sZcDaH6bGxtyFs0PrNmgPMKLWjQ9lYVZqvaUQySlc,8553 +django/contrib/auth/locale/ne/LC_MESSAGES/django.po,sha256=CDCIeUfJQl131zMeXHn5sFpgmh7gA5uSaapBEOtC5tM,9385 +django/contrib/auth/locale/nl/LC_MESSAGES/django.mo,sha256=TqscMRNGeqiw73bl3ftu4EQ7ZvDTGZLp1Z0_NtbW5X4,7485 +django/contrib/auth/locale/nl/LC_MESSAGES/django.po,sha256=8q5WXFzg0UxBdgMW019zEr0ObszmkWjLKvQLpbjg6dE,8169 +django/contrib/auth/locale/nn/LC_MESSAGES/django.mo,sha256=020nmL8b1yQL0ZyrDAdr0ZOsEGmNxvUpp9ISPBOVI8U,2801 +django/contrib/auth/locale/nn/LC_MESSAGES/django.po,sha256=SKgBiBM1llWFIvVjWRR0r2i3O8VcAdWe-PUhxckqmbE,5590 +django/contrib/auth/locale/os/LC_MESSAGES/django.mo,sha256=DVsYGz-31nofEjZla4YhM5L7qoBnQaYnZ4TBki03AI4,4434 +django/contrib/auth/locale/os/LC_MESSAGES/django.po,sha256=Akc1qelQWRA1DE6xseoK_zsY7SFI8SpiVflsSTUhQLw,6715 +django/contrib/auth/locale/pa/LC_MESSAGES/django.mo,sha256=PeOLukzQ_CZjWBa5FGVyBEysat4Gwv40xGMS29UKRww,3666 +django/contrib/auth/locale/pa/LC_MESSAGES/django.po,sha256=7ts9PUSuvfXGRLpfyVirJLDtsQcsVWFXDepVKUVlmtc,6476 +django/contrib/auth/locale/pl/LC_MESSAGES/django.mo,sha256=91p5VP2bZRjdzx8vNLHo-AIW03B4nq80-JNHFoa4E_c,7927 +django/contrib/auth/locale/pl/LC_MESSAGES/django.po,sha256=VwjH_beq0bu-xrLilf5hWmuGnf0TIWP4XHa2Wy7odlk,8597 +django/contrib/auth/locale/pt/LC_MESSAGES/django.mo,sha256=oyKCSXRo55UiO3-JKcodMUnK7fuOuQxQrXcU7XkWidA,7756 +django/contrib/auth/locale/pt/LC_MESSAGES/django.po,sha256=tEazw0kctJ3BaP21IblsMhno6qooOGW54zwende522Q,8128 +django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.mo,sha256=yMiLyIJPG54W-3QnrlNMRnYI9Ko90FIXM_vtUShBMrc,7554 +django/contrib/auth/locale/pt_BR/LC_MESSAGES/django.po,sha256=3ym8Ohvl_q8fh4tqnZmPkhUt_17ZDBnZB99ykuR2g9o,8420 +django/contrib/auth/locale/ro/LC_MESSAGES/django.mo,sha256=ltOJP8BImDO1eVPQ_iA4UtZm4pMfLI3HsgRKiY_Gtx8,7961 +django/contrib/auth/locale/ro/LC_MESSAGES/django.po,sha256=NHHwZ8qVGgLkBXT_r2y13ZJiWNJ2kFI20-qaZChco5o,8398 +django/contrib/auth/locale/ru/LC_MESSAGES/django.mo,sha256=tfK9L7EYNZd9d1k_EGQrDcr8ruUGJ1JbRJ3-TvJ6cR8,10482 +django/contrib/auth/locale/ru/LC_MESSAGES/django.po,sha256=nQnaxPKmCJ6N2VVJzNDNt6oeqwSxG0lfY60DSDotJ94,10959 +django/contrib/auth/locale/sk/LC_MESSAGES/django.mo,sha256=hJ_ep7FCbG4DVZawMfx4GjOPcJc4ruFSki8bkYn2l2Y,7838 +django/contrib/auth/locale/sk/LC_MESSAGES/django.po,sha256=NOYdZ3dv3Vtl-5vOwJH26Rthl-5nn4JrXgnm3i-d0bY,8199 +django/contrib/auth/locale/sl/LC_MESSAGES/django.mo,sha256=UAzD5UAqHBdiCMIPjZdouGt14xoHuo5EXDctNSDTEJk,7552 +django/contrib/auth/locale/sl/LC_MESSAGES/django.po,sha256=tUqZLZJegGLteWOQiDwFRUGayBB2j9qATmL6SMgEhb8,7943 +django/contrib/auth/locale/sq/LC_MESSAGES/django.mo,sha256=Nrfoks9rpAdeYtAvbd78imw20YrBQLbqXezC28GG5Xg,7846 +django/contrib/auth/locale/sq/LC_MESSAGES/django.po,sha256=DMF3vHqmlERrwKnlOjkWYZlChWHzcS1x2Ldcx63hD2E,8115 +django/contrib/auth/locale/sr/LC_MESSAGES/django.mo,sha256=XPJB-rwpS8c7sEH7RChft-DHllMWqUEoTFLA06Q_noc,9754 +django/contrib/auth/locale/sr/LC_MESSAGES/django.po,sha256=HPk2yuyvr9krU3CEf6p5v_4cLFG-Cu1lXsFTs1C9vmo,10010 +django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=hwAo5ishpZZ9kb9WHrSMHdxmWV9afdxOHgVEwWqb4VE,3293 +django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.po,sha256=qccS0IkO-JT504Y2uVGY5nPYfN8EA_58I9z492iQHKI,5934 +django/contrib/auth/locale/sv/LC_MESSAGES/django.mo,sha256=gdDygCzmJZghqebC_Za9BqVjy2EHS9UgrWhi0Lm5rC0,7447 +django/contrib/auth/locale/sv/LC_MESSAGES/django.po,sha256=4csJy-CtwoOYh_tN7qk6yt_A7FICPwJfgHh8gqFyiZA,7970 +django/contrib/auth/locale/sw/LC_MESSAGES/django.mo,sha256=I_lEsKuMGm07X1vM3-ReGDx2j09PGLkWcG0onC8q1uQ,5029 +django/contrib/auth/locale/sw/LC_MESSAGES/django.po,sha256=TiZS5mh0oN0e6dFEdh-FK81Vk-tdv35ngJ-EbM1yX80,6455 +django/contrib/auth/locale/ta/LC_MESSAGES/django.mo,sha256=T1t5CKEb8hIumvbOtai-z4LKj2et8sX-PgBMd0B3zuA,2679 +django/contrib/auth/locale/ta/LC_MESSAGES/django.po,sha256=X8UDNmk02X9q1leNV1qWWwPNakhvNd45mCKkQ8EpZQQ,6069 +django/contrib/auth/locale/te/LC_MESSAGES/django.mo,sha256=i9hG4thA0P-Hc-S2oX7GufWFDO4Y_LF4RcdQ22cbLyE,2955 +django/contrib/auth/locale/te/LC_MESSAGES/django.po,sha256=txND8Izv2oEjSlcsx3q6l5fEUqsS-zv-sjVVILB1Bmc,6267 +django/contrib/auth/locale/th/LC_MESSAGES/django.mo,sha256=zRpZ2xM5JEQoHtfXm2_XYdhe2FtaqH-hULJadLJ1MHU,6013 +django/contrib/auth/locale/th/LC_MESSAGES/django.po,sha256=Yhh_AQS_aM_9f_yHNNSu_3THbrU-gOoMpfiDKhkaSHo,7914 +django/contrib/auth/locale/tr/LC_MESSAGES/django.mo,sha256=MqxtamKKi0P7UmWiiNz9jGOp_obhLij6WBMZwS5La-I,7480 +django/contrib/auth/locale/tr/LC_MESSAGES/django.po,sha256=Mz7mRvzk7qBnn1yF62en2OiMlgLNuaIbwDzwz7tzhV0,8027 +django/contrib/auth/locale/tt/LC_MESSAGES/django.mo,sha256=g4pTk8QLQFCOkU29RZvR1wOd1hkOZe_o5GV9Cg5u8N4,1371 +django/contrib/auth/locale/tt/LC_MESSAGES/django.po,sha256=owkJ7iPT-zJYkuKLykfWsw8j7O8hbgzVTOD0DVv956E,5222 +django/contrib/auth/locale/udm/LC_MESSAGES/django.mo,sha256=zey19UQmS79AJFxHGrOziExPDDpJ1AbUegbCRm0x0hM,462 +django/contrib/auth/locale/udm/LC_MESSAGES/django.po,sha256=gLVgaMGg0GA3Tey1_nWIjV1lnM7czLC0XR9NFBgL2Zk,3690 +django/contrib/auth/locale/uk/LC_MESSAGES/django.mo,sha256=YEqVD82aG8LuY3WZ-q2p65M2nbgSOawv5xwHyvnsTQY,10079 +django/contrib/auth/locale/uk/LC_MESSAGES/django.po,sha256=tLWzzj6dbLutVkE5KZSWuFbQLwT2HSXLxfcz6t5XhBE,10688 +django/contrib/auth/locale/ur/LC_MESSAGES/django.mo,sha256=rippTNHoh49W19c4HDUF8G5Yo3SknL3C87Afu8YXxzA,698 +django/contrib/auth/locale/ur/LC_MESSAGES/django.po,sha256=gwSd8noEwbcvDE1Q4ZsrftvoWMwhw1J15gvdtK6E9ns,4925 +django/contrib/auth/locale/vi/LC_MESSAGES/django.mo,sha256=4YOb_ZbCI90UB01DpNsBAe6qqrc3P209Bz22FSVqvog,4703 +django/contrib/auth/locale/vi/LC_MESSAGES/django.po,sha256=1YjTrGYr04j9GtG8w0c7v71pHjHU8mHzT7tChroyfaw,6723 +django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=ADtCGX8Lb8ON84-sf-OU3LT2XOK9a_5my0lqS7xPNdY,6729 +django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po,sha256=ZfdDCQTLFcpP5737U1Rbb_lHqGktMjYKe6Mjth4FiOg,7332 +django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=Pnc78tGkY9-ZH6HaQBl4NQ6-ITp8Mt103ZoCvm65Lr4,6759 +django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.po,sha256=4N7kl30QCVVL5f3CkD7tKOd2SxP6owmBjxsPooUalzM,7130 +django/contrib/auth/management/__init__.py,sha256=9Dk5PxHrfnpYOloPc1ClI7KMLKIZtLB-eKGhd3cftm8,4938 +django/contrib/auth/management/commands/changepassword.py,sha256=y8rT5O0IILk9J0oODu_Cj-bLcmJgrPIRBoO7p2fFxXA,2548 +django/contrib/auth/management/commands/createsuperuser.py,sha256=8IG8k2wxUZCkOVF_7Cgy2houwaJnL2So3q8JqMajNEY,9454 +django/contrib/auth/migrations/0001_initial.py,sha256=bz7B12K5Ovs0aiXfZGMEbVtWAeV05JyLKDGyMrhCd_c,4960 +django/contrib/auth/migrations/0002_alter_permission_name_max_length.py,sha256=xSlhMiUbrVCPMOwmwVNAUgYjZih3t-ieALNm7rQ1OI0,347 +django/contrib/auth/migrations/0003_alter_user_email_max_length.py,sha256=bPcpCTPAJV2NgrwEa6WFfxkhbPmj5J-EqU1HM3RXtq0,389 +django/contrib/auth/migrations/0004_alter_user_username_opts.py,sha256=aN0oHoA5q2bKpJN8SnI8T9GNtTBKzLRFozL87tNh8_I,785 +django/contrib/auth/migrations/0005_alter_user_last_login_null.py,sha256=0s9ZPGWNP9HT7TmXAuChMLLwL1Ml5SdQwNs9qfy5dN4,381 +django/contrib/auth/migrations/0006_require_contenttypes_0002.py,sha256=_S7o_MhU0lAnPhDEt0kh1sBmpCLXW88VBuATERiMBlk,370 +django/contrib/auth/migrations/0007_alter_validators_add_error_messages.py,sha256=JeJpm_jyu2CbBckw4xJt0DlwQ4SDg2fyHqduRLZ1HFI,740 +django/contrib/auth/migrations/0008_alter_user_username_max_length.py,sha256=KpeVuknt_7WErQO_WLDSCMg1sJkXCXjNQ5I4u_l99kc,752 +django/contrib/auth/migrations/0009_alter_user_last_name_max_length.py,sha256=rwLs5SDzFJsDKtCfyMP6XueUPHiRvRMein3wXMzHeDk,386 +django/contrib/auth/migrations/0010_alter_group_name_max_length.py,sha256=JQ2cqUnTooqDKlZ5LcXQDbQld9xQmC3up5_wCWn1LFg,379 +django/contrib/auth/migrations/0011_update_proxy_permissions.py,sha256=_rYzmWi7I4AhV7x6xyetYJMXpz5Bo8mjg2msmZLN7NQ,2684 +django/contrib/auth/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/auth/templates/auth/widgets/read_only_password_hash.html,sha256=cMrG-iMsrVQ6Qd6T_Xz21b6WIWhXxaIwgNDW2NpDpuM,185 +django/contrib/auth/templates/registration/password_reset_subject.txt,sha256=j8rO05woNdwv8-_F6EMy6FTZGMf-Dp9usdUJXSZHs7Q,124 +django/contrib/contenttypes/__init__.py,sha256=OVcoCHYF9hFs-AnFfg2tjmdetuqx9-Zhi9pdGPAgwH4,75 +django/contrib/contenttypes/admin.py,sha256=QeElFtZgIUzCWa1QfLhb9rpb-XZSY-xalx-RNAN5CoQ,5104 +django/contrib/contenttypes/apps.py,sha256=lVmnJW7DgIc42uc0V5vZL8qxnsnVijQmgelhs3nybIE,797 +django/contrib/contenttypes/checks.py,sha256=ooW997jE1y5goWgO3dzc7tfJt5Z4tJPWRRSG1P1-AcU,1234 +django/contrib/contenttypes/fields.py,sha256=8oLvxgJtTGU6odNu694hZvZI_GKPdjUw8nFnQYeh610,26689 +django/contrib/contenttypes/forms.py,sha256=95tGX_F2KkIjoBTFQcdvraypLz6Fj3LdCLOHx-8gCrQ,3615 +django/contrib/contenttypes/models.py,sha256=5gfvYpQkhRuPN2VhyRZ56KtyMJcr9c15McKUVlV5CQI,6450 +django/contrib/contenttypes/views.py,sha256=0gyy3AjEmXD9RWfy9st8wOR7JamcUREMmUNVlkf_VIM,3545 +django/contrib/contenttypes/locale/af/LC_MESSAGES/django.mo,sha256=93nlniPFfVcxfBCs_PsLtMKrJ2BqpcofPRNYYTTlels,1070 +django/contrib/contenttypes/locale/af/LC_MESSAGES/django.po,sha256=SY04sW55-xpO_qBjv8pHoN7eqB2C5q_9CxQguMz7Q94,1244 +django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo,sha256=YXeD6WDlMQ7No_1PbR1PYE7As6GYXSQBVKkWdF_bHMo,1259 +django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.po,sha256=PHvyo3UF4beWdczghk7xqrtJEu-u4802Yn6fmQvKbtA,1504 +django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.mo,sha256=y88CPGGbwTVRmZYIipCNIWkn4OuzuxEk2QCYsBhc7RY,643 +django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po,sha256=H-qMo5ikva84ycnlmBT4XXEWhzMIw-r7J_zuqxo3wu4,1088 +django/contrib/contenttypes/locale/az/LC_MESSAGES/django.mo,sha256=aaKSEUnbZZMDDl4lrNpG6e18R73kD_-nY2A_dAtHtxw,1101 +django/contrib/contenttypes/locale/az/LC_MESSAGES/django.po,sha256=txoRBy2uMeiT7aUzjADfXnf8FF3zjmCr_mLsFbVcpXs,1314 +django/contrib/contenttypes/locale/be/LC_MESSAGES/django.mo,sha256=lQjyKyBbwBjIl1rn6itLToQIKMvG-v-TjECiGepZrnw,1394 +django/contrib/contenttypes/locale/be/LC_MESSAGES/django.po,sha256=V04WIP5qYaBOaku2AV2tNSsGKFoloDHmOjskG2o3uEM,1575 +django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo,sha256=yVH2saAhE3bVtamkCeIBDQuJpn2awfF2M7ISujswiRU,1267 +django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po,sha256=YdzC82ifG-pPY5Iy4mXIBj9Qq583g37OqZir-jpbUpc,1576 +django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo,sha256=2Z1GL6c1ukKQCMcls7R0_n4eNdH3YOXZSR8nCct7SLI,1201 +django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.po,sha256=PLjnppx0FxfGBQMuWVjo0N4sW2QYc2DAEMK6ziGWUc8,1491 +django/contrib/contenttypes/locale/br/LC_MESSAGES/django.mo,sha256=kAlOemlwBvCdktgYoV-4NpC7XFDaIue_XN7GJYzDu88,1419 +django/contrib/contenttypes/locale/br/LC_MESSAGES/django.po,sha256=BQmHVQqOc6xJWJLeAo49rl_Ogfv-lFtx18mj82jT_to,1613 +django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.mo,sha256=klj9n7AKBkTf7pIa9m9b-itsy4UlbYPnHiuvSLcFZXY,700 +django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po,sha256=pmJaMBLWbYtYFFXYBvPEvwXkTPdjQDv2WkFI5jNGmTI,1151 +django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.mo,sha256=SMwTCqtIJedetZYstY4lcKqTD9xoE4vuvyOaDRENcTg,1134 +django/contrib/contenttypes/locale/ca/LC_MESSAGES/django.po,sha256=__UUPN27_GLZxOATgFO_THR-H9e5JARo52vGyuGXrFs,1360 +django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo,sha256=pFafjdvR3gxHfVNldpTit-pDHxMqW60uWgIbU2kSZP0,1142 +django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po,sha256=_mMMJ8SsDut72o3P6sXSLOC117j3_1HN-EguH7HYnnA,1362 +django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.mo,sha256=2QyCWeXFyymoFu0Jz1iVFgOIdLtt4N1rCZATZAwiH-8,1159 +django/contrib/contenttypes/locale/cy/LC_MESSAGES/django.po,sha256=ZWDxQTHJcw1UYav1C3MX08wCFrSeJNNI2mKjzRVd6H0,1385 +django/contrib/contenttypes/locale/da/LC_MESSAGES/django.mo,sha256=wIEwYctl3CsjBou71rpRvGiR24jcVSEgQW1kNeb1Lsg,1081 +django/contrib/contenttypes/locale/da/LC_MESSAGES/django.po,sha256=k_ztS6LIORMJ0T45_XMFHMDWdvh4rMfURYbKV37Bo7Y,1346 +django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo,sha256=WdGKHOdSGoscynVfOmjXD3_NRPOoTzZNWYjYdEVzahY,1092 +django/contrib/contenttypes/locale/de/LC_MESSAGES/django.po,sha256=141sVDNz98hS_QxjyM5GEEfpvHnL8Dvbmjb_P-RtkFk,1299 +django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.mo,sha256=JfVRcAuhU7jt3iv8orjFpzFZUEWa9Tf98Z0KwKynBB0,1169 +django/contrib/contenttypes/locale/dsb/LC_MESSAGES/django.po,sha256=2vfMUWWYDKZ9K8ujm1OgYSwl04cVDUUE5-942VGz150,1346 +django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo,sha256=cGjt7dcY9L6GusXl9eQgezR9phjMqfTUixC9hFC4ORc,1323 +django/contrib/contenttypes/locale/el/LC_MESSAGES/django.po,sha256=VWwuQYX1La2lvPZJwp-cprA-jyxe0qTxxT0neb9AegM,1634 +django/contrib/contenttypes/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po,sha256=ENzOpatkejwQ6F1IwZAYsMWNGtTHAVPlKCKcVrTygSI,1106 +django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/contenttypes/locale/en_AU/LC_MESSAGES/django.po,sha256=wmxyIJtz628AbsxgkB-MjdImcIJWhcW7NV3tWbDpedg,1001 +django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.mo,sha256=_uM-jg43W7Pz8RQhMcR_o15wRkDaYD8aRcl2_NFGoNs,1053 +django/contrib/contenttypes/locale/en_GB/LC_MESSAGES/django.po,sha256=SyzwSvqAgKF8BEhXYh4598GYP583OK2GUXH1lc4iDMk,1298 +django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo,sha256=MFC-mQeWLeFry7d2EXeAf2G47YRLLKFhenGLCwo5O9A,1087 +django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po,sha256=BgQ7lRtsjD-XHaNvlHMu9AxCCqx38XdOCG4zYpKgDn4,1279 +django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo,sha256=rG5-Lt7Mutoa42O_5I2rjcQ5p0rnA2T-cDMbgxaJsYU,1142 +django/contrib/contenttypes/locale/es/LC_MESSAGES/django.po,sha256=iR5eAl6d6Ol2Ufd9hQWfau8vNG0pPKvSgTToqvGMGK8,1417 +django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.mo,sha256=iSq2trgItDc4apHlZdZey4vVJF2k38KrKQRorDvHmG8,1121 +django/contrib/contenttypes/locale/es_AR/LC_MESSAGES/django.po,sha256=ejs7IoMryYl-stXjIx7slZ3pESU-3X3NUogwIbSDHBo,1328 +django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.mo,sha256=aACo1rOrgs_BYK3AWzXEljCdAc4bC3BXpyXrwE4lzAs,1158 +django/contrib/contenttypes/locale/es_CO/LC_MESSAGES/django.po,sha256=vemhoL-sESessGmIlHoRvtWICqF2aO05WvcGesUZBRM,1338 +django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.mo,sha256=hfjH_3T9YfIhOGEE25TflbKWoiZZvmagaVW2YcNDKq8,1109 +django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po,sha256=Tkt5m04QFdBiPVbRWRh9tiyVL4K6E9Qe42xdmeVaRxQ,1303 +django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.mo,sha256=TVGDydYVg_jGfnYghk_cUFjCCtpGchuoTB4Vf0XJPYk,1152 +django/contrib/contenttypes/locale/es_VE/LC_MESSAGES/django.po,sha256=vJW37vuKYb_KpXBPmoNSqtNstFgCDlKmw-8iOoSCenU,1342 +django/contrib/contenttypes/locale/et/LC_MESSAGES/django.mo,sha256=Rs8vsaZp2RX68U_dQge4wkZQMfH8Dh1br4IWkKzfECA,1066 +django/contrib/contenttypes/locale/et/LC_MESSAGES/django.po,sha256=AIl4zK9fs3_euQMwu0ORQZWPyBrIikvQfq-fhiRu2ug,1323 +django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.mo,sha256=K0f1cXEhfg_djPzgCL9wC0iHGWF_JGIhWGFL0Y970g0,1077 +django/contrib/contenttypes/locale/eu/LC_MESSAGES/django.po,sha256=sSuVV0o8MeWN6BxlaeKcjKA3h4H29fCo1kKEtkczEp4,1344 +django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo,sha256=QNJlQhJ6b183Y8SZejokLLvH4whuJ2sadMLrm5z5ero,1171 +django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po,sha256=ELZMaN9tyEC-DIraWM_Ipv4JOq4ANvyTWEzCYmGRnRY,1427 +django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.mo,sha256=yZNZ0btS15XQPW5sGVQWqUbQ3_ZIGD0JjgMcz2-_xgU,1073 +django/contrib/contenttypes/locale/fi/LC_MESSAGES/django.po,sha256=LTt_nF73_BxrerGmK4ly__1PeesGNpWlH3CSLETMvuI,1316 +django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.mo,sha256=--hcS97AwKMSkriQKcZ9hdSF9swN732tII_b7JszY4k,1112 +django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po,sha256=yk486-Y0VCwUGQy3DjfvpM0o2UlHREVXy_SufqkkWKQ,1367 +django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.po,sha256=SB07aEGG7n4oX_5rqHB6OnjpK_K0KwFM7YxaWYNpB_4,991 +django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo,sha256=GYQYfYWbgwL3nQJR5d7XGjc5KeYYXsB0yRQJz7zxd_k,1097 +django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.po,sha256=byvw9sQ9VLVjS7Au81LcNpxOzwA29_4Al9nB1ZyV2b4,1408 +django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.mo,sha256=GXwvJ2csT38SBvqMB_YoPQ_Swcy7mhZYDEr1nQBNOgc,1191 +django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po,sha256=H4U-T07ZGgSF2LjOng5g8N-jC92SFeO5Fg9u1-g954g,1346 +django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo,sha256=gMDLuxVazSNvwLmi5AqJEsxugmDVLk8DlxseHRRoQoc,1072 +django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.po,sha256=hFPL2GH-o6XN0SKu5kqgiEaGT8lKnbi_zmlUNCn3Obg,1364 +django/contrib/contenttypes/locale/he/LC_MESSAGES/django.mo,sha256=X-91PCG5ftulkyc3zTnczlWQ62zM7-47EJkE7S__CtI,1256 +django/contrib/contenttypes/locale/he/LC_MESSAGES/django.po,sha256=NDEa2I5p29YJCEXdvmA6fyDyXTgdJsuLGeB95KPGbP8,1477 +django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.mo,sha256=KAZuQMKOvIPj3a7GrNJE3yhT70O2abCEF2GOsbwTE5A,1321 +django/contrib/contenttypes/locale/hi/LC_MESSAGES/django.po,sha256=PcsNgu2YmT0biklhwOF_nSvoGTvWVKw2IsBxIwSVAtI,1577 +django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.mo,sha256=DbOUA8ks3phsEwQvethkwZ9-ymrd36aQ6mP7OnGdpjU,1167 +django/contrib/contenttypes/locale/hr/LC_MESSAGES/django.po,sha256=722KxvayO6YXByAmO4gfsfzyVbT-HqqrLYQsr02KDc8,1445 +django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.mo,sha256=IEjKVQBez7h6phH_ozALY0sNjQmcDSAtCFn7JbBOFMg,1143 +django/contrib/contenttypes/locale/hsb/LC_MESSAGES/django.po,sha256=VlIhdng3HZ-r9XzbdJWtQ4m1UMpmdnpBLWInGMTciZE,1320 +django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo,sha256=3fpAT3FGjXjajM3Omz_vcIZ7uqmvSgr4zfB7lfMfhas,1103 +django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po,sha256=zLI8xh3t_p23EITZnZ7Dme2MXexL9Rt8chxpj8W7w9g,1336 +django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo,sha256=hKOErB5dzj44ThQ1_nZHak2-aXZlwMoxYcDWmPb3Xo8,1290 +django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.po,sha256=UeGzaghsEt9Lt5DsEzRb9KCbuphWUQwLayt4AN194ao,1421 +django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.mo,sha256=3yDFJFxh16B2WigXeJxZV9vOyRxnjZ4MAUq3T_-PHGs,1079 +django/contrib/contenttypes/locale/ia/LC_MESSAGES/django.po,sha256=4JsXrJxsMVVu9Y6OuFrwMV5L4Dglh9XJ5sp9CHDGHaA,1288 +django/contrib/contenttypes/locale/id/LC_MESSAGES/django.mo,sha256=9o50TqX6hHloHvBJbf4pkK4a554L5UmiJnp9vGfq25k,1066 +django/contrib/contenttypes/locale/id/LC_MESSAGES/django.po,sha256=xMRNmOipOt-18KLux7PrJn8NS25qMCVLxmmceR1P93s,1374 +django/contrib/contenttypes/locale/io/LC_MESSAGES/django.mo,sha256=3SSRXx4tYiMUc00LZ9kGHuvTgaWpsICEf5G208CEqgg,1051 +django/contrib/contenttypes/locale/io/LC_MESSAGES/django.po,sha256=1ku9WPcenn47DOF05HL2eRqghZeRYfklo2huYUrkeJ0,1266 +django/contrib/contenttypes/locale/is/LC_MESSAGES/django.mo,sha256=Lzl9gXdkji1Eg4vKahCW8ZIJY8U1hBs52O2hQftopPc,1086 +django/contrib/contenttypes/locale/is/LC_MESSAGES/django.po,sha256=YY0C2qJRSc1cX__k-vm4LXhJZJl731NXYe2w3gTSCGU,1351 +django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo,sha256=gr8UGpZMY39rE8z0vNEDQyxh_ZD7lC3Py8Dj4B24iHg,1098 +django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po,sha256=wycvlyGUXqjmDSg0FluwvM4XpY2NU0oaKob02Q7236s,1391 +django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.mo,sha256=U-RemvFRnmWnRDBADa3r4tlbwUFBIUCf7aLdd3sJazE,1239 +django/contrib/contenttypes/locale/ja/LC_MESSAGES/django.po,sha256=V6smnquz_1esdvNi-dmuHzRNXqs-AjfWSKq2NJq2GPY,1469 +django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.mo,sha256=1_yGL68sK0QG_mhwFAVdksiDlB57_1W5QkL7NGGE5L0,1429 +django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po,sha256=fr8rGQDWgUQSv-ZjXhSAR5P_zWLhQ7bq1cHLKIzY4bY,1649 +django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.mo,sha256=SNY0vydwLyR2ExofAHjmg1A2ykoLI7vU5Ryq-QFu5Gs,627 +django/contrib/contenttypes/locale/kk/LC_MESSAGES/django.po,sha256=PU-NAl6xUEeGV0jvJx9siVBTZIzHywL7oKc4DgUjNkc,1130 +django/contrib/contenttypes/locale/km/LC_MESSAGES/django.mo,sha256=BXifukxf48Lr0t0V3Y0GJUMhD1KiHN1wwbueoK0MW1A,678 +django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po,sha256=fTPlBbnaNbLZxjzJutGvqe33t6dWsEKiHQYaw27m7KQ,1123 +django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.mo,sha256=a4sDGaiyiWn-1jFozYI4vdAvuHXrs8gbZErP_SAUk9Y,714 +django/contrib/contenttypes/locale/kn/LC_MESSAGES/django.po,sha256=QDD_q_loZtGRlhmaqgNDtJ_5AjVFQ8fSmypvaWLOwp4,1162 +django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.mo,sha256=N6Keqbx9NmPby_m9jswXWPLTdeeM-_9SQlFbheRzpC8,1127 +django/contrib/contenttypes/locale/ko/LC_MESSAGES/django.po,sha256=bLGMv1dLIEKhsoBfuWXs_FQly0prT4udebB5uu4CexU,1338 +django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.po,sha256=dwVKpCRYmXTD9h69v5ivkZe-yFtvdZNZ3VfuyIl4olY,989 +django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.mo,sha256=HucsRl-eqfxw6ESTuXvl7IGjPGYSI9dxM5lMly_P1sc,1215 +django/contrib/contenttypes/locale/lt/LC_MESSAGES/django.po,sha256=odzYqHprxKFIrR8TzdxA4WeeMK0W0Nvn2gAVuzAsEqI,1488 +django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo,sha256=4Qk6bGcd2qjhz6j6RYGdB3E7z7X4yVZTH2X-ob7QRYI,1090 +django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.po,sha256=22qvaurZjlCA-z3JXBUikzIhAmcmdW9h-pbk0ujvQSg,1299 +django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo,sha256=KTFZWm0F4S6lmi1FX76YKOyJqIZN5cTsiTBI_D4ADHs,1258 +django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po,sha256=mQZosS90S-Bil6-EoGjs9BDWYlvOF6mtUDZ8h9NxEdE,1534 +django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo,sha256=rtmLWfuxJED-1KuqkUT8F5CU1KGJP0Of718n2Gl_gI0,1378 +django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.po,sha256=Z-kL9X9CD7rYfa4Uoykye2UgCNQlgyql0HTv1eUXAf4,1634 +django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.mo,sha256=J6kKYjUOsQxptNXDcCaY4d3dHJio4HRibRk3qfwO6Xc,1225 +django/contrib/contenttypes/locale/mn/LC_MESSAGES/django.po,sha256=x8aRJH2WQvMBBWlQt3T3vpV4yHeZXLmRTT1U0at4ZIk,1525 +django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po,sha256=FgZKD9E-By0NztUnBM4llpR59K0MJSIMZIrJYGKDqpc,983 +django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo,sha256=YYa2PFe9iJygqL-LZclfpgR6rBmIvx61JRpBkKS6Hrs,1554 +django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po,sha256=6F3nXd9mBc-msMchkC8OwAHME1x1O90xrsZp7xmynpU,1732 +django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo,sha256=RMxLSKOqQ6omrnSlAoRohWOEC0SBwYwJyO6QGaPo5KU,1081 +django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.po,sha256=xgm6KYjgFPyYM0HXu3qY6uamoyeuhJ8xR_KBWLZ6IY0,1382 +django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.mo,sha256=-zZAn5cex4PkScoZVqS74PUMThJJuovZSk3WUKZ8hnw,1344 +django/contrib/contenttypes/locale/ne/LC_MESSAGES/django.po,sha256=1ZCUkulQ9Gxb50yMKFKWaTJli2SinBeNj0KpXkKpsNE,1519 +django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.mo,sha256=QH0B253GqlbTkARxjnuxCI6B6ITSsOnVZli0qwIGRUs,1077 +django/contrib/contenttypes/locale/nl/LC_MESSAGES/django.po,sha256=lkitOZ96BK24YHAdhxY9x4IP9tSFukRWIPGGYwQDz-Q,1392 +django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.mo,sha256=jfxiglKOxjX2xdbLDnJhujJiGcbDJv3NDcUUCWrZmuU,1054 +django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po,sha256=c1sz3ssHULL1c5gpbEOy4Xo2Nh0_2ar_Zg4nECouM4k,1299 +django/contrib/contenttypes/locale/os/LC_MESSAGES/django.mo,sha256=QV533Wu-UpjV3XiCe83jlz7XGuwgRviV0ggoeMaIOIY,1116 +django/contrib/contenttypes/locale/os/LC_MESSAGES/django.po,sha256=UZahnxo8z6oWJfEz4JNHGng0EAifXYtJupB6lx0JB60,1334 +django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.mo,sha256=qacd7eywof8rvJpstNfEmbHgvDiQ9gmkcyG7gfato8s,697 +django/contrib/contenttypes/locale/pa/LC_MESSAGES/django.po,sha256=Kq2NTzdbgq8Q9jLLgV-ZJaSRj43D1dDHcRIgNnJXu-s,1145 +django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.mo,sha256=a57HnU25bDdtrep5ksckyx7BsCQSHbBvZ-W3Hp6CVDQ,1251 +django/contrib/contenttypes/locale/pl/LC_MESSAGES/django.po,sha256=KC_XKtt7QieDVfsu-uEY3eT9miIIQfs1Ied7ebQaK7A,1539 +django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.mo,sha256=MjyyKlA75YtEG9m6hm0GxKhU-cF3m1PA_j63BuIPPlE,1125 +django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po,sha256=X2Rec6LXIqPa9AVqF4J2mzYrwfls1BdUfN8XOe0zkdQ,1379 +django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.mo,sha256=fPCrA5N-k2uOHyZtBVolLM-CiFyv7luskvTKoJiDF4o,1137 +django/contrib/contenttypes/locale/pt_BR/LC_MESSAGES/django.po,sha256=x-dcuvjBVXVe4zBNxd4vbwYAMzeOCNzVFLc7S_te_fI,1414 +django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.mo,sha256=sCthDD10v7GY2cui9Jj9HK8cofVEg2WERCm6aktOM-4,1142 +django/contrib/contenttypes/locale/ro/LC_MESSAGES/django.po,sha256=n-BPEfua0Gd6FN0rsP7qAlTGbQEZ14NnDMA8jI2844Y,1407 +django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.mo,sha256=EYIBQ4DumWdn6zC8Oy2QDdMsdwDZz4patKbuhFxN1AY,1426 +django/contrib/contenttypes/locale/ru/LC_MESSAGES/django.po,sha256=YULjNSTutYL3FhT4njhz9pQiP_xmoAVuJTBb1Hzio04,1728 +django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.mo,sha256=Wkcfu7VTpa6IMqGHUH6Rra42ydbyyaLnMa6wg137E7o,1104 +django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po,sha256=oFmpjsUP8WXXd6TpObHcnM-mstebPAB4wCjsluH5EFc,1398 +django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.mo,sha256=sMML-ubI_9YdKptzeri1du8FOdKcEzJbe4Tt0J4ePFI,1147 +django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po,sha256=0zxiyzRWWDNVpNNLlcwl-OLh5sLukma1vm-kYrGHYrE,1392 +django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.mo,sha256=xXE5L6OmOz3oI9xYKyS8VKb37NDJ8buQOhjwtuMnwNs,1103 +django/contrib/contenttypes/locale/sq/LC_MESSAGES/django.po,sha256=_z4SsvtdEmT91TqVd-GXMzNK86H-6LmnWTUK4ZBi878,1276 +django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.mo,sha256=PGihuAsBD_pc1ww4UILWtWgaGhn-IsBi5leknCCrPoU,1265 +django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po,sha256=YHZOZ3UsDAL7GCZGwpVPaqC1hI-ksHt1oOzMy13Ugu4,1531 +django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=COMPdT_5SOn_x7yc27_A2gudPaTPJOCMVckSohEXLVs,1098 +django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.po,sha256=E3H73fIXuvf_00NSENk8_2f_jeKnb9GT0ICx_Wwx1XU,1381 +django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo,sha256=I5bmwlJ8jVHoJW6-uGZ6r8FRIEVdg3xQseenfnhKkpg,1066 +django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po,sha256=KybZ8wY7r_ZU0beG8plP36ba8CEMKa3MTWwbL_Sf8zg,1331 +django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.mo,sha256=XLPle0JYPPkmm5xpJRmWztMTF1_3a2ZubWE4ur2sav8,563 +django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po,sha256=jRc8Eh6VuWgqc4kM-rxjbVE3yV9uip6mOJLdD6yxGLM,1009 +django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.mo,sha256=L3eF4z9QSmIPqzEWrNk8-2uLteQUMsuxiD9VZyRuSfo,678 +django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po,sha256=iDb9lRU_-YPmO5tEQeXEZeGeFe-wVZy4k444sp_vTgw,1123 +django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo,sha256=S_UF_mZbYfScD6Z36aB-kwtTflTeX3Wt4k7z_pEcOV8,690 +django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po,sha256=aAGMMoJPg_pF9_rCNZmda5A_TvDCvQfYEL64Xdoa4jo,1135 +django/contrib/contenttypes/locale/th/LC_MESSAGES/django.mo,sha256=qilt-uZMvt0uw-zFz7-eCmkGEx3XYz7NNo9Xbq3s7uI,1186 +django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po,sha256=42F34fNEn_3yQKBBJnCLttNeyktuLVpilhMyepOd6dg,1444 +django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.mo,sha256=97r7jUJMbkhpnk4fEy-sg3oMDQU8N8A76qrXKX7CNxg,1121 +django/contrib/contenttypes/locale/tr/LC_MESSAGES/django.po,sha256=fS_Vgpat2dLaXgpT4bsUPjJx_1B_6vb25qH0vH92ZVk,1355 +django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.mo,sha256=_LQ1N04FgosdDLUYXJOEqpCB2Mg92q95cBRgYPi1MyY,659 +django/contrib/contenttypes/locale/tt/LC_MESSAGES/django.po,sha256=L7wMMpxGnpQiKd_mjv2bJpE2iqCJ8XwiXK0IN4EHSbM,1110 +django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po,sha256=YVyej0nAhhEf7knk4vCeRQhmSQeGZLhMPPXyIyWObnM,977 +django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.mo,sha256=LK_0RNZeRjH6l6F3IS_FfyGrnjjst__pSU-7SIfqMV4,1382 +django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po,sha256=hckQ42e_T3As0Yq_1yLwU3pX5wpcBdZyd7h2uin3bhw,1707 +django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo,sha256=OJs_EmDBps-9a_KjFJnrS8IqtJfd25LaSWeyG8u8UfI,671 +django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po,sha256=f0FnsaAM_qrBuCXzLnkBrW5uFfVc6pUh7S-qp4918Ng,1122 +django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.mo,sha256=kGYgEI1gHkyU4y_73mBJN1hlKC2JujVXMg6iCdWncDg,1155 +django/contrib/contenttypes/locale/vi/LC_MESSAGES/django.po,sha256=RIDUgsElfRF8bvBdUKtshizuMnupdMGAM896s7qZKD4,1439 +django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=KTYCw4pEOPOfAObHiyBQTzZBX1mY0r9095QLAZfjvQM,1062 +django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po,sha256=bJp1GCxJwVfqD-rMAWTBg9OLIKginTCMs0V6mESrVrc,1353 +django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=fPIlKpeLGhOtsbLsJOef5d5Y8jCyT9hFiOfZ1v9yFTQ,1083 +django/contrib/contenttypes/locale/zh_Hant/LC_MESSAGES/django.po,sha256=Jwtnwk0R2c2Kh7KUg0t0GKjQrMO48YUNntbCT6dIHAM,1329 +django/contrib/contenttypes/management/__init__.py,sha256=KKf4YWuuvUAOf5l2Xn5zEIR4WHA8vKQ5R5paVfYAPeM,4857 +django/contrib/contenttypes/management/commands/remove_stale_contenttypes.py,sha256=dPxDDpEOHsoRoeHYosHn59oEYYo31RPmo2dM8dTnu0U,3282 +django/contrib/contenttypes/migrations/0001_initial.py,sha256=o3bVVr-O_eUNiloAC1z-JIHDoCJQ4ifdA-6DhdVUrp8,1157 +django/contrib/contenttypes/migrations/0002_remove_content_type_name.py,sha256=4h1AUWSWAvwfEMAaopJZce-yNj1AVpCYFAk2E-Ur-wM,1103 +django/contrib/contenttypes/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/__init__.py,sha256=pa6Mmr3sfZ2KBkXHAvYIw_haRx8tSqTNZluUKg5zQCk,69 +django/contrib/flatpages/admin.py,sha256=m_TsFRA36bunPrg2dSdxDJpWLfJkiaVmE3kcYAO9trY,654 +django/contrib/flatpages/apps.py,sha256=EMKrGuulQwqXlcGKRvmISVaiqSNVwwUetEeEo3PTjxA,198 +django/contrib/flatpages/forms.py,sha256=hz310DhZusEvLUxCJXIpMMc_ZTwuc-HYPNHDo1IdHYA,2379 +django/contrib/flatpages/middleware.py,sha256=aXeOeOkUmpdkGOyqZnkR-l1VrDQ161RWIWa3WPBhGac,784 +django/contrib/flatpages/models.py,sha256=LDnyMzLbmSmpmEemdgzrx2urg8PtnRgY2jxbC-uQH9g,1483 +django/contrib/flatpages/sitemaps.py,sha256=0WGMLfr61H5aVX1inE4X_BJhx2b_lw4LKMO4OQGiDX4,554 +django/contrib/flatpages/urls.py,sha256=v_bP8Axlf0XLgb2kJVdEPDqW8WY7RkwSwm7_BH_0eWE,179 +django/contrib/flatpages/views.py,sha256=DLrol_x7lYfvd_b8EYgFeOYled3TgSoR-KZOOaTzJAQ,2747 +django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo,sha256=c0XEKXJYgpy2snfmWFPQqeYeVla1F5s_wXIBaioiyPc,2297 +django/contrib/flatpages/locale/af/LC_MESSAGES/django.po,sha256=_psp14JfICDxrKx_mKF0uLnItkJPkCNMvrNOyE35nFw,2428 +django/contrib/flatpages/locale/ar/LC_MESSAGES/django.mo,sha256=G1GCOfhvPoJA5XpI3hE6zIxyhgec1ZUjHEt4lprfRr4,2475 +django/contrib/flatpages/locale/ar/LC_MESSAGES/django.po,sha256=ZypIMRzRQA72sV4lVB8RVUtLjcmbqhow97-e20R02uk,2732 +django/contrib/flatpages/locale/ast/LC_MESSAGES/django.mo,sha256=4SEsEE2hIZJwQUNs8jDgN6qVynnUYJUIE4w-usHKA6M,924 +django/contrib/flatpages/locale/ast/LC_MESSAGES/django.po,sha256=5UlyS59bVo1lccM6ZgdYSgHe9NLt_WeOdXX-swLKubU,1746 +django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo,sha256=_7vXhoLm5K8LuzkNOXK-D0DIP0XFF-EcDM0DPF-BZjI,2235 +django/contrib/flatpages/locale/az/LC_MESSAGES/django.po,sha256=HDo3gW0Pz4L3KZkVJMbFfFKrgMTjXuPAtgBMArsR78I,2496 +django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo,sha256=N1snVmwE9oa2Hi_77quF7DhOFJwFNdv07x6pSXF_hKE,2801 +django/contrib/flatpages/locale/be/LC_MESSAGES/django.po,sha256=4iBnHyRJ1XkixqUWrmxfMlmKsqyZYhMb3zsI0aLIJwY,2933 +django/contrib/flatpages/locale/bg/LC_MESSAGES/django.mo,sha256=p3RZmS9PAqdlAmbc7UswSoG0t1eeuXYDp1WZ3mWfFow,2569 +django/contrib/flatpages/locale/bg/LC_MESSAGES/django.po,sha256=DqRp9KTLxks9tNEXs2g_jvIp7dI92jXLkKNDNyLhHac,2779 +django/contrib/flatpages/locale/bn/LC_MESSAGES/django.mo,sha256=2oK2Rm0UtAI7QFRwpUR5aE3-fOltE6kTilsTbah737Y,2988 +django/contrib/flatpages/locale/bn/LC_MESSAGES/django.po,sha256=QrbX69iqXOD6oByLcgPkD1QzAkfthpfTjezIFQ-6kVg,3172 +django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo,sha256=SKbykdilX_NcpkVi_lHF8LouB2G49ZAzdF09xw49ERc,2433 +django/contrib/flatpages/locale/br/LC_MESSAGES/django.po,sha256=O_mwrHIiEwV4oB1gZ7Yua4nVKRgyIf3j5UtedZWAtwk,2783 +django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo,sha256=bd7ID7OsEhp57JRw_TXoTwsVQNkFYiR_sxSkgi4WvZU,1782 +django/contrib/flatpages/locale/bs/LC_MESSAGES/django.po,sha256=IyFvI5mL_qesEjf6NO1nNQbRHhCAZQm0UhIpmGjrSwQ,2233 +django/contrib/flatpages/locale/ca/LC_MESSAGES/django.mo,sha256=EyMOB0PboHHBg90oMvqLkfTBhBv8tgCAhvIHva8udr4,2258 +django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po,sha256=5rpcdQuv5FhvhJ0N_H5iDEuCM7eHEtwjUdG5GD_mYto,2567 +django/contrib/flatpages/locale/cs/LC_MESSAGES/django.mo,sha256=mAPPhi7qRIrOnT-crPpFZ3fZWHreToq97o_jKHiRn0w,2359 +django/contrib/flatpages/locale/cs/LC_MESSAGES/django.po,sha256=JKPt_Umqavcp1sKny9fuiCcKg6F0UXtF47ILPBFPFBo,2584 +django/contrib/flatpages/locale/cy/LC_MESSAGES/django.mo,sha256=zr_2vsDZsrby3U8AmvlJMU3q1U_4IrrTmz6oS29OWtQ,2163 +django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po,sha256=E_NC_wtuhWKYKB3YvYGB9ccJgKI3AfIZlB2HpXSyOsk,2370 +django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo,sha256=XRWvKh9BpeKH1nuSm30RBC4UTfCfKZ7QRhvFLDnvaPg,2288 +django/contrib/flatpages/locale/da/LC_MESSAGES/django.po,sha256=2egDWU6gdtu7ZXOTlF6KmFGySE4xrYnVhib0JxZXhJs,2553 +django/contrib/flatpages/locale/de/LC_MESSAGES/django.mo,sha256=v4pUUVzPH3UBtzBuCBSJsHYzaltnzB-0rI-ls6h1e1M,2216 +django/contrib/flatpages/locale/de/LC_MESSAGES/django.po,sha256=ArWO6LbvSwJmStJLmdUXeXuMS_EtHeQc-4V235941Bk,2378 +django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.mo,sha256=N4BRieE_dA-ggQLtG3XouzmilwPw7yyQWhIibqOnt-0,2398 +django/contrib/flatpages/locale/dsb/LC_MESSAGES/django.po,sha256=pAsTk2Eo9Qn2C_ichVi4TsqLEbMuckAAGs5hLwL5h98,2537 +django/contrib/flatpages/locale/el/LC_MESSAGES/django.mo,sha256=WxBbtlMvLwH2e7KUP7RcrxgEHP4DC9MKiO_KLCuFbmc,2870 +django/contrib/flatpages/locale/el/LC_MESSAGES/django.po,sha256=oIgwZoftZQVOrfsTDdL8iN9CpPN7UdmkCfpFOJoNHt0,3141 +django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/flatpages/locale/en/LC_MESSAGES/django.po,sha256=7L4raxmh---knOc4LRFyRQxJhzUN-XjPDD_XIOIK3fs,2151 +django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.mo,sha256=cuifXT2XlF4c_bR6ECRhlraSZyA7q4ZLhUgwvW73miw,486 +django/contrib/flatpages/locale/en_AU/LC_MESSAGES/django.po,sha256=ZMAJRrjovd_cdWvzkuEiJ-9ZU9rqRTwoA3x8uY2khcs,1533 +django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.mo,sha256=7zyXYOsqFkUGxclW-VPPxrQTZKDuiYQ7MQJy4m8FClo,1989 +django/contrib/flatpages/locale/en_GB/LC_MESSAGES/django.po,sha256=oHrBd6lVnO7-SdnO-Taa7iIyiqp_q2mQZjkuuU3Qa_s,2232 +django/contrib/flatpages/locale/eo/LC_MESSAGES/django.mo,sha256=EiyCzj22pdY0PboTmlaPgZdwRiuGuevHHzJcgU96su0,2295 +django/contrib/flatpages/locale/eo/LC_MESSAGES/django.po,sha256=WXTOk4Al2MlbfgWcHqBcwiY8HEzjVynds_3o-XJqhfg,2578 +django/contrib/flatpages/locale/es/LC_MESSAGES/django.mo,sha256=aglISA-piajtIN46RnR2cBSV7tECsiLuXkpEqdGe9Bk,2293 +django/contrib/flatpages/locale/es/LC_MESSAGES/django.po,sha256=mvQNUGNYQQR_-T0UOAB5UpabocGNbn4kUk4mL0SOPVs,2674 +django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.mo,sha256=sNjmbLHdYbmaNHXiEPcOxwKnQbtGThOkNP8irx0sUvw,2282 +django/contrib/flatpages/locale/es_AR/LC_MESSAGES/django.po,sha256=BnT81w4T9nrYnOyb0FpCFcaYwXDMYu7gQdclo4txIN0,2453 +django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.mo,sha256=jt8wzeYky5AEnoNuAv8W4nGgd45XsMbpEdRuLnptr3U,2140 +django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po,sha256=xrbAayPoxT7yksXOGPb-0Nc-4g14UmWANaKTD4ItAFA,2366 +django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo,sha256=Y5IOKRzooJHIhJzD9q4PKOe39Z4Rrdz8dBKuvmGkqWU,2062 +django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.po,sha256=Y-EXhw-jISttA9FGMz7gY_kB-hQ3wEyKEaOc2gu2hKQ,2246 +django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.mo,sha256=EI6WskepXUmbwCPBNFKqLGNcWFVZIbvXayOHxOCLZKo,2187 +django/contrib/flatpages/locale/es_VE/LC_MESSAGES/django.po,sha256=ipG6a0A2d0Pyum8GcknA-aNExVLjSyuUqbgHM9VdRQo,2393 +django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo,sha256=1pqbiN3UlyuN26dXLazlUUZudJEjyjaPEb2D2jejd38,2095 +django/contrib/flatpages/locale/et/LC_MESSAGES/django.po,sha256=4yQAnUtnnqzAjRAAZD95Z69gLqkXgDVko4xeg24dOaU,2302 +django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo,sha256=FoKazUkuPpDgsEEI6Gm-xnZYVHtxILiy6Yzvnu8y-L0,2244 +django/contrib/flatpages/locale/eu/LC_MESSAGES/django.po,sha256=POPFB5Jd8sE9Z_ivYSdnet14u-aaXneTUNDMuOrJy00,2478 +django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo,sha256=Zc-OsiwBJYrvVY6tefxec0VC97uD8__foLTLT_V0rCY,2459 +django/contrib/flatpages/locale/fa/LC_MESSAGES/django.po,sha256=H48bg8qlnzAQn22fEYZbYV_PhTiTao7KAezN5BekDyE,2717 +django/contrib/flatpages/locale/fi/LC_MESSAGES/django.mo,sha256=K_-A8ccHnFcWnViuPAKR7IxhcG0YWNG7iCKYOxxXgMg,2127 +django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po,sha256=-Ik04K4va6HcOoG8bWukAsHThf3IWREZGeRzewYfC7o,2366 +django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo,sha256=kQFHWfmTka0I_ZbNsabcjT-CqYESevreU-khAsoKLAk,2452 +django/contrib/flatpages/locale/fr/LC_MESSAGES/django.po,sha256=9LmqH-vI0ZMlZTbfsPS4_kKsPLeUJUKrCAzYXMqrA3E,2726 +django/contrib/flatpages/locale/fy/LC_MESSAGES/django.mo,sha256=DRsFoZKo36F34XaiQg_0KUOr3NS_MG3UHptzOI4uEAU,476 +django/contrib/flatpages/locale/fy/LC_MESSAGES/django.po,sha256=9JIrRVsPL1m0NPN6uHiaAYxJXHp5IghZmQhVSkGo5g8,1523 +django/contrib/flatpages/locale/ga/LC_MESSAGES/django.mo,sha256=KKvDhZULHQ4JQ_31ltLkk88H2BKUbBXDQFSvdKFqjn8,2191 +django/contrib/flatpages/locale/ga/LC_MESSAGES/django.po,sha256=Yat7oU2XPQFQ8vhNq1nJFAlX2rqfxz4mjpU5TcnaYO8,2400 +django/contrib/flatpages/locale/gd/LC_MESSAGES/django.mo,sha256=FC4qtdjuLYBtEtORo74AaRAQF4FUdj4RWg6Bn1wpY3c,2295 +django/contrib/flatpages/locale/gd/LC_MESSAGES/django.po,sha256=SYC8csqVmTyI1OYFj41YSHcm_WEo0O8BK_VbIBC1Cng,2423 +django/contrib/flatpages/locale/gl/LC_MESSAGES/django.mo,sha256=VXyPsc6cXB97dJJFGfD8Oh2lYpn8TFYjIOeFUQeYpVU,2039 +django/contrib/flatpages/locale/gl/LC_MESSAGES/django.po,sha256=MzE7lepmRu60wy9gn6Wxx-LtKIO9JwScSdJ3SyLRU9s,2366 +django/contrib/flatpages/locale/he/LC_MESSAGES/django.mo,sha256=3IzEeNWqOl9OA3eD1wGYtj9mNjBiqrb9ZstkyTL_l-w,2548 +django/contrib/flatpages/locale/he/LC_MESSAGES/django.po,sha256=JVNRxTOdAHlpyC3Ctw0i1nj0sFMbBQSete8quWAA-Q4,2777 +django/contrib/flatpages/locale/hi/LC_MESSAGES/django.mo,sha256=w29ukoF48C7iJ6nE045YoWi7Zcrgu_oXoxT-r6gcQy8,2770 +django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po,sha256=nXq5y1FqMGVhpXpQVdV3uU5JcUtBc2BIrf-n__C2q30,3055 +django/contrib/flatpages/locale/hr/LC_MESSAGES/django.mo,sha256=Mt4gpBuUXvcBl8K714ls4PimHQqee82jFxY1BEAYQOE,2188 +django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po,sha256=ZbUMJY6a-os-xDmcDCJNrN4-YqRe9b_zJ4V5gt2wlGI,2421 +django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.mo,sha256=ITxM4Yl1IvKC3PIh4nrVWfU4i52KIMSRUbUgotA-tuY,2384 +django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po,sha256=S69IIggzzgv1RaJQmCXTy6kRLbd3kqS9TI5DgT0gWtY,2520 +django/contrib/flatpages/locale/hu/LC_MESSAGES/django.mo,sha256=2oz-UfEsdxUxkftZPLWb3JkF4f8Pvx0UWjCoawOJj_s,2263 +django/contrib/flatpages/locale/hu/LC_MESSAGES/django.po,sha256=L4zzF9itlShNCPqbNyU12-Tffigm4cklvkEueYx9euQ,2528 +django/contrib/flatpages/locale/hy/LC_MESSAGES/django.mo,sha256=qocNtyLcQpjmGqQ130VGjJo-ruaOCtfmZehS9If_hWk,2536 +django/contrib/flatpages/locale/hy/LC_MESSAGES/django.po,sha256=WD8ohMnsaUGQItyqQmS46d76tKgzhQ17X_tGevqULO0,2619 +django/contrib/flatpages/locale/ia/LC_MESSAGES/django.mo,sha256=bochtCPlc268n0WLF0bJtUUT-XveZLPOZPQUetnOWfU,500 +django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po,sha256=gOJ850e8sFcjR2G79zGn3_0-9-KSy591i7ketBRFjyw,1543 +django/contrib/flatpages/locale/id/LC_MESSAGES/django.mo,sha256=Rd_xkvYoD15_gKAC2oP-iGutDUZCe3G4tpVoNsZ4KUg,2236 +django/contrib/flatpages/locale/id/LC_MESSAGES/django.po,sha256=oubDeX4_ccixc4VNwIJkRiVgYQQmoEEbWUWmWOV6mF0,2467 +django/contrib/flatpages/locale/io/LC_MESSAGES/django.mo,sha256=N8R9dXw_cnBSbZtwRbX6Tzw5XMr_ZdRkn0UmsQFDTi4,464 +django/contrib/flatpages/locale/io/LC_MESSAGES/django.po,sha256=_pJveonUOmMu3T6WS-tV1OFh-8egW0o7vU3i5YqgChA,1511 +django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo,sha256=dQ8MXLDoDs8Sz-Uaq5pY3vAiQlGo8-K-QqRPPB_rmUg,2252 +django/contrib/flatpages/locale/is/LC_MESSAGES/django.po,sha256=HknW5IeVZtxdnvexkyVQ5qmNS4vDDfJ6a3s3WD52cas,2472 +django/contrib/flatpages/locale/it/LC_MESSAGES/django.mo,sha256=U3Esxa7Hc6ox6dC8mr-6pbqbg29w3-hq7exSoHamROQ,2245 +django/contrib/flatpages/locale/it/LC_MESSAGES/django.po,sha256=obw6oujMNgnZgoeKMtRVTZfhxtGxHDJcNQovStAmjCg,2467 +django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo,sha256=0m18iVnCHzf7piLN2v-WeM68dZjP08Gt54rRoPvHBNU,2494 +django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po,sha256=wKJ-DRslfYhxK7jeSMtMTAOwTWJ1_QU-wvBEhQ9ZThg,2783 +django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo,sha256=R4OSbZ-lGxMdeJYsaXVXpo6-KSZWeKPuErKmEsUvEQE,3022 +django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po,sha256=YCVnkX9uayvAQjYy_2jS7fYb36meoMJTKSc2lfoUbeM,3301 +django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo,sha256=lMPryzUQr21Uy-NAGQhuIZjHz-4LfBHE_zxEc2_UPaw,2438 +django/contrib/flatpages/locale/kk/LC_MESSAGES/django.po,sha256=3y9PbPw-Q8wM7tCq6u3KeYUT6pfTqcQwlNlSxpAXMxQ,2763 +django/contrib/flatpages/locale/km/LC_MESSAGES/django.mo,sha256=FYRfhNSqBtavYb10sHZNfB-xwLwdZEfVEzX116nBs-k,1942 +django/contrib/flatpages/locale/km/LC_MESSAGES/django.po,sha256=d2AfbR78U0rJqbFmJQvwiBl_QvYIeSwsPKEnfYM4JZA,2471 +django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo,sha256=n5HCZEPYN_YIVCXrgA1qhxvfhZtDbhfiannJy5EkHkI,1902 +django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po,sha256=o9xnLjwDw7L49Mkyr8C6aQZ13Yq5MYx1JYXEtcIsiWU,2437 +django/contrib/flatpages/locale/ko/LC_MESSAGES/django.mo,sha256=ehwhiy0x7bgBrY_UtNwvCktLC8g44iMVOElR0CJL6zs,2285 +django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po,sha256=2_fhKNsIUf5AnOLpvCwhjkCBuDDMvIb5KlVK3PkFt7Y,2686 +django/contrib/flatpages/locale/lb/LC_MESSAGES/django.mo,sha256=Wkvlh5L_7CopayfNM5Z_xahmyVje1nYOBfQJyqucI_0,502 +django/contrib/flatpages/locale/lb/LC_MESSAGES/django.po,sha256=gGeTuniu3ZZ835t9HR-UtwCcd2s_Yr7ihIUm3jgQ7Y0,1545 +django/contrib/flatpages/locale/lt/LC_MESSAGES/django.mo,sha256=es6xV6X1twtqhIMkV-MByA7KZ5SoVsrx5Qh8BuzJS0Q,2506 +django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po,sha256=T__44veTC_u4hpPvkLekDOWfntXYAMzCd5bffRtGxWA,2779 +django/contrib/flatpages/locale/lv/LC_MESSAGES/django.mo,sha256=BuBwRAtQRAUwyZZS8GAKNYzMfAwSf_7ftf0_2AtTlZk,2367 +django/contrib/flatpages/locale/lv/LC_MESSAGES/django.po,sha256=mFrPgFTYA2Jow3zGtBchaOET5l9pL43HG0lB8EJ53WU,2577 +django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo,sha256=55H8w6fB-B-RYlKKkGw3fg2m-djxUoEp_XpupK-ZL70,2699 +django/contrib/flatpages/locale/mk/LC_MESSAGES/django.po,sha256=OhHJ5OVWb0jvNaOB3wip9tSIZ1yaPPLkfQR--uUEyUI,2989 +django/contrib/flatpages/locale/ml/LC_MESSAGES/django.mo,sha256=xBigFnQjazp9yPqMdSk5lmSVzTyFyyMxPR4IamS3BNA,3565 +django/contrib/flatpages/locale/ml/LC_MESSAGES/django.po,sha256=bdUaZ2dKlW_Wr3HXryRQ0nIZ4yc1pvNj3US24kOkGII,3821 +django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo,sha256=tqwROY6D-bJ4gbDQIowKXfuLIIdCWksGwecL2sj_wco,2776 +django/contrib/flatpages/locale/mn/LC_MESSAGES/django.po,sha256=jqiBpFLXlptDyU4F8ZWbP61S4APSPh0-nuTpNOejA6c,3003 +django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo,sha256=GvSfsp0Op7st6Ifd8zp8Cj4tTHoFMltQb4p64pebrqI,468 +django/contrib/flatpages/locale/mr/LC_MESSAGES/django.po,sha256=sayU0AfVaSFpBj0dT32Ri55LRafQFUHLi03K06kI7gc,1515 +django/contrib/flatpages/locale/my/LC_MESSAGES/django.mo,sha256=OcbiA7tJPkyt_WNrqyvoFjHt7WL7tMGHV06AZSxzkho,507 +django/contrib/flatpages/locale/my/LC_MESSAGES/django.po,sha256=EPWE566Vn7tax0PYUKq93vtydvmt-A4ooIau9Cwcdfc,1550 +django/contrib/flatpages/locale/nb/LC_MESSAGES/django.mo,sha256=dBs5KtfQCt5z1cxJNPrm_AIMTfebhfFWdUJoKcB3LcI,2196 +django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po,sha256=sCXLT1Ps6WmLrbvj4WzqkPgXy1P4cAJRSD8FZEaF0UQ,2551 +django/contrib/flatpages/locale/ne/LC_MESSAGES/django.mo,sha256=gDZKhcku1NVlSs5ZPPupc7RI8HOF7ex0R4Rs8tMmrYE,1500 +django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po,sha256=GWlzsDaMsJkOvw2TidJOEf1Fvxx9WxGdGAtfZIHkHwk,2178 +django/contrib/flatpages/locale/nl/LC_MESSAGES/django.mo,sha256=zmGi_idc2kgzkRgzYuwPifiTrYmS0j_it9cgtL2Ar18,2238 +django/contrib/flatpages/locale/nl/LC_MESSAGES/django.po,sha256=pR7Gv2BqiOhZuu7tmJYnpHQrKvxlgww480JfKHYLIrk,2635 +django/contrib/flatpages/locale/nn/LC_MESSAGES/django.mo,sha256=A50zQJ-0YYPjPCeeEa-gwqA2N5eON13YW8SJZvtJBZc,1693 +django/contrib/flatpages/locale/nn/LC_MESSAGES/django.po,sha256=H5hnBsH3sUdlPkMjxiqNnh8izcrTSAs6o-ywlNCTKtw,2119 +django/contrib/flatpages/locale/os/LC_MESSAGES/django.mo,sha256=cXGTA5M229UFsgc7hEiI9vI9SEBrNQ8d3A0XrtazO6w,2329 +django/contrib/flatpages/locale/os/LC_MESSAGES/django.po,sha256=m-qoTiKePeFviKGH1rJRjZRH-doJ2Fe4DcZ6W52rG8s,2546 +django/contrib/flatpages/locale/pa/LC_MESSAGES/django.mo,sha256=69_ZsZ4nWlQ0krS6Mx3oL6c4sP5W9mx-yAmOhZOnjPU,903 +django/contrib/flatpages/locale/pa/LC_MESSAGES/django.po,sha256=N6gkoRXP5MefEnjywzRiE3aeU6kHQ0TUG6IGdLV7uww,1780 +django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo,sha256=BBcBF68r5M0cFEJ4Ffpz3tB2h2aBkPImp2B4HabZRRE,2455 +django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po,sha256=OMP2-u5LVkOHlRwU95Ba5QsxZFkkiFVuf4NImxT-8iI,2759 +django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo,sha256=xD2pWdS3XMg7gAqBrUBmCEXFsOzEs0Npe8AJnlpueRY,2115 +django/contrib/flatpages/locale/pt/LC_MESSAGES/django.po,sha256=-K2jipPUWjXpfSPq3upnC_bvtaRAeOw0OLRFv03HWFY,2326 +django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.mo,sha256=QBrD3JxBjq8PRB-VZjkaqDRKS3rXkmNrGYwFsMvle-0,2274 +django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po,sha256=wtj6fD32hd9NqIyP1m3w7QUbyJ8hN3WDOkb5-sj68yc,2771 +django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo,sha256=oS3MXuRh2USyLOMrMH0WfMSFpgBcZWfrbCrovYgbONo,2337 +django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po,sha256=UNKGNSZKS92pJDjxKDLqVUW87DKCWP4_Q51xS16IZl0,2632 +django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo,sha256=wR8PsYu1LFuE5L29g4W-vLX2Py0juKcVaryfCqZvu2c,2966 +django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po,sha256=dml7ipThZdNLm5BXG5TxqQmKTiJqcmosP7OHuXHNnIo,3263 +django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo,sha256=f_qbUdkwYKzg3DQT5x-ab883NUWF80gNMc7yekFctPM,2145 +django/contrib/flatpages/locale/sk/LC_MESSAGES/django.po,sha256=OD_E2Z-nElhfFcsnuK8Y3r341OXjLON2CoWjNJfHIt8,2482 +django/contrib/flatpages/locale/sl/LC_MESSAGES/django.mo,sha256=MBjwhw6wppQUl0Lb_rShXZj_Sq-JLSkdYU5Xhi0OtYY,2173 +django/contrib/flatpages/locale/sl/LC_MESSAGES/django.po,sha256=6zbOXzkLTsdWRKAhuLzBVBc53n6MQKpvOeHw4cRrAlc,2400 +django/contrib/flatpages/locale/sq/LC_MESSAGES/django.mo,sha256=k9EPefyh9amDQ4V0Bc8gQbYHHD1mm8BZpHkkW6lXfqw,2328 +django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po,sha256=XKFwOQUPGA00NaM5Rc36vRPF35GXE9LOkizFvTZ1kIg,2507 +django/contrib/flatpages/locale/sr/LC_MESSAGES/django.mo,sha256=ThYTwsaxEtcEPoh9BZ9Ag_QY0qNZu3oEqFr-A2TZf5E,2755 +django/contrib/flatpages/locale/sr/LC_MESSAGES/django.po,sha256=kHv5vT5i_0CfH-decXgAUvDmU4P6_bRcF0gh9XUFDw8,3045 +django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=DRemg_nTBYpH5qoofYbe_VwerYeMl1kSzwrwfrs133s,2307 +django/contrib/flatpages/locale/sr_Latn/LC_MESSAGES/django.po,sha256=57cHJ7Tkap5UE0VDpL1CvFDTapfaM5KYOx8_DqpE-e8,2552 +django/contrib/flatpages/locale/sv/LC_MESSAGES/django.mo,sha256=ATOsOiNTLlCDWZO630xUUdnXfs7YW4nuqy9wUVOfzmU,2288 +django/contrib/flatpages/locale/sv/LC_MESSAGES/django.po,sha256=4bhfJNUKc1K1Z8IWSB9_YQVk_Gy3q4ZhkhfDS9FKaaw,2562 +django/contrib/flatpages/locale/sw/LC_MESSAGES/django.mo,sha256=Lhf99AGmazKJHzWk2tkGrMInoYOq0mtdCd8SGblnVCQ,1537 +django/contrib/flatpages/locale/sw/LC_MESSAGES/django.po,sha256=cos3eahuznpTfTdl1Vj_07fCOSYE8C9CRYHCBLYZrVw,1991 +django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo,sha256=nNuoOX-FPAmTvM79o7colM4C7TtBroTFxYtETPPatcQ,1945 +django/contrib/flatpages/locale/ta/LC_MESSAGES/django.po,sha256=XE4SndPZPLf1yXGl5xQSb0uor4OE8CKJ0EIXBRDA3qU,2474 +django/contrib/flatpages/locale/te/LC_MESSAGES/django.mo,sha256=bMxhDMTQc_WseqoeqJMCSNy71o4U5tJZYgD2G0p-jD0,1238 +django/contrib/flatpages/locale/te/LC_MESSAGES/django.po,sha256=tmUWOrAZ98B9T6Cai8AgLCfb_rLeoPVGjDTgdsMOY1Y,2000 +django/contrib/flatpages/locale/th/LC_MESSAGES/django.mo,sha256=mct17_099pUn0aGuHu8AlZG6UqdKDpYLojqGYDLRXRg,2698 +django/contrib/flatpages/locale/th/LC_MESSAGES/django.po,sha256=PEcRx5AtXrDZvlNGWFH-0arroD8nZbutdJBe8_I02ag,2941 +django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo,sha256=N2TchJuU5h7bvRP5khjHBNMf8qvI4U5lyLgzebp24zo,2290 +django/contrib/flatpages/locale/tr/LC_MESSAGES/django.po,sha256=IdSq-XOJtdOWqVeUfKImJSFcepdvAheewAuYJqKSI2k,2544 +django/contrib/flatpages/locale/tt/LC_MESSAGES/django.mo,sha256=9RfCKyn0ZNYsqLvFNmY18xVMl7wnmDq5uXscrsFfupk,2007 +django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po,sha256=SUwalSl8JWI9tuDswmnGT8SjuWR3DQGND9roNxJtH1o,2402 +django/contrib/flatpages/locale/udm/LC_MESSAGES/django.mo,sha256=7KhzWgskBlHmi-v61Ax9fjc3NBwHB17WppdNMuz-rEc,490 +django/contrib/flatpages/locale/udm/LC_MESSAGES/django.po,sha256=zidjP05Hx1OpXGqWEmF2cg9SFxASM4loOV85uW7zV5U,1533 +django/contrib/flatpages/locale/uk/LC_MESSAGES/django.mo,sha256=4LPDGENnexeg6awO1IHjau7CTZ0Y1EIkeXMspY9gj1Q,2962 +django/contrib/flatpages/locale/uk/LC_MESSAGES/django.po,sha256=15bRsN4P6kkY08RXROnl7aT63tWsRO1xNwdH-6Qlzcw,3289 +django/contrib/flatpages/locale/ur/LC_MESSAGES/django.mo,sha256=Li4gVdFoNOskGKAKiNuse6B2sz6ePGqGvZu7aGXMNy0,1976 +django/contrib/flatpages/locale/ur/LC_MESSAGES/django.po,sha256=hDasKiKrYov9YaNIHIpoooJo0Bzba___IuN2Hl6ofSc,2371 +django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo,sha256=FsFUi96oGTWGlZwM4qSMpuL1M2TAxsW51qO70TrybSM,1035 +django/contrib/flatpages/locale/vi/LC_MESSAGES/django.po,sha256=ITX3MWd7nlWPxTCoNPl22_OMLTt0rfvajGvTVwo0QC8,1900 +django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=0laVf3Ma-KSXHMTBPOGCP46Ftmz2XcA77rVZWuf3FeM,2127 +django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po,sha256=jDjc6Jyvd5l62rdyb828Z7xDhat7tI8pMmipNRHwsho,2456 +django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=a-KLBISo2n7mn10SuNfT0K883RTjKjPYCpHCAivUz18,2053 +django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.po,sha256=GtvYArHRgiEQo5KSIYd4lsOeHCrXkWaZIiKFH4m1peM,2283 +django/contrib/flatpages/migrations/0001_initial.py,sha256=dLSlPpjfc6jMKhxYPsw6yKohxn4ejRXVOJ1VyJf12r4,1710 +django/contrib/flatpages/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/flatpages/templatetags/flatpages.py,sha256=q0wsGQqXHhSCH4_UR-wHkj_pJsxBOo_liODBT_BZcTc,3561 +django/contrib/gis/__init__.py,sha256=GTSQJbKqQkNiljWZylYy_ofRICJeqIkfqmnC9ZdxZ2I,57 +django/contrib/gis/apps.py,sha256=YkIbEk4rWlbN0zZru2uewGsLzqWsMDl7yqA4g_5pT10,341 +django/contrib/gis/feeds.py,sha256=43TmSa40LR3LguE4VDeBThJZgO_rbtfrT5Y6DQ7RBiQ,5732 +django/contrib/gis/geometry.py,sha256=sTXZdh3D1UGGDBP-WZ2jvLUVstcJ_2Kn1_PlKJshNDo,677 +django/contrib/gis/measure.py,sha256=BLWTkDMMunvaN9lR8QDujmKOxUyhBQKy10Auo0npDaQ,11948 +django/contrib/gis/ptr.py,sha256=RK-5GCUUaQtBuDD3lAoraS7G05fzYhR5p0acKrzpQVE,1289 +django/contrib/gis/shortcuts.py,sha256=fHf3HYP6MP8GeuBW6G3y6d30Mjxa6IL2xtmblDjS8k4,1027 +django/contrib/gis/views.py,sha256=GpOJ8W5gk-xbB8y3wPe2dvoVutPKZqswhcMWCETBnx0,698 +django/contrib/gis/admin/__init__.py,sha256=Hni2JCw5ihVuor2HupxDffokiBOG11tu74EcKhiO89w,486 +django/contrib/gis/admin/options.py,sha256=z4UrI7Pzb73FsT2WgIMX9zsMG_Hg6g89vkkvgKPHOz8,5145 +django/contrib/gis/admin/widgets.py,sha256=_X3Li-k9q0m7soBvu0Vu3jwwmODZWTx9A3IswYKeXLM,4720 +django/contrib/gis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/utils.py,sha256=y4q0N0oDplot6dZQIFnjGPqVsTiGyLTmEMt5-xj-2b4,784 +django/contrib/gis/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/base/adapter.py,sha256=zBcccriBRK9JowhREgLKirkWllHzir0Hw3BkC3koAZs,481 +django/contrib/gis/db/backends/base/features.py,sha256=hz9h_D5BD39M1-uGviOISrPfsCH7ELJL1MYM0HiREyQ,3402 +django/contrib/gis/db/backends/base/models.py,sha256=vkDweNsExmKWkHNSae9G6P-fT-SMdIgHZ85i31ihXg0,3962 +django/contrib/gis/db/backends/base/operations.py,sha256=I69Yyv0EIBl0GXVfdTqMEqXBBclaj1ZTLcB2QPXGaiw,6363 +django/contrib/gis/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/mysql/base.py,sha256=rz8tnvXJlY4V6liWxYshuxQE-uTNuKSBogCz_GtXoaY,507 +django/contrib/gis/db/backends/mysql/features.py,sha256=3jtyW-7OWQWCIAgrt0jumq2ceIRuFXlxdYtHHYSkq9w,962 +django/contrib/gis/db/backends/mysql/introspection.py,sha256=iWNgt9pptmf0fSWTGKc4J7xdmpjvjTLfNCtgZQFmf8E,1821 +django/contrib/gis/db/backends/mysql/operations.py,sha256=tcl2uV0jrhgecaatZEYs1izlfWt1IjRoK67IRwXQls4,3847 +django/contrib/gis/db/backends/mysql/schema.py,sha256=I8eJcKXqiyv15ATHLs5qVsHfWDE07lf0_-iaNdGv0ew,2890 +django/contrib/gis/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/oracle/adapter.py,sha256=y9ewCXAoQZ4iXCHzf_bsRwSXpCHdK9HJyUZy_1AiA40,1872 +django/contrib/gis/db/backends/oracle/base.py,sha256=NQYlEvE4ioobvMd7u2WC7vMtDiRq_KtilGprD6qfJCo,516 +django/contrib/gis/db/backends/oracle/features.py,sha256=lHjxvF4bQqlv8VQGgXhCNrfnDgbUUm6GwjYeva4HKMc,420 +django/contrib/gis/db/backends/oracle/introspection.py,sha256=0mikP0QbOsM4Fm2hHXU9iWv23ds13UXXcuzgFkhRxDs,1788 +django/contrib/gis/db/backends/oracle/models.py,sha256=pT32f_A1FRYwO5hWMigX7PU_ojpRmIhdUlhOqdz2R9k,2084 +django/contrib/gis/db/backends/oracle/operations.py,sha256=ZkRr8rKawFG4aeIV7Br-YBiS3dTSUrVdObWhhAXhCxk,8311 +django/contrib/gis/db/backends/oracle/schema.py,sha256=wnb56CJ9Er40E4Yw7RK1hOOYZAHRJJFbNGNK9E9IHRk,3916 +django/contrib/gis/db/backends/postgis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/postgis/adapter.py,sha256=jDa5X2uIj6qRpgJ8DUfEkWBZETMifyxqDtnkA73kUu8,2117 +django/contrib/gis/db/backends/postgis/base.py,sha256=sFCNoMHRzd-a_MRc9hv-tyVHEODmGveyIopbP6CTPCg,937 +django/contrib/gis/db/backends/postgis/const.py,sha256=He7mVpJrJdbMGjPAgHRXkmm225CuVxVc-viiJSTKOik,1482 +django/contrib/gis/db/backends/postgis/features.py,sha256=iBZqX6o1YBrmw5pSUYeft-ga6FGa05J-9ADFNsRtLgk,422 +django/contrib/gis/db/backends/postgis/introspection.py,sha256=I5Kf14nZKew-NWFAPo-rRkJ85Qg_NDNEEwByEH9xrcA,4388 +django/contrib/gis/db/backends/postgis/models.py,sha256=tKiRZzO6p2YJnPbPXReMlFcAiFij-C_H_6w8FHhLqxk,2000 +django/contrib/gis/db/backends/postgis/operations.py,sha256=_0Khzy9Dap7eQh2Nr7M6FPJJCdaAwvv8C2vZ7C92i6Q,16073 +django/contrib/gis/db/backends/postgis/pgraster.py,sha256=_XKNfncFbEPgeiHCfkZmQv8rjnCNN0r90pa4DZSOW00,4444 +django/contrib/gis/db/backends/postgis/schema.py,sha256=GGK3PSohXwRWhoHaxGBXHnDkZdUSiz8TxOalgdDFcNQ,2676 +django/contrib/gis/db/backends/spatialite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/db/backends/spatialite/adapter.py,sha256=y74p_UEgLtoYjNZEi72mwcJOh_b-MzJ7sZd68WJXBiY,317 +django/contrib/gis/db/backends/spatialite/base.py,sha256=pg7m0arvmnwOsDJo-Mj9NudCclRMThEhQzDBjQWQLNI,3011 +django/contrib/gis/db/backends/spatialite/client.py,sha256=NsqD2vAnfjqn_FbQnCQeAqbGyZf9oa6gl7EPsMTPf8c,138 +django/contrib/gis/db/backends/spatialite/features.py,sha256=HeeWFDRGxkgfTQ_ryzEKzRxJPnf5BJVs0ifYs8SEIXU,449 +django/contrib/gis/db/backends/spatialite/introspection.py,sha256=CvQfKqV-pOR7S21XYKLKvnV5pys3F5X2SxI0hPpUqiQ,3054 +django/contrib/gis/db/backends/spatialite/models.py,sha256=iiodcKYWAMIz_xrJagr-1nbiiO2YJY_Q0vt_0uyaD54,1928 +django/contrib/gis/db/backends/spatialite/operations.py,sha256=_nhQw90ZEe7AbZB4ScnwUtkM36X6j5IUau7tZzk2gng,8377 +django/contrib/gis/db/backends/spatialite/schema.py,sha256=WLvCcCOqdTcBmsjaBNt15YwVzE05vXzQVvfGva6q1Xo,6838 +django/contrib/gis/db/models/__init__.py,sha256=BR3kQAefIv4O1NksiVCUShwlSO4OCNoUGan6dCRGIyU,817 +django/contrib/gis/db/models/aggregates.py,sha256=O8ANjyiMG2eA92_efLfecr06UfLHWCxf4id7joCmFHA,2617 +django/contrib/gis/db/models/fields.py,sha256=nH-3mDEaGNf4gNihMF3-D9WvtIleEnFRCl_1lgp0JoM,13683 +django/contrib/gis/db/models/functions.py,sha256=2tW2s_HMHgCbfNf9qPRZPV_poutsQW_ROWwvrdF69KQ,17047 +django/contrib/gis/db/models/lookups.py,sha256=yleGLXa0oLkYrH4QgFV3d5zgzgmCpU2DIi3J_Th2DmQ,10849 +django/contrib/gis/db/models/proxy.py,sha256=uO-35A6mMrritgzfrZvDfEe2w7TX9BsnhYJ7KMjvilI,3163 +django/contrib/gis/db/models/sql/__init__.py,sha256=oYJYL-5DAO-DIcpIQ7Jmeq_cuKapRB83V1KLVIs_5iU,139 +django/contrib/gis/db/models/sql/conversion.py,sha256=gG1mTUWb33YK_Uf1ZJRg5MRhkCTLtgajD3xxi7thODA,2400 +django/contrib/gis/forms/__init__.py,sha256=fREam1OSkDWr9ugUMNZMFn8Y9TufpRCn3Glj14DTMbQ,298 +django/contrib/gis/forms/fields.py,sha256=hlOZOkuKR2Q8wcl-3u5h6S6CUYBTtYQheeOtaVGiPBg,4460 +django/contrib/gis/forms/widgets.py,sha256=J8EMJkmHrGkZVqf6ktIwZbO8lYmg63CJQbUYILVsVNc,3739 +django/contrib/gis/gdal/LICENSE,sha256=VwoEWoNyts1qAOMOuv6OPo38Cn_j1O8sxfFtQZ62Ous,1526 +django/contrib/gis/gdal/__init__.py,sha256=Zs9bOGm9RStYhhlWCnqRNChJG4K_oWDPRXYylplur1Q,1760 +django/contrib/gis/gdal/base.py,sha256=yymyL0vZRMBfiFUzrehvaeaunIxMH5ucGjPRfKj-rAo,181 +django/contrib/gis/gdal/datasource.py,sha256=_bezml3LzZHdVe21Xp8NAkn6MAEKjmqhbiQTlIOQq4E,4492 +django/contrib/gis/gdal/driver.py,sha256=hx4NRCduKMJFXF0GtyfRMPUNLAjoIDVqe_5M2nvzZ7U,3266 +django/contrib/gis/gdal/envelope.py,sha256=lL13BYlaEyxDNkCJCPnFZk13eyRb9pOkOOrAdP16Qtw,6970 +django/contrib/gis/gdal/error.py,sha256=yv9yvtBPjLWRqQHlzglF-gLDW-nR7zF_F5xsej_oBx4,1576 +django/contrib/gis/gdal/feature.py,sha256=D4dewcLE_kjElK2gXmfUOCA1mJk-JbYdouhUOZvAYyQ,3929 +django/contrib/gis/gdal/field.py,sha256=tphx1sKMqYZ-SrDiZ62KtFJphMq93fvB5VIDb0cyffs,6701 +django/contrib/gis/gdal/geometries.py,sha256=b1FG4dhg1tJhETulc2wk517LaXiN3nKeIFyQrd1-7vA,24196 +django/contrib/gis/gdal/geomtype.py,sha256=hCHfxQsecBakIZUDZwEkECdH7dg3CdF4Y_kAFYkW9Og,3071 +django/contrib/gis/gdal/layer.py,sha256=Oy4IWRwup_XNZMK6d8zph8Y8FVEj6-eEVuWJCxI-izc,8538 +django/contrib/gis/gdal/libgdal.py,sha256=TPM8vynXVlCDHLyG00GCE_Fmb4sKNH8I4qrUALVPGbE,3588 +django/contrib/gis/gdal/srs.py,sha256=jJDIApRPMhm6gQNVKmqCzrgufx1MFo44Eu7tk_Elu7k,11540 +django/contrib/gis/gdal/prototypes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/gdal/prototypes/ds.py,sha256=AAu7QnwigZ-3Dme-uHsOySlT1TGvAYSvqF1pZtauMto,4413 +django/contrib/gis/gdal/prototypes/errcheck.py,sha256=81MQSCm3lvq8LYMi7t901Z82X9ChgApD0MC6jh2TKT4,4151 +django/contrib/gis/gdal/prototypes/generation.py,sha256=WmFEbrwQQJpdHd5bBZYYO07bsR_3Sv8ZFQXNjGgffGA,4612 +django/contrib/gis/gdal/prototypes/geom.py,sha256=ELRO7bR8RxO3HIuxtitr06yhsG4DxYTlRsTa6NenTqI,4946 +django/contrib/gis/gdal/prototypes/raster.py,sha256=zPIc-Vahtau1XQTADqxQNtzcAv6LunbhVHkWkMOEWKo,5690 +django/contrib/gis/gdal/prototypes/srs.py,sha256=yzAqWOFjP626Kovwd1HOlJuWcT3kuLCFq_PCVNN7Gaw,3540 +django/contrib/gis/gdal/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/gdal/raster/band.py,sha256=xY3OCQzLIgHTJSYghDdmpV7ZW7aHEW4w_Z5kd4fI9TA,8249 +django/contrib/gis/gdal/raster/base.py,sha256=WLdZNgRlGAT6kyIXz5bBhPbpNY53ImxQkSeVLyv4Ohc,2861 +django/contrib/gis/gdal/raster/const.py,sha256=uPk8859YSREMtiQtXGkVOhISmgsF6gXP7JUfufQDXII,2891 +django/contrib/gis/gdal/raster/source.py,sha256=_rOAFGeuxkm0q9qyfOsX6P80ikwtSkvcy8wQZU-kBaI,16634 +django/contrib/gis/geoip2/__init__.py,sha256=uIUWQyMsbSrYL-oVqFsmhqQkYGrh7pHLIVvIM3W_EG4,822 +django/contrib/gis/geoip2/base.py,sha256=rz8KYyxRuWBBrWIU2OXoQsFm7mj43vHc9VsBkiHi4ZY,9074 +django/contrib/gis/geoip2/resources.py,sha256=YlldCGQe_U-J90znMdAEQ0SxWIkfZvkuD7uSGKHVcG8,748 +django/contrib/gis/geos/LICENSE,sha256=CL8kt1USOK4yUpUkVCWxyuua0PQvni0wPHs1NQJjIEU,1530 +django/contrib/gis/geos/__init__.py,sha256=DXFaljVp6gf-E0XAbfO1JnYjPYSDfGZQ2VLtGYBcUZQ,648 +django/contrib/gis/geos/base.py,sha256=NdlFg5l9akvDp87aqzh9dk0A3ZH2TI3cOq10mmmuHBk,181 +django/contrib/gis/geos/collections.py,sha256=OHpBZoruCk_rySBZ4gpEA2ZWLODFCHwkOyGIn1wxGJc,4162 +django/contrib/gis/geos/coordseq.py,sha256=cMGg3XPm2x3VYjkYys8rojRG7uzMez8FpOr2HD-Jy8Q,6419 +django/contrib/gis/geos/error.py,sha256=r3SNTnwDBI6HtuyL3mQ_iEEeKlOqqqdkHnhNoUkMohw,104 +django/contrib/gis/geos/factory.py,sha256=f6u2m1AtmYYHk_KrIC9fxt7VGsJokJVoSWEx-DkPWx0,961 +django/contrib/gis/geos/geometry.py,sha256=SwpE8Za5-Ii5awX_qeewWNZqKzQqjwElXr8Oh_I-RbQ,25526 +django/contrib/gis/geos/io.py,sha256=Om5DBSlttixUc3WQAGZDhzPdb5JTe82728oImIj_l3k,787 +django/contrib/gis/geos/libgeos.py,sha256=AtMP5GPGgjPPQzgzk8G-fxDFWlhd7e-LWR4idA3dXh8,5127 +django/contrib/gis/geos/linestring.py,sha256=6CctplhRZKi8UvK-B2kJGRZySVsonUJwieQ8S0kxj6U,5935 +django/contrib/gis/geos/mutable_list.py,sha256=8uJ_9r48AlIIDzYaUb_qAD0eYslek9yvAX9ICdCmh5A,10131 +django/contrib/gis/geos/point.py,sha256=Aj6khdIPMMIE-cDeDqiCOQ6SqHpDGdo5NHC8fPoSjdE,4662 +django/contrib/gis/geos/polygon.py,sha256=nAJFsaBXbIM9ZA_gSxVB_3WNXJHwakmhlxN_VzKs4WQ,6664 +django/contrib/gis/geos/prepared.py,sha256=rJf35HOTxPrrk_yA-YR9bQlL_pPDKecuhwZlcww8lxY,1575 +django/contrib/gis/geos/prototypes/__init__.py,sha256=0jfLanLmI1q-3NIpdIZr3EHnMzhPRXMhbCNIHf3glfI,1221 +django/contrib/gis/geos/prototypes/coordseq.py,sha256=Cq7HqMVXt8F-0C1cOfYfkapHY0t5ZNu9v7h7_YLD5mo,2993 +django/contrib/gis/geos/prototypes/errcheck.py,sha256=YTUBFoHU5pZOAamBPgogFymDswgnMr1_KL59sZfInYo,2654 +django/contrib/gis/geos/prototypes/geom.py,sha256=FoWEduMbbWb6_blM2IJOP_WkYCVISLksuXOaFAL_9c8,3565 +django/contrib/gis/geos/prototypes/io.py,sha256=V2SlUEniZGfVnj_9r17XneT7w-OoCUpkL_sumKIhLbU,11229 +django/contrib/gis/geos/prototypes/misc.py,sha256=7Xwk0HG__JtPt6wJD-ieMkD-7KxpnofYrHSk6NEUeJo,1161 +django/contrib/gis/geos/prototypes/predicates.py,sha256=Ya06ir7LZQBSUypB05iv9gpvZowOSLIKa4fhCnhZuYY,1587 +django/contrib/gis/geos/prototypes/prepared.py,sha256=SC7g9_vvsW_ty7LKqlMzJfF9v3EvsJX9-j3kpSeCRfY,1184 +django/contrib/gis/geos/prototypes/threadsafe.py,sha256=Ll_TmpfJhRTmWV5dgKJx_Dh67ay1pa-SdlH558NRPw4,2309 +django/contrib/gis/geos/prototypes/topology.py,sha256=wd0OxkUQiMNioDXpJdRc1h9swsZ2CeOgqMvHxqJFY5s,2256 +django/contrib/gis/locale/af/LC_MESSAGES/django.mo,sha256=TN3GddZjlqXnhK8UKLlMoMIXNw2szzj7BeRjoKjsR5c,470 +django/contrib/gis/locale/af/LC_MESSAGES/django.po,sha256=XPdXaQsZ6yDPxF3jVMEI4bli_5jrEawoO-8DHMk8Q_A,1478 +django/contrib/gis/locale/ar/LC_MESSAGES/django.mo,sha256=q0DhiLoyS8WBktN150bvtusd885p2E7e23VMFAqJPj0,2428 +django/contrib/gis/locale/ar/LC_MESSAGES/django.po,sha256=rnZPCzub0GRmC3FwmfyhATesLcm4yTRNr8jDSvM9wBQ,2639 +django/contrib/gis/locale/ast/LC_MESSAGES/django.mo,sha256=8o0Us4wR14bdv1M5oBeczYC4oW5uKnycWrj1-lMIqV4,850 +django/contrib/gis/locale/ast/LC_MESSAGES/django.po,sha256=0beyFcBkBOUNvPP45iqewTNv2ExvCPvDYwpafCJY5QM,1684 +django/contrib/gis/locale/az/LC_MESSAGES/django.mo,sha256=i52TIQuWn72ykTPYSRfBgqeJ254hhGt8LvBQHtXCWMg,2013 +django/contrib/gis/locale/az/LC_MESSAGES/django.po,sha256=tXdeAVGebIVd-K1c5ANtQaba5ll_ELIseJdpqC3UUCE,2163 +django/contrib/gis/locale/be/LC_MESSAGES/django.mo,sha256=ySlqE1WXTqM5DGsE_fEF5pipbyqj4A10SZgvQlFAyKc,2488 +django/contrib/gis/locale/be/LC_MESSAGES/django.po,sha256=HzR5MKPYfc-xeRnb0oPIi9OLa-iA86_IbbM3Poj8h_k,2651 +django/contrib/gis/locale/bg/LC_MESSAGES/django.mo,sha256=1A5wo7PLz0uWsNMHv_affxjNnBsY3UQNz7zHszu56do,2452 +django/contrib/gis/locale/bg/LC_MESSAGES/django.po,sha256=5Onup09U6w85AFWvjs2QKnYXoMhnnw9u4eUlIa5QoXU,2670 +django/contrib/gis/locale/bn/LC_MESSAGES/django.mo,sha256=7oNsr_vHQfsanyP-o1FG8jZTSBK8jB3eK2fA9AqNOx4,1070 +django/contrib/gis/locale/bn/LC_MESSAGES/django.po,sha256=PTa9EFZdqfznUH7si3Rq3zp1kNkTOnn2HRTEYXQSOdM,1929 +django/contrib/gis/locale/br/LC_MESSAGES/django.mo,sha256=xN8hOvJi_gDlpdC5_lghXuX6yCBYDPfD_SQLjcvq8gU,1614 +django/contrib/gis/locale/br/LC_MESSAGES/django.po,sha256=LQw3Tp_ymJ_x7mJ6g4SOr6aP00bejkjuaxfFFRZnmaQ,2220 +django/contrib/gis/locale/bs/LC_MESSAGES/django.mo,sha256=9EdKtZkY0FX2NlX_q0tIxXD-Di0SNQJZk3jo7cend0A,1308 +django/contrib/gis/locale/bs/LC_MESSAGES/django.po,sha256=eu_qF8dbmlDiRKGNIz80XtIunrF8QIOcy8O28X02GvQ,1905 +django/contrib/gis/locale/ca/LC_MESSAGES/django.mo,sha256=_ghgN_u_2yqPFt8oKksLPQeJxn1dz_o23Z-OAa3xKTQ,2043 +django/contrib/gis/locale/ca/LC_MESSAGES/django.po,sha256=o5dQ-gYO9WPYQf4EFhpl3GLHzu-KU3MDYAn3Y_YVpMs,2313 +django/contrib/gis/locale/cs/LC_MESSAGES/django.mo,sha256=hLXZzjME7I4GXmS0I_3uPZpOZJC8uhsotV8rqJvHDgg,2111 +django/contrib/gis/locale/cs/LC_MESSAGES/django.po,sha256=SEGzJ3E53hCPRKEwV1UM_PLwtn16n3myky88m_QUB2I,2315 +django/contrib/gis/locale/cy/LC_MESSAGES/django.mo,sha256=vUG_wzZaMumPwIlKwuN7GFcS9gnE5rpflxoA_MPM_po,1430 +django/contrib/gis/locale/cy/LC_MESSAGES/django.po,sha256=_QjXT6cySUXrjtHaJ3046z-5PoXkCqtOhvA7MCZsXxk,1900 +django/contrib/gis/locale/da/LC_MESSAGES/django.mo,sha256=qSfQxrORzIWKkcgjsCOOsTGhr8qU7DhqbWRxbQzkGXI,1934 +django/contrib/gis/locale/da/LC_MESSAGES/django.po,sha256=5vF_PjA29rtkd3WaIcwT4w0_69hqSN-1GFhKVtoAHh0,2176 +django/contrib/gis/locale/de/LC_MESSAGES/django.mo,sha256=mI3SuiIrcN27uvquzq7O9wtKIjaVQjHAesncCgBg8_g,1999 +django/contrib/gis/locale/de/LC_MESSAGES/django.po,sha256=4m3n1PEqvjKftQWz4s_ElJzZuCVzdWGbIKEHoBrhEy4,2151 +django/contrib/gis/locale/dsb/LC_MESSAGES/django.mo,sha256=69wcPviGvpI2TxiSEux2GnUo1tu0CeZgQKBjJZrEeRk,2109 +django/contrib/gis/locale/dsb/LC_MESSAGES/django.po,sha256=koNMmuvSPrHBxNsE0EH4zPcDZeFAyBHR_qQnp3HT80o,2226 +django/contrib/gis/locale/el/LC_MESSAGES/django.mo,sha256=8QAS4MCktYLFsCgcIVflPXePYAWwr6iEZ7K8_axi_5U,2519 +django/contrib/gis/locale/el/LC_MESSAGES/django.po,sha256=6JVoYCUCUznxgQYlOCWJw1Ad6SR3Fa9jlorSCYkiwLw,2886 +django/contrib/gis/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/gis/locale/en/LC_MESSAGES/django.po,sha256=xQNCkGkE6LwUS33QmgHTaLg0TQNbO9IPElF6RkYrY9c,2223 +django/contrib/gis/locale/en_AU/LC_MESSAGES/django.mo,sha256=IPn5kRqOvv5S7jpbIUw8PEUkHlyjEL-4GuOANd1iAzI,486 +django/contrib/gis/locale/en_AU/LC_MESSAGES/django.po,sha256=x_58HmrHRia2LoYhmmN_NLb1J3f7oTDvwumgTo0LowI,1494 +django/contrib/gis/locale/en_GB/LC_MESSAGES/django.mo,sha256=WkORQDOsFuV2bI7hwVsJr_JTWnDQ8ZaK-VYugqnLv3w,1369 +django/contrib/gis/locale/en_GB/LC_MESSAGES/django.po,sha256=KWPMoX-X-gQhb47zoVsa79-16-SiCGpO0s4xkcGv9z0,1910 +django/contrib/gis/locale/eo/LC_MESSAGES/django.mo,sha256=qls9V1jybymGCdsutcjP6fT5oMaI-GXnt_oNfwq-Yhs,1960 +django/contrib/gis/locale/eo/LC_MESSAGES/django.po,sha256=WPSkCxwq3ZnR-_L-W-CnS0_Qne3ekX7ZAZVaubiWw5s,2155 +django/contrib/gis/locale/es/LC_MESSAGES/django.mo,sha256=l88snQomLTK7JQQ5MGdUWGf_6MqiyZWqnCuZPAMctoQ,2056 +django/contrib/gis/locale/es/LC_MESSAGES/django.po,sha256=e4YW5wz0R2oI8VmEZGgMsLVycbmv3ILDjetpjS8ZXl4,2423 +django/contrib/gis/locale/es_AR/LC_MESSAGES/django.mo,sha256=-SlY9HeeMlg87yZM-mtG-drnsT_jncUOeoY4PPHkjrk,2069 +django/contrib/gis/locale/es_AR/LC_MESSAGES/django.po,sha256=XfXzSvB-x2nMclRwxMDWhPqw8vQMRtWVr4SyvD1XFn8,2219 +django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo,sha256=P79E99bXjthakFYr1BMobTKqJN9S1aj3vfzMTbGRhCY,1865 +django/contrib/gis/locale/es_CO/LC_MESSAGES/django.po,sha256=tyu8_dFA9JKeQ2VCpCUy_6yX97SPJcDwVqqAuf_xgks,2347 +django/contrib/gis/locale/es_MX/LC_MESSAGES/django.mo,sha256=bC-uMgJXdbKHQ-w7ez-6vh9E_2YSgCF_LkOQlvb60BU,1441 +django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po,sha256=MYO9fGclp_VvLG5tXDjXY3J_1FXI4lDv23rGElXAyjA,1928 +django/contrib/gis/locale/es_VE/LC_MESSAGES/django.mo,sha256=5YVIO9AOtmjky90DAXVyU0YltfQ4NLEpVYRTTk7SZ5o,486 +django/contrib/gis/locale/es_VE/LC_MESSAGES/django.po,sha256=R8suLsdDnSUEKNlXzow3O6WIT5NcboZoCjir9GfSTSQ,1494 +django/contrib/gis/locale/et/LC_MESSAGES/django.mo,sha256=RuQYV9MWvWzcX0lI4ot2cY2_49yJPOqeExNx05MpeFg,1961 +django/contrib/gis/locale/et/LC_MESSAGES/django.po,sha256=4yl0Zfmt0mOSJluCw97oJdiWmf3x84a3qtSQDsUZYv8,2239 +django/contrib/gis/locale/eu/LC_MESSAGES/django.mo,sha256=EChDnXv1Tgk0JvMp3RuDsk-0LkgZ2Xig8nckmikewLA,1973 +django/contrib/gis/locale/eu/LC_MESSAGES/django.po,sha256=sj_W9oCmbYENT-zGnTNtAT-ZsI3z7IOhgUxooQNFbpc,2191 +django/contrib/gis/locale/fa/LC_MESSAGES/django.mo,sha256=40t0F0vpKKPy9NW7OMuY-UnbkOI9ifM33A0CZG8i2dg,2281 +django/contrib/gis/locale/fa/LC_MESSAGES/django.po,sha256=cw9rOxFowluGpekFPAoaPvjAxwUOcXi4szNnCAvsBbI,2589 +django/contrib/gis/locale/fi/LC_MESSAGES/django.mo,sha256=L_1vFA-I0vQddIdLpNyATweN04E5cRw-4Xr81D67Q_c,1946 +django/contrib/gis/locale/fi/LC_MESSAGES/django.po,sha256=WSrldLannVh0Vnmm18X5FwHoieLQYXz0CoF2SY52w0M,2127 +django/contrib/gis/locale/fr/LC_MESSAGES/django.mo,sha256=asAhstLR7EmVyuijAii40LOtdcsapHaChkfIvhlsdrQ,2082 +django/contrib/gis/locale/fr/LC_MESSAGES/django.po,sha256=GvRJJNZL55BRARg2TozwQjRprLUNMQxtzfB94Qs0Ye8,2290 +django/contrib/gis/locale/fy/LC_MESSAGES/django.mo,sha256=2kCnWU_giddm3bAHMgDy0QqNwOb9qOiEyCEaYo1WdqQ,476 +django/contrib/gis/locale/fy/LC_MESSAGES/django.po,sha256=7ncWhxC5OLhXslQYv5unWurhyyu_vRsi4bGflZ6T2oQ,1484 +django/contrib/gis/locale/ga/LC_MESSAGES/django.mo,sha256=m6Owcr-5pln54TXcZFAkYEYDjYiAkT8bGFyw4nowNHA,1420 +django/contrib/gis/locale/ga/LC_MESSAGES/django.po,sha256=I0kyTnYBPSdYr8RontzhGPShJhylVAdRLBGWRQr2E7g,1968 +django/contrib/gis/locale/gd/LC_MESSAGES/django.mo,sha256=GR9860LI6qrGdaqUYG8GskC_EeGHBetVojk0TSTIIO8,2142 +django/contrib/gis/locale/gd/LC_MESSAGES/django.po,sha256=l9fNaI3A5mmULDsg-D-cc-hhlGOYlP4JrxJJn4YU4hM,2260 +django/contrib/gis/locale/gl/LC_MESSAGES/django.mo,sha256=4OUuNpkYRWjKz_EoY1zDzKOK8YptrwUutQqFvSKsLUs,1421 +django/contrib/gis/locale/gl/LC_MESSAGES/django.po,sha256=s9tiYQLnv1_uzyLpi3qqV_zwJNic1AGFsUGc3FhJbMo,2006 +django/contrib/gis/locale/he/LC_MESSAGES/django.mo,sha256=CxVl9Ny_dasVLNhXxJwBOxIVdmpR6m-MuIF6V_Si9RE,2236 +django/contrib/gis/locale/he/LC_MESSAGES/django.po,sha256=XyDF1lnHjUW6rId5dW0-zBt336rkXjR8-bUOzW2nJCM,2393 +django/contrib/gis/locale/hi/LC_MESSAGES/django.mo,sha256=3nsy5mxKTPtx0EpqBNA_TJXmLmVZ4BPUZG72ZEe8OPM,1818 +django/contrib/gis/locale/hi/LC_MESSAGES/django.po,sha256=jTFG2gqqYAQct9-to0xL2kUFQu-ebR4j7RGfxn4sBAg,2372 +django/contrib/gis/locale/hr/LC_MESSAGES/django.mo,sha256=0XrRj2oriNZxNhEwTryo2zdMf-85-4X7fy7OJhB5ub4,1549 +django/contrib/gis/locale/hr/LC_MESSAGES/django.po,sha256=iijzoBoD_EJ1n-a5ys5CKnjzZzG299zPoCN-REFkeqE,2132 +django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo,sha256=W3LtmsG61dOj4oNOEDuZC4iOco8jbFkrBUhhW1rxXVE,2083 +django/contrib/gis/locale/hsb/LC_MESSAGES/django.po,sha256=WmUI-Hqp2yLFJNYKU7-ko7bJY25pcPqPblu0rkSDKVk,2203 +django/contrib/gis/locale/hu/LC_MESSAGES/django.mo,sha256=Gbu1WlCo21lsqVrfAJHD0SsrQ4RxQ5Wsqhp9sJuHmEA,1941 +django/contrib/gis/locale/hu/LC_MESSAGES/django.po,sha256=dJCoSLIugFyOoPuewWcquN_UCqJG3gYZzb1IiO_2r5Y,2173 +django/contrib/gis/locale/hy/LC_MESSAGES/django.mo,sha256=4D6em091yzO4s3U_DIdocdlvxtAbXdMt6Ig1ATxRGrQ,2535 +django/contrib/gis/locale/hy/LC_MESSAGES/django.po,sha256=0nkAba1H7qrC5JSakzJuAqsldWPG7lsjH7H8jVfG1SU,2603 +django/contrib/gis/locale/ia/LC_MESSAGES/django.mo,sha256=9MZnSXkQUIfbYB2f4XEtYo_FzuVi5OlsYcX9K_REz3c,1899 +django/contrib/gis/locale/ia/LC_MESSAGES/django.po,sha256=f7OuqSzGHQNldBHp62VIWjqP0BB0bvo8qEx9_wzH090,2116 +django/contrib/gis/locale/id/LC_MESSAGES/django.mo,sha256=vkdSqp0U3LhTfejwHLhnwjQ4OFFN0GVKrquxTWgLIh0,1983 +django/contrib/gis/locale/id/LC_MESSAGES/django.po,sha256=Zz3Yd6id4X3rfjqiYt_CmyPpLYnFY1fuTUKRnZnDMdA,2322 +django/contrib/gis/locale/io/LC_MESSAGES/django.mo,sha256=_yUgF2fBUxVAZAPNw2ROyWly5-Bq0niGdNEzo2qbp8k,464 +django/contrib/gis/locale/io/LC_MESSAGES/django.po,sha256=fgGJ1xzliMK0MlVoV9CQn_BuuS3Kl71Kh5YEybGFS0Y,1472 +django/contrib/gis/locale/is/LC_MESSAGES/django.mo,sha256=CBNZj4uA2niVY5uA7MKHu21Ou8d3wp_EJCWC8w3Y0JY,1317 +django/contrib/gis/locale/is/LC_MESSAGES/django.po,sha256=SUst5hGJO9veiC6SWB0oLEHzMXNqxMG8l8oLpoTQFt0,1865 +django/contrib/gis/locale/it/LC_MESSAGES/django.mo,sha256=px9x5hMusGf2LB2Vz9AijSpeppg3gUCI0dHfBb_F44A,2009 +django/contrib/gis/locale/it/LC_MESSAGES/django.po,sha256=RZRPvW8eAvd0-KnEQ0lPz0gSPmvq1um0rsEgmoIQMsU,2309 +django/contrib/gis/locale/ja/LC_MESSAGES/django.mo,sha256=knTOfVviVceaAEp9xeh4WUE-ro2lkUIUTtkA-9yk3Bs,2124 +django/contrib/gis/locale/ja/LC_MESSAGES/django.po,sha256=mqD9ZpqXvAL7adXVWyVlIyD7meIcyXI6RXqRQD5cRm8,2287 +django/contrib/gis/locale/ka/LC_MESSAGES/django.mo,sha256=iqWQ9j8yanPjDhwi9cNSktYgfLVnofIsdICnAg2Y_to,1991 +django/contrib/gis/locale/ka/LC_MESSAGES/django.po,sha256=tWoXkbWfNsZ2A28_JUvc1wtyVT6m7Hl9nJgfxXGqkgY,2566 +django/contrib/gis/locale/kk/LC_MESSAGES/django.mo,sha256=NtgQONp0UncUNvrh0W2R7u7Ja8H33R-a-tsQShWq-QI,1349 +django/contrib/gis/locale/kk/LC_MESSAGES/django.po,sha256=_wNvDk36C_UegH0Ex6ov8P--cKm-J7XtusXYsjVVZno,1974 +django/contrib/gis/locale/km/LC_MESSAGES/django.mo,sha256=T0aZIZ_gHqHpQyejnBeX40jdcfhrCOjgKjNm2hLrpNE,459 +django/contrib/gis/locale/km/LC_MESSAGES/django.po,sha256=7ARjFcuPQJG0OGLJu9pVfSiAwc2Q-1tT6xcLeKeom1c,1467 +django/contrib/gis/locale/kn/LC_MESSAGES/django.mo,sha256=EkJRlJJSHZJvNZJuOLpO4IIUEoyi_fpKwNWe0OGFcy4,461 +django/contrib/gis/locale/kn/LC_MESSAGES/django.po,sha256=NM3FRy48SSVsUIQc8xh0ZKAgTVAP8iK8elp7NQ6-IdE,1469 +django/contrib/gis/locale/ko/LC_MESSAGES/django.mo,sha256=7SSr6cP3b0vM5z224tJIqmwwWWHGoU0al4LNGbwxtQM,1975 +django/contrib/gis/locale/ko/LC_MESSAGES/django.po,sha256=aXVjYftxj1FONeotkCZkAoQxCCFs5cYb4ceGPSnUScA,2299 +django/contrib/gis/locale/lb/LC_MESSAGES/django.mo,sha256=XAyZQUi8jDr47VpSAHp_8nQb0KvSMJHo5THojsToFdk,474 +django/contrib/gis/locale/lb/LC_MESSAGES/django.po,sha256=5rfudPpH4snSq2iVm9E81EBwM0S2vbkY2WBGhpuga1Q,1482 +django/contrib/gis/locale/lt/LC_MESSAGES/django.mo,sha256=9I8bq0gbDGv7wBe60z3QtWZ5x_NgALjCTvR6rBtPPBY,2113 +django/contrib/gis/locale/lt/LC_MESSAGES/django.po,sha256=jD2vv47dySaH1nVzzf7mZYKM5vmofhmaKXFp4GvX1Iw,2350 +django/contrib/gis/locale/lv/LC_MESSAGES/django.mo,sha256=vE7Ygn4CAsS7tQkrPb8kGVEchTioQxtZTxatJZXVL5k,2057 +django/contrib/gis/locale/lv/LC_MESSAGES/django.po,sha256=6qKFeIFtMexJFuz3TSxGL9vkKYmz_lCr9pDfLPTLzYw,2200 +django/contrib/gis/locale/mk/LC_MESSAGES/django.mo,sha256=PVw73LWWNvaNd95zQbAIA7LA7JNmpf61YIoyuOca2_s,2620 +django/contrib/gis/locale/mk/LC_MESSAGES/django.po,sha256=eusHVHXHRfdw1_JyuBW7H7WPCHFR_z1NBqr79AVqAk0,2927 +django/contrib/gis/locale/ml/LC_MESSAGES/django.mo,sha256=Kl9okrE3AzTPa5WQ-IGxYVNSRo2y_VEdgDcOyJ_Je78,2049 +django/contrib/gis/locale/ml/LC_MESSAGES/django.po,sha256=PWg8atPKfOsnVxg_uro8zYO9KCE1UVhfy_zmCWG0Bdk,2603 +django/contrib/gis/locale/mn/LC_MESSAGES/django.mo,sha256=-Nn70s2On94C-jmSZwTppW2q7_W5xgMpzPXYmxZSKXs,2433 +django/contrib/gis/locale/mn/LC_MESSAGES/django.po,sha256=I0ZHocPlRYrogJtzEGVPsWWHpoVEa7e2KYP9Ystlj60,2770 +django/contrib/gis/locale/mr/LC_MESSAGES/django.mo,sha256=sO2E__g61S0p5I6aEwnoAsA3epxv7_Jn55TyF0PZCUA,468 +django/contrib/gis/locale/mr/LC_MESSAGES/django.po,sha256=McWaLXfWmYTDeeDbIOrV80gwnv07KCtNIt0OXW_v7vw,1476 +django/contrib/gis/locale/my/LC_MESSAGES/django.mo,sha256=e6G8VbCCthUjV6tV6PRCy_ZzsXyZ-1OYjbYZIEShbXI,525 +django/contrib/gis/locale/my/LC_MESSAGES/django.po,sha256=R3v1S-904f8FWSVGHe822sWrOJI6cNJIk93-K7_E_1c,1580 +django/contrib/gis/locale/nb/LC_MESSAGES/django.mo,sha256=AmVS8gbKlqYHpr-v2UdOuYt17wO2WMhVJzfDWX6Tl78,1930 +django/contrib/gis/locale/nb/LC_MESSAGES/django.po,sha256=psdNBDn8IvOyAChU7NqUKIOIssUocfQKSsXnt-89fd8,2146 +django/contrib/gis/locale/ne/LC_MESSAGES/django.mo,sha256=nB-Ta8w57S6hIAhAdWZjDT0Dg6JYGbAt5FofIhJT7k8,982 +django/contrib/gis/locale/ne/LC_MESSAGES/django.po,sha256=eMH6uKZZZYn-P3kmHumiO4z9M4923s9tWGhHuJ0eWuI,1825 +django/contrib/gis/locale/nl/LC_MESSAGES/django.mo,sha256=B7fMIikRS41Rc9CiPKDVZt63apUo2uB-myFDjAJinik,1985 +django/contrib/gis/locale/nl/LC_MESSAGES/django.po,sha256=Ugo-99yB6YImfVcfbvYTxtChNcC_bRtNbIrjAnnfxnU,2378 +django/contrib/gis/locale/nn/LC_MESSAGES/django.mo,sha256=32x5_V6o_BQBefFmyajOg3ssClw-DMEdvzXkY90fV3Q,1202 +django/contrib/gis/locale/nn/LC_MESSAGES/django.po,sha256=NWA3nD8ZwAZxG9EkE6TW0POJgB6HTeC4J6GOlTMD7j4,1796 +django/contrib/gis/locale/os/LC_MESSAGES/django.mo,sha256=02NpGC8WPjxmPqQkfv9Kj2JbtECdQCtgecf_Tjk1CZc,1594 +django/contrib/gis/locale/os/LC_MESSAGES/django.po,sha256=JBIsv5nJg3Wof7Xy7odCI_xKRBLN_Hlbb__kNqNW4Xw,2161 +django/contrib/gis/locale/pa/LC_MESSAGES/django.mo,sha256=JR1NxG5_h_dFE_7p6trBWWIx-QqWYIgfGomnjaCsWAA,1265 +django/contrib/gis/locale/pa/LC_MESSAGES/django.po,sha256=Ejd_8dq_M0E9XFijk0qj4oC-8_oe48GWWHXhvOrFlnY,1993 +django/contrib/gis/locale/pl/LC_MESSAGES/django.mo,sha256=aLv23YOFYR22AY3BLP5xcDHKTqc_GVjm_FZdTNr0-Jk,2138 +django/contrib/gis/locale/pl/LC_MESSAGES/django.po,sha256=uEQ59IxEJATHQOsZcvNRdR8kd-Iv7PRTHw3dR68GID8,2497 +django/contrib/gis/locale/pt/LC_MESSAGES/django.mo,sha256=sE5PPOHzfT8QQXuV5w0m2pnBTRhKYs_vFhk8p_A4Jg0,2036 +django/contrib/gis/locale/pt/LC_MESSAGES/django.po,sha256=TFt6Oj1NlCM3pgs2dIgFZR3S3y_g7oR7S-XRBlM4924,2443 +django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo,sha256=hsj4npR8H05FKM0fiQf83kSip7a8871_AQUY5dyAqj8,2011 +django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po,sha256=NLnhgZjJxx0EUy4s_8sqQFSWOa0or0CiEjUoPlTH4pc,2311 +django/contrib/gis/locale/ro/LC_MESSAGES/django.mo,sha256=YSbX0Y_T44pBLpKmaVN7leNXBDwHZB4EWQaU9Go3szM,2047 +django/contrib/gis/locale/ro/LC_MESSAGES/django.po,sha256=QBwAO5P2FYzCSoXF52MSEtncAAimw9YQKO8HvCPbF5U,2260 +django/contrib/gis/locale/ru/LC_MESSAGES/django.mo,sha256=5uccCKKgLtin1jcp_1j4aiv5FEzX6LxRNEL3i11m7ts,2583 +django/contrib/gis/locale/ru/LC_MESSAGES/django.po,sha256=Pvs1ADP2MtalAHAZ04cpQeQPXsKBCVeggPW8GP-nsPQ,2862 +django/contrib/gis/locale/sk/LC_MESSAGES/django.mo,sha256=_LWDbFebq9jEa1YYsSMOruTk0oRaU9sxPGml1YPuink,2010 +django/contrib/gis/locale/sk/LC_MESSAGES/django.po,sha256=Iz_iHKaDzNhLM5vJd3bbzsCXzKhoEGeqECZxEgBIiGc,2244 +django/contrib/gis/locale/sl/LC_MESSAGES/django.mo,sha256=9-efMT2MoEMa5-SApGWTRiyfvI6vmZzLeMg7qGAr7_A,2067 +django/contrib/gis/locale/sl/LC_MESSAGES/django.po,sha256=foZY7N5QkuAQS7nc3CdnJerCPk-lhSb1xZqU11pNGNo,2303 +django/contrib/gis/locale/sq/LC_MESSAGES/django.mo,sha256=LVdXsubPRVA-1-VeEJEWoGoAWR9kK072boRKaqzyb28,1918 +django/contrib/gis/locale/sq/LC_MESSAGES/django.po,sha256=PFeGnVwfzGcFRm2SCV8-iB5z9TVwyN66qz5X9NClQkQ,2148 +django/contrib/gis/locale/sr/LC_MESSAGES/django.mo,sha256=J20yLH-sD2a2KGFqN3GDdJPISOS7YMe9K6UR9ZXlbl4,2442 +django/contrib/gis/locale/sr/LC_MESSAGES/django.po,sha256=cw89jyImmFqspzFVcnkncUNYAH_j3ozId-Ou2lc0L6U,2682 +django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=f_vDMwcdrbaW6ZynN9QZNYB-4TNbZyp4y5UYKCJB7yM,1971 +django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.po,sha256=7HvQAUkA1RLQOUWab-NBSunUNde4V0_nHd_Z4UMMCZc,2225 +django/contrib/gis/locale/sv/LC_MESSAGES/django.mo,sha256=XVr0uSQnEIRNJoOpgFlxvYnpF4cGDP2K2oTjqVHhmuA,1987 +django/contrib/gis/locale/sv/LC_MESSAGES/django.po,sha256=fqUAyUbjamnqbdie8Ecek0v99uo-4uUfaSvtFffz8v4,2275 +django/contrib/gis/locale/sw/LC_MESSAGES/django.mo,sha256=uBhpGHluGwYpODTE-xhdJD2e6PHleN07wLE-kjrXr_M,1426 +django/contrib/gis/locale/sw/LC_MESSAGES/django.po,sha256=nHXQQMYYXT1ec3lIBxQIDIAwLtXucX47M4Cozy08kko,1889 +django/contrib/gis/locale/ta/LC_MESSAGES/django.mo,sha256=Rboo36cGKwTebe_MiW4bOiMsRO2isB0EAyJJcoy_F6s,466 +django/contrib/gis/locale/ta/LC_MESSAGES/django.po,sha256=sLYW8_5BSVoSLWUr13BbKRe0hNJ_cBMEtmjCPBdTlAk,1474 +django/contrib/gis/locale/te/LC_MESSAGES/django.mo,sha256=xDkaSztnzQ33Oc-GxHoSuutSIwK9A5Bg3qXEdEvo4h4,824 +django/contrib/gis/locale/te/LC_MESSAGES/django.po,sha256=nYryhktJumcwtZDGZ43xBxWljvdd-cUeBrAYFZOryVg,1772 +django/contrib/gis/locale/th/LC_MESSAGES/django.mo,sha256=0kekAr7eXc_papwPAxEZ3TxHOBg6EPzdR3q4hmAxOjg,1835 +django/contrib/gis/locale/th/LC_MESSAGES/django.po,sha256=WJPdoZjLfvepGGMhfBB1EHCpxtxxfv80lRjPG9kGErM,2433 +django/contrib/gis/locale/tr/LC_MESSAGES/django.mo,sha256=cWFAsuse0yQPdsVGAxFbPOBDxLapMnvMsa50-4-gGYk,2024 +django/contrib/gis/locale/tr/LC_MESSAGES/django.po,sha256=Vqsqw1yPPdZqd5unj76FQAbuQrxKKnxtpQS_33nBGRQ,2259 +django/contrib/gis/locale/tt/LC_MESSAGES/django.mo,sha256=cGVPrWCe4WquVV77CacaJwgLSnJN0oEAepTzNMD-OWk,1470 +django/contrib/gis/locale/tt/LC_MESSAGES/django.po,sha256=98yeRs-JcMGTyizOpEuQenlnWJMYTR1-rG3HGhKCykk,2072 +django/contrib/gis/locale/udm/LC_MESSAGES/django.mo,sha256=I6bfLvRfMn79DO6bVIGfYSVeZY54N6c8BNO7OyyOOsw,462 +django/contrib/gis/locale/udm/LC_MESSAGES/django.po,sha256=B1PCuPYtNOrrhu4fKKJgkqxUrcEyifS2Y3kw-iTmSIk,1470 +django/contrib/gis/locale/uk/LC_MESSAGES/django.mo,sha256=5uJgGDDQi8RTRNxbQToKE7FVLOK73w5Wgmf6zCa66Uk,2455 +django/contrib/gis/locale/uk/LC_MESSAGES/django.po,sha256=fsxwSb93uD59ms8jdO84qx8C5rKy74TDcH12yaKs8mY,2873 +django/contrib/gis/locale/ur/LC_MESSAGES/django.mo,sha256=tB5tz7EscuE9IksBofNuyFjk89-h5X7sJhCKlIho5SY,1410 +django/contrib/gis/locale/ur/LC_MESSAGES/django.po,sha256=16m0t10Syv76UcI7y-EXfQHETePmrWX4QMVfyeuX1fQ,2007 +django/contrib/gis/locale/vi/LC_MESSAGES/django.mo,sha256=NT5T0FRCC2XINdtaCFCVUxb5VRv8ta62nE8wwSHGTrc,1384 +django/contrib/gis/locale/vi/LC_MESSAGES/django.po,sha256=y77GtqH5bv1wR78xN5JLHusmQzoENTH9kLf9Y3xz5xk,1957 +django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=Z5u0aytpFDh02hxQTLKyjiBjSd-_cF8DwPOIXvTsPiQ,1852 +django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po,sha256=CaxyL1PxYEYyLBx3w2XOLYgLfeeL6R6Xv6qJ-x7LkAE,2246 +django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=SRSpoSMtx8PDTpHroMUymZ_-Eu7zzjqPDBiAm3XSV2I,2012 +django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po,sha256=b6NQK1--AC67NiUaOew_ajDIj5uSrPzW_rUpLU71yA8,2277 +django/contrib/gis/management/commands/inspectdb.py,sha256=Z2Do56mM2tBvnujnCk5C7JhI3z_LQWB4L0M626hmumk,750 +django/contrib/gis/management/commands/ogrinspect.py,sha256=s07ShXnLoDDhtvzgu1VeRzlxk_o6-RcFflzsbjKZCFk,5720 +django/contrib/gis/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/gis/serializers/geojson.py,sha256=IWR-98IYQXvJSJ4y3d09kh3ZxuFZuEKg-T9eAig5GEA,2710 +django/contrib/gis/sitemaps/__init__.py,sha256=eVHUxfzw1VQn6bqH3D8bE471s8bNJSB3phuAI-zg9gA,138 +django/contrib/gis/sitemaps/kml.py,sha256=kbKyIt-_u7zZJB8uPG4Cfi7axA5ms2ltdonctm5zewA,2413 +django/contrib/gis/sitemaps/views.py,sha256=4xrd2NEQjsPx9582Pa0R2IEzx5NpP5unqCUsPjURgto,2313 +django/contrib/gis/static/gis/css/ol3.css,sha256=pJADzfx4_NL2C1onFpU-muconAA5NThN4sEqSNyY_So,657 +django/contrib/gis/static/gis/img/draw_line_off.svg,sha256=6XW83xsR5-Guh27UH3y5UFn9y9FB9T_Zc4kSPA-xSOI,918 +django/contrib/gis/static/gis/img/draw_line_on.svg,sha256=Hx-pXu4ped11esG6YjXP1GfZC5q84zrFQDPUo1C7FGA,892 +django/contrib/gis/static/gis/img/draw_point_off.svg,sha256=PICrywZPwuBkaQAKxR9nBJ0AlfTzPHtVn_up_rSiHH4,803 +django/contrib/gis/static/gis/img/draw_point_on.svg,sha256=raGk3oc8w87rJfLdtZ4nIXJyU3OChCcTd4oH-XAMmmM,803 +django/contrib/gis/static/gis/img/draw_polygon_off.svg,sha256=gnVmjeZE2jOvjfyx7mhazMDBXJ6KtSDrV9f0nSzkv3A,981 +django/contrib/gis/static/gis/img/draw_polygon_on.svg,sha256=ybJ9Ww7-bsojKQJtjErLd2cCOgrIzyqgIR9QNhH_ZfA,982 +django/contrib/gis/static/gis/js/OLMapWidget.js,sha256=MxTkvtZiu0Ea55FniH-0WyqoySKdrBNkZdmj8DFoeWY,8930 +django/contrib/gis/templates/gis/openlayers-osm.html,sha256=TeiUqCjt73W8Hgrp_6zAtk_ZMBxskNN6KHSmnJ1-GD4,378 +django/contrib/gis/templates/gis/openlayers.html,sha256=P_sBibtZ8ybiBG6dtYbVhRgDYJE-oKYPzl452xad5Ok,1912 +django/contrib/gis/templates/gis/admin/openlayers.html,sha256=GsjT4sNA-2iHRe7PJKsBIGDEAa29vGXwFNNACowj1lw,1867 +django/contrib/gis/templates/gis/admin/openlayers.js,sha256=KoT3VUMAez9-5QoT5U6OJXzt3MLxlTrJMMwINjQ_k7M,8975 +django/contrib/gis/templates/gis/admin/osm.html,sha256=yvYyZPmgP64r1JT3eZCDun5ENJaaN3d3wbTdCxIOvSo,111 +django/contrib/gis/templates/gis/admin/osm.js,sha256=0wFRJXKZ2plp7tb0F9fgkMzp4NrKZXcHiMkKDJeHMRw,128 +django/contrib/gis/templates/gis/kml/base.kml,sha256=VYnJaGgFVHRzDjiFjbcgI-jxlUos4B4Z1hx_JeI2ZXU,219 +django/contrib/gis/templates/gis/kml/placemarks.kml,sha256=TEC81sDL9RK2FVeH0aFJTwIzs6_YWcMeGnHkACJV1Uc,360 +django/contrib/gis/utils/__init__.py,sha256=OmngSNhywEjrNKGXysMlq_iFYvx7ycDWojpCqF6JYLo,579 +django/contrib/gis/utils/layermapping.py,sha256=8sZ9RlTKJCLbyJH8Wv1glqKQ2PIdqwG8lj-Xz02PNYI,27292 +django/contrib/gis/utils/ogrinfo.py,sha256=VmbxQ5Ri4zjtTxNymuxJp3t3cAntUC83YBMp9PuMMSU,1934 +django/contrib/gis/utils/ogrinspect.py,sha256=muqcvO6wII7A4z98feixlZaOuVTCUNQsFhISSb3z9ZU,8935 +django/contrib/gis/utils/srs.py,sha256=5D5lPZwFYgZiVaKD7eCkl9vj-pGRB11HEgeNlxUAjfo,2991 +django/contrib/humanize/__init__.py,sha256=88gkwJxqbRpmigRG0Gu3GNQkXGtTNpica4nf3go-_cI,67 +django/contrib/humanize/apps.py,sha256=ODfDrSH8m3y3xYlyIIwm7DZmrNcoYKG2K8l5mU64V7g,194 +django/contrib/humanize/locale/af/LC_MESSAGES/django.mo,sha256=bNLjjeZ3H-KD_pm-wa1_5eLCDOmG2FXgDHVOg5vgL7o,5097 +django/contrib/humanize/locale/af/LC_MESSAGES/django.po,sha256=p3OduzjtTGkwlgDJhPgSm9aXI2sWzORspsPf7_RnWjs,8923 +django/contrib/humanize/locale/ar/LC_MESSAGES/django.mo,sha256=YSyNaNTh2nILzWMH0F61fl7jX0yb4erZhQO1EBo2HiU,7691 +django/contrib/humanize/locale/ar/LC_MESSAGES/django.po,sha256=VAN7tVSYQZfZV5RfTe-wvQOVA9Q1ylLQRrFb9ihMpqs,11035 +django/contrib/humanize/locale/ast/LC_MESSAGES/django.mo,sha256=WvBk8V6g1vgzGqZ_rR-4p7SMh43PFnDnRhIS9HSwdoQ,3468 +django/contrib/humanize/locale/ast/LC_MESSAGES/django.po,sha256=S9lcUf2y5wR8Ufa-Rlz-M73Z3bMo7zji_63cXwtDK2I,5762 +django/contrib/humanize/locale/az/LC_MESSAGES/django.mo,sha256=0AyL47PqJZ63WlE6RjeWswa3vamKTORG4WBxtxkRG0Q,5216 +django/contrib/humanize/locale/az/LC_MESSAGES/django.po,sha256=0KOf2dLEhXbdGVFbghfdw_jNOXyG9SzAMztB0rj2pwg,9131 +django/contrib/humanize/locale/be/LC_MESSAGES/django.mo,sha256=HEtO6H9OxRn6ybMtRjkD6deu7sMA49GY988Nc5r2nNY,6681 +django/contrib/humanize/locale/be/LC_MESSAGES/django.po,sha256=GM21lBORfcLeQMaif6tuxrPd45srvSDvzaThGCdjs7o,9256 +django/contrib/humanize/locale/bg/LC_MESSAGES/django.mo,sha256=1mRaFPsm5ITFyfdFdqdeY-_Om2OYKua5YWSEP192WR8,4645 +django/contrib/humanize/locale/bg/LC_MESSAGES/django.po,sha256=kTyRblfWlBUMxd_czXTOe-39CcX68X6e4DTmYm3V2gc,6684 +django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo,sha256=jbL4ucZxxtexI10jgldtgnDie3I23XR3u-PrMMMqP6U,4026 +django/contrib/humanize/locale/bn/LC_MESSAGES/django.po,sha256=0l4yyy7q3OIWyFk_PW0y883Vw2Pmu48UcnLM9OBxB68,6545 +django/contrib/humanize/locale/br/LC_MESSAGES/django.mo,sha256=V_tPVAyQzVdDwWPNlVGWmlVJjmVZfbh35alkwsFlCNU,5850 +django/contrib/humanize/locale/br/LC_MESSAGES/django.po,sha256=BcAqEV2JpF0hiCQDttIMblp9xbB7zoHsmj7fJFV632k,12245 +django/contrib/humanize/locale/bs/LC_MESSAGES/django.mo,sha256=1-RNRHPgZR_9UyiEn9Djp4mggP3fywKZho45E1nGMjM,1416 +django/contrib/humanize/locale/bs/LC_MESSAGES/django.po,sha256=M017Iu3hyXmINZkhCmn2he-FB8rQ7rXN0KRkWgrp7LI,5498 +django/contrib/humanize/locale/ca/LC_MESSAGES/django.mo,sha256=C_0r2Zqa-i4uGR7pIoPWvCKiCQTpvjtRTFytU9CScOk,3989 +django/contrib/humanize/locale/ca/LC_MESSAGES/django.po,sha256=hZLVccYcRZcagCHD7rzJHsvQ_vlrrjFaWeUH-wseHYE,8931 +django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo,sha256=QdKlbOcOfSGv-TYg3KkYr1Ox4Ct2xXJskWVzPDm3ros,6846 +django/contrib/humanize/locale/cs/LC_MESSAGES/django.po,sha256=tm42tsSZYzY-a_7szHB9yuJYUffQXz4nfEgvEY9vY9w,11579 +django/contrib/humanize/locale/cy/LC_MESSAGES/django.mo,sha256=VjJiaUUhvX9tjOEe6x2Bdp7scvZirVcUsA4-iE2-ElQ,5241 +django/contrib/humanize/locale/cy/LC_MESSAGES/django.po,sha256=sylmceSq-NPvtr_FjklQXoBAfueKu7hrjEpMAsVbQC4,7813 +django/contrib/humanize/locale/da/LC_MESSAGES/django.mo,sha256=39MZAKMl4mfYYhOHWw02oWAF3n-XwPg1nNbOg7OQA38,5339 +django/contrib/humanize/locale/da/LC_MESSAGES/django.po,sha256=AnAvSgks2ph0MS2ZJlYKddKwQTbduEIpHK0kzsNphWM,9151 +django/contrib/humanize/locale/de/LC_MESSAGES/django.mo,sha256=7HZDGVn4FuGS2nNqHLg1RrnmQLB2Ansbri0ysHq-GfM,5418 +django/contrib/humanize/locale/de/LC_MESSAGES/django.po,sha256=wNFP1wO9hDhgyntigfVcHr7ZGao8a2PPgU24j4nl_O8,9184 +django/contrib/humanize/locale/dsb/LC_MESSAGES/django.mo,sha256=w2rgnclJnn1QQjqufly0NjUlP6kS6N8dcGwhbeBLq-w,7036 +django/contrib/humanize/locale/dsb/LC_MESSAGES/django.po,sha256=AAbtZ32HrIeB1SDn3xenPU8pFUL0Fy6D9eYlObt6EdU,11690 +django/contrib/humanize/locale/el/LC_MESSAGES/django.mo,sha256=o-yjhpzyGRbbdMzwUcG_dBP_FMEMZevm7Wz1p4Wd-pg,6740 +django/contrib/humanize/locale/el/LC_MESSAGES/django.po,sha256=UbD5QEw_-JNoNETaOyDfSReirkRsHnlHeSsZF5hOSkI,10658 +django/contrib/humanize/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/humanize/locale/en/LC_MESSAGES/django.po,sha256=JJny3qazVIDtswuStyS6ZMV0UR0FUPWDqXVZ8PQRuU4,10689 +django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/humanize/locale/en_AU/LC_MESSAGES/django.po,sha256=dVOlMtk3-d-KrNLM5Rji-Xrk6Y_n801ofjGQvxSu67M,4742 +django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.mo,sha256=mkx192XQM3tt1xYG8EOacMfa-BvgzYCbSsJQsWZGeAo,3461 +django/contrib/humanize/locale/en_GB/LC_MESSAGES/django.po,sha256=MArKzXxY1104jxaq3kvDZs2WzOGYxicfJxFKsLzFavw,5801 +django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo,sha256=b47HphXBi0cax_reCZiD3xIedavRHcH2iRG8pcwqb54,5386 +django/contrib/humanize/locale/eo/LC_MESSAGES/django.po,sha256=oN1YqOZgxKY3L1a1liluhM6X5YA5bawg91mHF_Vfqx8,9095 +django/contrib/humanize/locale/es/LC_MESSAGES/django.mo,sha256=SD1PQS13JgpM7jnvvtKVQYsV6m7IgYdw7cfQ_VW8nag,5440 +django/contrib/humanize/locale/es/LC_MESSAGES/django.po,sha256=MBPPR_43glxHTmNPHy7sdKp5UjeHqe7_GeXkxOy3QGo,9428 +django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.mo,sha256=n6DaVdBRRopeMBZiOhPLCOIqmP5uq9Vq3aqxMXFZZPg,5502 +django/contrib/humanize/locale/es_AR/LC_MESSAGES/django.po,sha256=zk18690pQF6URZmvOISW6OsoRQNiiU5lt_q07929Rko,9360 +django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.mo,sha256=2GhQNtNOjK5mTov5RvnuJFTYbdoGBkDGLxzvJ8Vsrfs,4203 +django/contrib/humanize/locale/es_CO/LC_MESSAGES/django.po,sha256=JBf2fHO8jWi6dFdgZhstKXwyot_qT3iJBixQZc3l330,6326 +django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.mo,sha256=82DL2ztdq10X5RIceshK1nO99DW5628ZIjaN8Xzp9ok,3939 +django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po,sha256=-O7AQluA5Kce9-bd04GN4tfQKoCxb8Sa7EZR6TZBCdM,6032 +django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.mo,sha256=cJECzKpD99RRIpVFKQW65x0Nvpzrm5Fuhfi-nxOWmkM,942 +django/contrib/humanize/locale/es_VE/LC_MESSAGES/django.po,sha256=tDdYtvRILgeDMgZqKHSebe7Z5ZgI1bZhDdvGVtj_anM,4832 +django/contrib/humanize/locale/et/LC_MESSAGES/django.mo,sha256=uq4MJ63oINTjeiW8dsd-h7F3Mm95Sccho6_JIHAXhrc,4402 +django/contrib/humanize/locale/et/LC_MESSAGES/django.po,sha256=encp47HDhO8aDbDmOMaI8oZPIc5He70l-fyPBDQlWlA,9069 +django/contrib/humanize/locale/eu/LC_MESSAGES/django.mo,sha256=w2TlBudWWTI1M7RYCl_n2UY7U1CBzxIuwXl-7DCVl8o,5287 +django/contrib/humanize/locale/eu/LC_MESSAGES/django.po,sha256=77QrRqIsMuu-6HxHvaifKsPA9OVZR7686WFp26dQFMg,9146 +django/contrib/humanize/locale/fa/LC_MESSAGES/django.mo,sha256=-EfCvMVkX5VqYlXxiX8fLQntzZx8pBjmjtjvIdsaPvU,5808 +django/contrib/humanize/locale/fa/LC_MESSAGES/django.po,sha256=Xxv-FVTrSjbx0JB33F6O1wBzodwkHJpmTEiNssNTeYQ,9775 +django/contrib/humanize/locale/fi/LC_MESSAGES/django.mo,sha256=qlx3w4Y0CNcC5rIrbig_sqCvKAwh_IS-YseoQX3zymc,4177 +django/contrib/humanize/locale/fi/LC_MESSAGES/django.po,sha256=6xTZvvC_VxAyAQpUibJUDu4V2Gdryy8vJc2OviaYNnw,6180 +django/contrib/humanize/locale/fr/LC_MESSAGES/django.mo,sha256=VsUhyAmxhMFWTBqij70UaY9I8qulli2QP_hyoKgNaxM,5502 +django/contrib/humanize/locale/fr/LC_MESSAGES/django.po,sha256=xyn-d8-_ozUhfr25hpuUU5IQhZvtNI0JVDoUYoRzO88,9311 +django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/humanize/locale/fy/LC_MESSAGES/django.po,sha256=pPvcGgBWiZwQ5yh30OlYs-YZUd_XsFro71T9wErVv0M,4732 +django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo,sha256=AOEiBNOak_KQkBeGyUpTNO12zyg3CiK66h4kMoS15_0,5112 +django/contrib/humanize/locale/ga/LC_MESSAGES/django.po,sha256=jTXihbd-ysAUs0TEKkOBmXJJj69V0cFNOHM6VbcPCWw,11639 +django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo,sha256=XNSpJUu4DxtlXryfUVeBOrvl2-WRyj2nKjips_qGDOg,7232 +django/contrib/humanize/locale/gd/LC_MESSAGES/django.po,sha256=I7s86NJDzeMsCGgXja--fTZNFm9bM7Cd8M1bstxabSY,11874 +django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo,sha256=ChoVHsJ_bVIaHtHxhxuUK99Zu1tvRu0iY5vhtB1LDMg,3474 +django/contrib/humanize/locale/gl/LC_MESSAGES/django.po,sha256=U5D505aBKEdg80BGWddcwWuzmYdoNHx1WEPzVHQfbTE,5903 +django/contrib/humanize/locale/he/LC_MESSAGES/django.mo,sha256=zV7tqLeq2al9nSDKcTGp7cDD2pEuHD-J_34roqIYvZc,7857 +django/contrib/humanize/locale/he/LC_MESSAGES/django.po,sha256=gvUe-8PJc6dn-6lLpEi_PCDgITgJ6UzZls9cUHSA4Ss,12605 +django/contrib/humanize/locale/hi/LC_MESSAGES/django.mo,sha256=qrzm-6vXIUsxA7nOxa-210-6iO-3BPBj67vKfhTOPrY,4131 +django/contrib/humanize/locale/hi/LC_MESSAGES/django.po,sha256=BrypbKaQGOyY_Gl1-aHXiBVlRqrbSjGfZ2OK8omj_9M,6527 +django/contrib/humanize/locale/hr/LC_MESSAGES/django.mo,sha256=29XTvFJHex31hbu2qsOfl5kOusz-zls9eqlxtvw_H0s,1274 +django/contrib/humanize/locale/hr/LC_MESSAGES/django.po,sha256=OuEH4fJE6Fk-s0BMqoxxdlUAtndvvKK7N8Iy-9BP3qA,5424 +django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo,sha256=4ZQDrpkEyLSRtVHEbP31ejNrR6y-LSNDfW1Hhi7VczI,7146 +django/contrib/humanize/locale/hsb/LC_MESSAGES/django.po,sha256=GtSTgK-cKHMYeOYFvHtcUtUnLyWPP05F0ZM3tEYfshs,11800 +django/contrib/humanize/locale/hu/LC_MESSAGES/django.mo,sha256=8tEqiZHEc6YmfWjf7hO0Fb3Xd-HSleKaR1gT_XFTQ8g,5307 +django/contrib/humanize/locale/hu/LC_MESSAGES/django.po,sha256=KDVYBAGSuMrtwqO98-oGOOAp7Unfm7ode1sv8lfe81c,9124 +django/contrib/humanize/locale/hy/LC_MESSAGES/django.mo,sha256=3eLljpKHSE0P2ZPaOiwE8lvctqp5s-ePqrw5Yw7kWYM,1529 +django/contrib/humanize/locale/hy/LC_MESSAGES/django.po,sha256=dJ1cE9AFwses7KX4Qm4PNqNhC9t5sgNQL5PB88cXqY4,7826 +django/contrib/humanize/locale/ia/LC_MESSAGES/django.mo,sha256=d0m-FddFnKp08fQYQSC9Wr6M4THVU7ibt3zkIpx_Y_A,4167 +django/contrib/humanize/locale/ia/LC_MESSAGES/django.po,sha256=qX6fAZyn54hmtTU62oJcHF8p4QcYnoO2ZNczVjvjOeE,6067 +django/contrib/humanize/locale/id/LC_MESSAGES/django.mo,sha256=T5pVIyFQtRdbBxZ5kW15NnsJQV2W0sgb9ltncyORJog,4665 +django/contrib/humanize/locale/id/LC_MESSAGES/django.po,sha256=fQSJprf0UF3FYGA7i_vWbZ7PX5bhH7pJaH1JAWvr9NI,8055 +django/contrib/humanize/locale/io/LC_MESSAGES/django.mo,sha256=nMu5JhIy8Fjie0g5bT8-h42YElCiS00b4h8ej_Ie-w0,464 +django/contrib/humanize/locale/io/LC_MESSAGES/django.po,sha256=RUs8JkpT0toKOLwdv1oCbcBP298EOk02dkdNSJiC-_A,4720 +django/contrib/humanize/locale/is/LC_MESSAGES/django.mo,sha256=D6ElUYj8rODRsZwlJlH0QyBSM44sVmuBCNoEkwPVxko,3805 +django/contrib/humanize/locale/is/LC_MESSAGES/django.po,sha256=1VddvtkhsK_5wmpYIqEFqFOo-NxIBnL9wwW74Tw9pbw,8863 +django/contrib/humanize/locale/it/LC_MESSAGES/django.mo,sha256=E-83rstHy_gscbdEHm_77HqH2IkIJA8ZcqWe_GD4Wco,5981 +django/contrib/humanize/locale/it/LC_MESSAGES/django.po,sha256=0dF-NRmW2fetk5DHkZEmpiZyLQ2JyvFlDs5EXxXMz9s,10049 +django/contrib/humanize/locale/ja/LC_MESSAGES/django.mo,sha256=XYV-llqoZAazu_idchujnUdGpfAa8mZDMUG1xo3CmE4,4840 +django/contrib/humanize/locale/ja/LC_MESSAGES/django.po,sha256=kjCkSQHFZ4jUDc6rxRvPM6OczUVCe1timYSyI0isujI,8144 +django/contrib/humanize/locale/ka/LC_MESSAGES/django.mo,sha256=UeUbonYTkv1d2ljC0Qj8ZHw-59zHu83fuMvnME9Fkmw,4878 +django/contrib/humanize/locale/ka/LC_MESSAGES/django.po,sha256=-eAMexwjm8nSB4ARJU3f811UZnuatHKIFf8FevpJEpo,9875 +django/contrib/humanize/locale/kk/LC_MESSAGES/django.mo,sha256=jujbUM0jOpt3Mw8zN4LSIIkxCJ0ihk_24vR0bXoux78,2113 +django/contrib/humanize/locale/kk/LC_MESSAGES/django.po,sha256=hjZg_NRE9xMA5uEa2mVSv1Hr4rv8inG9es1Yq7uy9Zc,8283 +django/contrib/humanize/locale/km/LC_MESSAGES/django.mo,sha256=mfXs9p8VokORs6JqIfaSSnQshZEhS90rRFhOIHjW7CI,459 +django/contrib/humanize/locale/km/LC_MESSAGES/django.po,sha256=JQBEHtcy-hrV_GVWIjvUJyOf3dZ5jUzzN8DUTAbHKUg,4351 +django/contrib/humanize/locale/kn/LC_MESSAGES/django.mo,sha256=Oq3DIPjgCqkn8VZMb6ael7T8fQ7LnWobPPAZKQSFHl4,461 +django/contrib/humanize/locale/kn/LC_MESSAGES/django.po,sha256=yrXx6TInsxjnyJfhl8sXTLmYedd2jaAku9L_38CKR5A,4353 +django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo,sha256=hDb7IOB8PRflKkZ81yQbgHtvN4TO35o5kWTK3WpiL4A,4817 +django/contrib/humanize/locale/ko/LC_MESSAGES/django.po,sha256=dZpSVF3l5wGTwKOXn0looag7Q23jyLGlzs083kpnqFc,8217 +django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/humanize/locale/lb/LC_MESSAGES/django.po,sha256=_y0QFS5Kzx6uhwOnzmoHtCrbufMrhaTLsHD0LfMqtcM,4730 +django/contrib/humanize/locale/lt/LC_MESSAGES/django.mo,sha256=9S3Fx2Es10uMIVooheEH3HZaKqXju2gUE-uVLgCEwe8,7374 +django/contrib/humanize/locale/lt/LC_MESSAGES/django.po,sha256=ZnsyLaRbhaSk0zNl6qZkKKlDVWJ6M_a3cIuGqUNVS28,12089 +django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo,sha256=dFrXeAiw976Zi2fWwdPigyo3rieo8yrhN54dYZChIQE,6252 +django/contrib/humanize/locale/lv/LC_MESSAGES/django.po,sha256=24-3dJTQeiqzf3wKAQggC7rZq3q67e9ltCyXhEYSJw4,10575 +django/contrib/humanize/locale/mk/LC_MESSAGES/django.mo,sha256=htUgd6rcaeRPDf6UrEb18onz-Ayltw9LTvWRgEkXm08,4761 +django/contrib/humanize/locale/mk/LC_MESSAGES/django.po,sha256=Wl9Rt8j8WA_0jyxKCswIovSiCQD-ZWFYXbhFsCUKIWo,6665 +django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo,sha256=rJuNYIlbZI6kFOXOamF17prachKeteiFMwv9nfBlptA,4736 +django/contrib/humanize/locale/ml/LC_MESSAGES/django.po,sha256=cMDjSKjpV1faKhC1ozTqpYAlhM4yoKauSCbMfmX8jYw,10131 +django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo,sha256=gi-b-GRPhg2s2O9wP2ENx4bVlgHBo0mSqoi58d_QpCw,6020 +django/contrib/humanize/locale/mn/LC_MESSAGES/django.po,sha256=0zV7fYPu6xs_DVOCUQ6li36JWOnpc-RQa0HXwo7FrWc,9797 +django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/humanize/locale/mr/LC_MESSAGES/django.po,sha256=M44sYiBJ7woVZZlDO8rPDQmS_Lz6pDTCajdheyxtdaI,4724 +django/contrib/humanize/locale/ms/LC_MESSAGES/django.mo,sha256=xSHIddCOU0bnfiyzQLaDaHAs1E4CaBlkyeXdLhJo1A8,842 +django/contrib/humanize/locale/ms/LC_MESSAGES/django.po,sha256=YhBKpxsTw9BleyaDIoDJAdwDleBFQdo1LckqLRmN8x4,7127 +django/contrib/humanize/locale/my/LC_MESSAGES/django.mo,sha256=55CWHz34sy9k6TfOeVI9GYvE9GRa3pjSRE6DSPk9uQ8,3479 +django/contrib/humanize/locale/my/LC_MESSAGES/django.po,sha256=jCiDhSqARfqKcMLEHJd-Xe6zo3Uc9QpiCh3BbAAA5UE,5433 +django/contrib/humanize/locale/nb/LC_MESSAGES/django.mo,sha256=5ia28xUNmXT5gsLVJ1A9v1UHZJnFTe7i7lwraUO2jvs,5358 +django/contrib/humanize/locale/nb/LC_MESSAGES/django.po,sha256=_FE2vx5v7eLXzNQ-4qvxA-ia8AJrilcJyQXZ38I9IUU,9137 +django/contrib/humanize/locale/ne/LC_MESSAGES/django.mo,sha256=OR0cBS_sNftLjHBLtQkRsA_SOxlc41G83vBGCvYaG2I,2285 +django/contrib/humanize/locale/ne/LC_MESSAGES/django.po,sha256=t9ukUPhAxkNlLlAMI2ftMUATPBS29UQ7q76WN2rjBWA,5544 +django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo,sha256=lHZmifHfXh7Xvz1N7UtoboZupRo8S02axRPzWQfGB7k,5303 +django/contrib/humanize/locale/nl/LC_MESSAGES/django.po,sha256=s7LbdXpSQxkqSr666oTwTNlfdrJpLeYGoCe1xlAkGH8,9217 +django/contrib/humanize/locale/nn/LC_MESSAGES/django.mo,sha256=_Qbyf366ApSCU09Er6CvEf5WrA8s6ZzsyZXs44BoT10,3482 +django/contrib/humanize/locale/nn/LC_MESSAGES/django.po,sha256=qkEeQKQ8XwPKtTv2Y8RscAnE4QarinOze3Y3BTIEMCk,5818 +django/contrib/humanize/locale/os/LC_MESSAGES/django.mo,sha256=BwS3Mj7z_Fg5s7Qm-bGLVhzYLZ8nPgXoB0gXLnrMGWc,3902 +django/contrib/humanize/locale/os/LC_MESSAGES/django.po,sha256=CGrxyL5l-5HexruOc7QDyRbum7piADf-nY8zjDP9wVM,6212 +django/contrib/humanize/locale/pa/LC_MESSAGES/django.mo,sha256=TH1GkAhaVVLk2jrcqAmdxZprWyikAX6qMP0eIlr2tWM,1569 +django/contrib/humanize/locale/pa/LC_MESSAGES/django.po,sha256=_7oP0Hn-IU7IPLv_Qxg_wstLEdhgWNBBTCWYwSycMb0,5200 +django/contrib/humanize/locale/pl/LC_MESSAGES/django.mo,sha256=uz0OAv0VFNcf09x0nN2EBDiX248ZrtGSz_6jhBgY6H0,7018 +django/contrib/humanize/locale/pl/LC_MESSAGES/django.po,sha256=3y6Net6u3PvYyTsvliLG_2dEI-3utPW9UG6gFmf2DZ0,11936 +django/contrib/humanize/locale/pt/LC_MESSAGES/django.mo,sha256=El9Sdr3kXS-yTol_sCg1dquxf0ThDdWyrWGjjim9Dj4,5408 +django/contrib/humanize/locale/pt/LC_MESSAGES/django.po,sha256=XudOc67ybF_fminrTR2XOCKEKwqB5FX14pl3clCNXGE,9281 +django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.mo,sha256=5GqZStkWlU0gGvtk_ufR3ZdLRqLEkSF6KJtbTuJb3pc,5427 +django/contrib/humanize/locale/pt_BR/LC_MESSAGES/django.po,sha256=Hz2kgq9Nv4jjGCyL16iE9ctJElxcLoIracR7DuVY-BE,9339 +django/contrib/humanize/locale/ro/LC_MESSAGES/django.mo,sha256=NcQde9eakJYiI4R3wE2R4ek9iq0p9OmHVktiJGdfmXM,6229 +django/contrib/humanize/locale/ro/LC_MESSAGES/django.po,sha256=lYA7q6-qiISsf-SpH40QB92Fyr3QXd05sPHN4bzyubM,10578 +django/contrib/humanize/locale/ru/LC_MESSAGES/django.mo,sha256=tkKePMXIA1h_TXxXmB2m-QbelTteNKEc5-SEzs7u6FM,8569 +django/contrib/humanize/locale/ru/LC_MESSAGES/django.po,sha256=fXkT7XpiU2_wmnR1__QCxIdndI2M3ssNus8rMM-TSOw,13609 +django/contrib/humanize/locale/sk/LC_MESSAGES/django.mo,sha256=uUeDN0iYDq_3vT3NcTOTpKCGcv2ner5WtkIk6GVIsu0,6931 +django/contrib/humanize/locale/sk/LC_MESSAGES/django.po,sha256=cwmpA5EbD4ZE8aK0I1enRE_4RVbtfp1HQy0g1n_IYAE,11708 +django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo,sha256=f_07etc_G4OdYiUBKPkPqKm2iINqXoNsHUi3alUBgeo,5430 +django/contrib/humanize/locale/sl/LC_MESSAGES/django.po,sha256=mleF0fvn0oEfszhGLoaQkWofTwZJurKrJlIH8o-6kAI,8166 +django/contrib/humanize/locale/sq/LC_MESSAGES/django.mo,sha256=E2dqixG143nNeVxaXxaibF83OE2hRHvj_BXGS3zf9w0,5321 +django/contrib/humanize/locale/sq/LC_MESSAGES/django.po,sha256=BS-5o3aG8Im9dWTkx4E_IbbeTRFcjjohinz1823ZepI,9127 +django/contrib/humanize/locale/sr/LC_MESSAGES/django.mo,sha256=_YudgsUlnmAqspuuHFh2pMZ8H7SCEqm6UZ7-U7-kCnI,7246 +django/contrib/humanize/locale/sr/LC_MESSAGES/django.po,sha256=8AvdR2SIuIPbqndDWZrB0DHaWGAEGtgSCy3HG2J1AXQ,11423 +django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=PaGxGtTZSzguwipvTdOhO7bvM8WlzCWb1RCEaIupRUQ,562 +django/contrib/humanize/locale/sr_Latn/LC_MESSAGES/django.po,sha256=FrPnMu6xX0NypoRYRAOBhdICGSv8geuHXQKKn3Gd9ck,5185 +django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo,sha256=9BCahKoSjzfgXKCkubKvfyXAcrGAzaHvTtp-gSZzL84,5359 +django/contrib/humanize/locale/sv/LC_MESSAGES/django.po,sha256=-Agt-sWKqksZ_DCK1lRm4wzMnen4X28Gg1-hVfzI9FY,9224 +django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo,sha256=cxjSUqegq1JX08xIAUgqq9ByP-HuqaXuxWM8Y2gHdB4,4146 +django/contrib/humanize/locale/sw/LC_MESSAGES/django.po,sha256=bPYrLJ2yY_lZ3y1K-RguNi-qrxq2r-GLlsz1gZcm2A8,6031 +django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo,sha256=1X2vH0iZOwM0uYX9BccJUXqK-rOuhcu5isRzMpnjh2o,466 +django/contrib/humanize/locale/ta/LC_MESSAGES/django.po,sha256=8x1lMzq2KOJveX92ADSuqNmXGIEYf7fZ1JfIJPysS04,4722 +django/contrib/humanize/locale/te/LC_MESSAGES/django.mo,sha256=iKd4dW9tan8xPxgaSoenIGp1qQpvSHHXUw45Tj2ATKQ,1327 +django/contrib/humanize/locale/te/LC_MESSAGES/django.po,sha256=FQdjWKMsiv-qehYZ4AtN9iKRf8Rifzcm5TZzMkQVfQI,5103 +django/contrib/humanize/locale/th/LC_MESSAGES/django.mo,sha256=jT7wGhYWP9HHwOvtr2rNPStiOgZW-rGMcO36w1U8Y4c,3709 +django/contrib/humanize/locale/th/LC_MESSAGES/django.po,sha256=ZO3_wU7z0VASS5E8RSLEtmTveMDjJ0O8QTynb2-jjt0,8318 +django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo,sha256=IpHLnlAZ-gp6WUFSu_LJLMZqmqZqTXRtBRPcnaU_3fQ,5304 +django/contrib/humanize/locale/tr/LC_MESSAGES/django.po,sha256=FroATMApIsS1UfhjQl7NPG0QgmXXkHZU7JjOd4jaEhM,9163 +django/contrib/humanize/locale/tt/LC_MESSAGES/django.mo,sha256=z8VgtMhlfyDo7bERDfrDmcYV5aqOeBY7LDgqa5DRxDM,3243 +django/contrib/humanize/locale/tt/LC_MESSAGES/django.po,sha256=j_tRbg1hzLBFAmPQt0HoN-_WzWFtA07PloCkqhvNkcY,5201 +django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/humanize/locale/udm/LC_MESSAGES/django.po,sha256=AR55jQHmMrbA6RyHGOtqdvUtTFlxWnqvfMy8vZK25Bo,4354 +django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo,sha256=zfZYq_oejaTyWHQms01zT7jZc_1NX6WTxWlR3IjlJm4,8854 +django/contrib/humanize/locale/uk/LC_MESSAGES/django.po,sha256=BzEfymhdA2kJojtHX7RAvyrjYGOv5BqfOsfwqH1maeI,13765 +django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo,sha256=MF9uX26-4FFIz-QpDUbUHUNLQ1APaMLQmISMIaPsOBE,1347 +django/contrib/humanize/locale/ur/LC_MESSAGES/django.po,sha256=D5UhcPEcQ16fsBEdkk_zmpjIF6f0gEv0P86z_pK_1eA,5015 +django/contrib/humanize/locale/vi/LC_MESSAGES/django.mo,sha256=ZUK_Na0vnfdhjo0MgnBWnGFU34sxcMf_h0MeyuysKG8,3646 +django/contrib/humanize/locale/vi/LC_MESSAGES/django.po,sha256=DzRpXObt9yP5RK_slWruaIhnVI0-JXux2hn_uGsVZiE,5235 +django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=JcMWgxYXOPXTCR6t8szkuDHSQ6p0RJX7Tggq84gJhwQ,4709 +django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po,sha256=L7SmGldceykiGHJe42Hxx_qyJa9rBuAnJdYgIY-L-6o,8242 +django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=xnSOYPtXlGmZ8KmxwI1j_di_SETzDX2YzEOm5bP6u7U,3185 +django/contrib/humanize/locale/zh_Hant/LC_MESSAGES/django.po,sha256=6XCW7c9LEgvOrSM8ekCDt4Z1o4qFnOce4jggox4hd7o,7760 +django/contrib/humanize/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/humanize/templatetags/humanize.py,sha256=jWaEmELSKaVBkSxYMik19sg5ZBmPdvRy-19x8s0p26I,12467 +django/contrib/messages/__init__.py,sha256=Sjt2mgia8vqSpISrs67N27rAXgvqR-MPq37VB-nmSvE,174 +django/contrib/messages/api.py,sha256=sWP2DP-n8ZWOTM-BLFDGrH_l-voGwrSxC0OgEyJt1F4,3071 +django/contrib/messages/apps.py,sha256=yGXBKfV5WF_ElcPbX4wJjXq6jzp39ttnO7sp8N_IzOQ,194 +django/contrib/messages/constants.py,sha256=WZxjzvEoKI7mgChSFp_g9e-zUH8r6JLhu9sFsftTGNA,312 +django/contrib/messages/context_processors.py,sha256=0LniZjxZ7Fx2BxYdJ0tcruhG4kkBEEhsc7Urcf31NnE,354 +django/contrib/messages/middleware.py,sha256=4L-bzgSjTw-Kgh8Wg8MOqkJPyilaxyXi_jH1UpP1h-U,986 +django/contrib/messages/utils.py,sha256=6PzAryJ0e6oOwtSAMrjAIsYGu_nWIpgMG0p8f_rzOrg,256 +django/contrib/messages/views.py,sha256=R5xD2DLmAO0x6EGpE8TX5bku4zioOiYkQnAtf6r-VAE,523 +django/contrib/messages/storage/__init__.py,sha256=gXDHbQ9KgQdfhYOla9Qj59_SlE9WURQiKzIA0cFH0DQ,392 +django/contrib/messages/storage/base.py,sha256=SyLyVQeRdmPvVt9SO4srCdIb0m2oBu1H_iOx40M48BM,5643 +django/contrib/messages/storage/cookie.py,sha256=vAvUYBznSRY2ztfeZe5a38yuq1a11LGkDchs3c3AwME,6532 +django/contrib/messages/storage/fallback.py,sha256=IbyyZg8cTU-19ZeRg6LndLfRK0SoevDwqKtrqzhVp6c,2095 +django/contrib/messages/storage/session.py,sha256=KTAqur1KMJUc-liD-I0mVDYbafMS23zxZfnFz4XPiiU,1729 +django/contrib/postgres/__init__.py,sha256=jtn9-mwOISc5D_YUoQ5z_3sN4bEPNxBOCDzbGNag_mc,67 +django/contrib/postgres/apps.py,sha256=Yj8hOP1HhMWjiI0i6DrTxl-AfDpCLb-p8QCaiOsvZOU,3002 +django/contrib/postgres/functions.py,sha256=zHeAyKR5MhnsIGI5qbtmRdxPm8OtycEBE5OmCNyynD8,252 +django/contrib/postgres/indexes.py,sha256=TKogHydJIUrhIxfDmDTEKhxIby916-JIKsJAtJgZXtE,6446 +django/contrib/postgres/lookups.py,sha256=CIzOtQhabWI5_GERU95REYVA5wzhimdz9hpGXtKpW08,1901 +django/contrib/postgres/operations.py,sha256=R8jm7u9K5dPvdbmsSvCO95x8oI7LSat01CeXtPUzL5c,2010 +django/contrib/postgres/search.py,sha256=PgYrl42XxKKCl6Af94poZC_FYz8ChGVsc-wDrXevtdU,9014 +django/contrib/postgres/serializers.py,sha256=EPW4-JtgMV_x4_AosG4C-HLX3K4O9ls9Ezw9f07iHd8,435 +django/contrib/postgres/signals.py,sha256=MmUklgaTW1-UBMGQTxNO_1fsO7mZugGs9ScovuCIyJo,2245 +django/contrib/postgres/utils.py,sha256=gBGBmAYMKLkB6nyaRgx5Yz_00bXaOA6BDK9koiE-_co,1187 +django/contrib/postgres/validators.py,sha256=CA_iygE2q3o8tXlQ9JfMYxoO6HDJk3D0PIcmGrahwdI,2675 +django/contrib/postgres/aggregates/__init__.py,sha256=QCznqMKqPbpraxSi1Y8-B7_MYlL42F1kEWZ1HeLgTKs,65 +django/contrib/postgres/aggregates/general.py,sha256=w6Gixqh_ZtGJwkpD1TtYLOAKESplztLlI6brAt_FCco,1521 +django/contrib/postgres/aggregates/mixins.py,sha256=SBJjxbcpFCGRaWZDck21ts-Q98uVfPExgE1U5JI1Eqg,2433 +django/contrib/postgres/aggregates/statistics.py,sha256=NWyxMgDsfQ3f5yvqAcxJ13LayjGkRPj90wVJa4k7QdM,1691 +django/contrib/postgres/fields/__init__.py,sha256=Xo8wuWPwVNOkKY-EwV9U1zusQ2DjMXXtL7_8R_xAi5s,148 +django/contrib/postgres/fields/array.py,sha256=B8EKnT1HqpRveKQvfWwZ_O9aJ0CXy-DM1O_4_uQvE78,10366 +django/contrib/postgres/fields/citext.py,sha256=G40UZv4zop8Zrq2vMhluZ-MT7yPLEc8IEDi3hZ27gGw,439 +django/contrib/postgres/fields/hstore.py,sha256=OWAljan0faRYss3Imq0T66NhnYxEHWNmUmstJpvpZ88,3217 +django/contrib/postgres/fields/jsonb.py,sha256=IZ4lqu4nNuqMqTB_iEZ3CLM5xkpBODiFPEhOEb0prSw,5692 +django/contrib/postgres/fields/mixins.py,sha256=eYtXzR2ec8J8564b-eaUsE17UO_AIkqrlKD-p0GlTGo,986 +django/contrib/postgres/fields/ranges.py,sha256=_qwGh3oBnItCMPTMhLIfCfXQ43ylkZvCakQr4vQg0pY,8221 +django/contrib/postgres/fields/utils.py,sha256=TV-Aj9VpBb13I2iuziSDURttZtz355XakxXnFwvtGio,95 +django/contrib/postgres/forms/__init__.py,sha256=GSqucR50I9jrZUYZUFVmb8nV_FSlXu1BcCpFck2pVXI,118 +django/contrib/postgres/forms/array.py,sha256=3Hp4Q9JSziuaie2c0KLH-Z7RHs3t0MgbicsjnLIxV2k,7413 +django/contrib/postgres/forms/hstore.py,sha256=f7PJ41fsd8D7cvyJG-_ugslM-hXL7qnZPdx08UZQNXY,1766 +django/contrib/postgres/forms/jsonb.py,sha256=1tRmaNUvH8ITxGSAtg0bIUwPzgLW-8o1sRgsbCIV1ek,1729 +django/contrib/postgres/forms/ranges.py,sha256=Dc3runraU_Bdp8upK8RAwTo8KXsUI5oSLel8ng4ZHvk,3482 +django/contrib/postgres/jinja2/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/contrib/postgres/locale/af/LC_MESSAGES/django.mo,sha256=VaToTp7rFp8wAEJGucEHgAp1W3ThisCWYyKy7q4Rsy0,3135 +django/contrib/postgres/locale/af/LC_MESSAGES/django.po,sha256=sGAyoCHl28BJYQBolUBjdn7CeclnunrBURSciuj7ApE,3474 +django/contrib/postgres/locale/ar/LC_MESSAGES/django.mo,sha256=AFcSJOhEOAWVIXw9q7FoyyT9G1ufw530IG2GwOYNOJw,4416 +django/contrib/postgres/locale/ar/LC_MESSAGES/django.po,sha256=ZEYrujwMpePljEsEjgJrRgHvQWn6zP9zYVkan83TyuU,5017 +django/contrib/postgres/locale/az/LC_MESSAGES/django.mo,sha256=kUYiVWbIYkyUI8U1XZxTwWdW4yK0uymZLOmdxsfcxeQ,3132 +django/contrib/postgres/locale/az/LC_MESSAGES/django.po,sha256=92N_-hq2ONqo5Dgl2o2dNyAivzzHKRiQrpjTQHfGceE,3464 +django/contrib/postgres/locale/be/LC_MESSAGES/django.mo,sha256=nDK0-dYUAORaNB--uNHLQfvSnZZfe0yGdQwAe0AMFkU,4490 +django/contrib/postgres/locale/be/LC_MESSAGES/django.po,sha256=MoFwiR6pvjrN0YhFrhmAcQ4IQ6TRkFiVXf7TB8zjcQo,4964 +django/contrib/postgres/locale/bg/LC_MESSAGES/django.mo,sha256=7VaGqc8TO0NVL-eZbxVuGb8J6atQ_aC3C3Nh3G9zcJQ,3439 +django/contrib/postgres/locale/bg/LC_MESSAGES/django.po,sha256=9S2pgIZFOv3qp0QunLFUfPiNk40RZjHIiVA39Uj3zFs,4010 +django/contrib/postgres/locale/ca/LC_MESSAGES/django.mo,sha256=jX8PuYFVnEpyUEajyGbNXayTL-Tr4xGbEwtGOaUWIsY,3191 +django/contrib/postgres/locale/ca/LC_MESSAGES/django.po,sha256=TN6xBUf_xn-K2_ARNiVn612ZWrPmozJQ-LBYeaeYrH4,3651 +django/contrib/postgres/locale/cs/LC_MESSAGES/django.mo,sha256=SGSzVScCYcVeQPQYsKKLv_k9hmxt_nZGwpebGqa_e5g,3686 +django/contrib/postgres/locale/cs/LC_MESSAGES/django.po,sha256=SgmCLIHUXIUl8zkonXynj_MyHXsOmqpYGbE3N5YQ80M,4158 +django/contrib/postgres/locale/da/LC_MESSAGES/django.mo,sha256=JHKBvq-wN9YvR3GF5TWjdzRYDJCENRrdld_bfoMf_L0,3167 +django/contrib/postgres/locale/da/LC_MESSAGES/django.po,sha256=fUR3Edxifn3OeeccpxyycqgSRwOQgbLFkqEtZQBQMjo,3558 +django/contrib/postgres/locale/de/LC_MESSAGES/django.mo,sha256=78QMyqVVBH0_HdT1IEfoZbKFvIFAiG0S96dJzfx_GR4,3282 +django/contrib/postgres/locale/de/LC_MESSAGES/django.po,sha256=rICLyLxIuA_WWMcq0u6MfnUbYZlM_Vs4n-ETi55LTro,3728 +django/contrib/postgres/locale/dsb/LC_MESSAGES/django.mo,sha256=1fVpsCGFtvcOtjM7nkTq3mPAHeFKUt7iafEbeU126NY,3853 +django/contrib/postgres/locale/dsb/LC_MESSAGES/django.po,sha256=czUFqMMzMa6ie50w6mVekNaFLNoY4wPsyIt3zRHQ3Z0,4286 +django/contrib/postgres/locale/el/LC_MESSAGES/django.mo,sha256=PKQX9koDltdpPB_2sz_cCMj46CU6f6UKrQhkniPp5V0,3917 +django/contrib/postgres/locale/el/LC_MESSAGES/django.po,sha256=C4bWUZaxJCXkVUWlvaW4zo6C_fZAI7V1qBPOJHbZfdY,4411 +django/contrib/postgres/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/postgres/locale/en/LC_MESSAGES/django.po,sha256=V559m1IltKecaNYnowZ3e1iIFNFKeO949YVUPjOwvUw,3130 +django/contrib/postgres/locale/eo/LC_MESSAGES/django.mo,sha256=6DVCsh5l93gP7mZm3B-cX7mCR2JZmkncQhcKnTCi2qE,3155 +django/contrib/postgres/locale/eo/LC_MESSAGES/django.po,sha256=RIfsz1ohsRlBTb9QPdyI-1iKV8CU9pjrVqc4_3AhizU,3539 +django/contrib/postgres/locale/es/LC_MESSAGES/django.mo,sha256=WnSqn-4gREdsGohEhTJybt5E2Vg_mR6QMr_tt2Ek-uQ,3195 +django/contrib/postgres/locale/es/LC_MESSAGES/django.po,sha256=ijuEmSYMQX6Tl-dBW7yzVu94dm5SlQMxd7zA4NGi3U0,3762 +django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.mo,sha256=7VC-8uU5uphnQOpwhpHUxvE74RQTTsgbByg8MOB27uo,3178 +django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po,sha256=SfTGSajrsJi2t3mYQif4eN2yP5ifYQVQvKzplgPpfRk,3516 +django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.mo,sha256=wmkoFFXblYw1ufz4gcSntO79yq20mHl8hlbj4Hhmcug,2903 +django/contrib/postgres/locale/es_CO/LC_MESSAGES/django.po,sha256=Br2Lo11i-EeryGFsRmUWr_PD6_xk8kavVzdwqtR7AuU,3579 +django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo,sha256=4-c48HNLkDnIIPIBOaIhxoOf4muYRRelX0rR0dVrpAE,882 +django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.po,sha256=5HmM8uVQkt869MyzuQIk5C6czFe4MTRz5CBmgeN_V14,2496 +django/contrib/postgres/locale/et/LC_MESSAGES/django.mo,sha256=_BZuR25C1mzMVR2LTXE4u4QaP5ht7C7q8PjsnAEEQO8,3081 +django/contrib/postgres/locale/et/LC_MESSAGES/django.po,sha256=BF6hMf4uD6sFFXBJoudgimwKCj25jlzt7rjK3lg-BFA,3592 +django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo,sha256=e1i7Y8OyrDBzRTDViMBFliQxGa-wYBaBBWrr6V7MIVw,3133 +django/contrib/postgres/locale/eu/LC_MESSAGES/django.po,sha256=uLRlYrtifsM_BmHtxLUMnL-nNxJ9S3X-Py7W_6rRvqA,3544 +django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo,sha256=0E8pqNUlKTUXSY1o8A1TmMbAE49QZpa5yxqqECJbZ04,3614 +django/contrib/postgres/locale/fa/LC_MESSAGES/django.po,sha256=Zdcp_d3unZ4JnRQdcMIPQVsV9ysal7W1zu_vJsMqJx4,4083 +django/contrib/postgres/locale/fi/LC_MESSAGES/django.mo,sha256=eVu4C_rIzT2fQGNbJDEkrQb4pjF00lOPAixxqpYvbhs,3212 +django/contrib/postgres/locale/fi/LC_MESSAGES/django.po,sha256=zILj96C-jR-bjBRVVLScZngm7MRA-BtUM4j4IUMNJ48,3555 +django/contrib/postgres/locale/fr/LC_MESSAGES/django.mo,sha256=9QUsR8xzL04X48DNJXijH1h0yc7Lw9-rK73-rJKXM5s,3393 +django/contrib/postgres/locale/fr/LC_MESSAGES/django.po,sha256=6iGiT_QRTcMTg9V2pyQsrfHr4pW-GnDirS4N8KJIDAQ,3751 +django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo,sha256=0c_5bWFtIPFkBJ_CbXUt-2BIDxZbjM_tuJ-EqdKGMXc,3828 +django/contrib/postgres/locale/gd/LC_MESSAGES/django.po,sha256=ox1CJI5BZgCNIXHmZMyzXKyE49LoJ54FRCiG6AWp29s,4276 +django/contrib/postgres/locale/gl/LC_MESSAGES/django.mo,sha256=YlBrsev1RIUA4Zxbnl_ufkTANki4VM9O42Ge07u5QPc,722 +django/contrib/postgres/locale/gl/LC_MESSAGES/django.po,sha256=h4Z-Fdi9o1MG33vCWGMHqSj6dklYy653vGkq81lYeKA,2433 +django/contrib/postgres/locale/he/LC_MESSAGES/django.mo,sha256=-YQ8LqCoiqzkjfKifILLTqQVIGY1yb1VNl4or6n77cc,4017 +django/contrib/postgres/locale/he/LC_MESSAGES/django.po,sha256=bV17gzx9-OxTkrx-ElmZfb3yZc9A-Rl943nd5yYWGtY,4421 +django/contrib/postgres/locale/hr/LC_MESSAGES/django.mo,sha256=oIY9TCvkVmv-fGbGs-N2acx5VC3PNzZxWW4FRjWbTUQ,1217 +django/contrib/postgres/locale/hr/LC_MESSAGES/django.po,sha256=EnvgxKmz6qBe6cH05CAm0bO5zuXkAOYFnRF5c4LmIRo,2762 +django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo,sha256=Pmzqoa3ajEjxxw8SgGg1MBpnoZm9twhlNPSxgnvMYKQ,3767 +django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po,sha256=-ETxl8oh999zt4VzHAwN4fK7z3BS15k9qIKKOxITu6s,4194 +django/contrib/postgres/locale/hu/LC_MESSAGES/django.mo,sha256=f-PDNBR8UFtXqgLEQ-w1kAUgMwiP8MsQ_m1PosrSKts,3185 +django/contrib/postgres/locale/hu/LC_MESSAGES/django.po,sha256=SUMBKfJPRzlTPXGSkC1iKfL4DNFi_16YW3vkFCDCl5c,3644 +django/contrib/postgres/locale/hy/LC_MESSAGES/django.mo,sha256=wybr0GxcDRdCnz9qeoE7wkTtqqWYByX59bnkf60TYdA,3593 +django/contrib/postgres/locale/hy/LC_MESSAGES/django.po,sha256=9IO_50Tke30BbBpU83otWMjaySKPDL7apvwzYPEToS0,4140 +django/contrib/postgres/locale/ia/LC_MESSAGES/django.mo,sha256=dnyXX0ii0CFMrI02mZhkCzY66KTFdWXBOlXjo6gP_Ps,758 +django/contrib/postgres/locale/ia/LC_MESSAGES/django.po,sha256=jNRfADlv6JldyeezHt_3LXpudpmA-cXr73GIe3aPd6E,2475 +django/contrib/postgres/locale/id/LC_MESSAGES/django.mo,sha256=e6Ef9FtgoZl2LQmyfMrjvIV5_qpjwkkCYCvwV1dlRrI,3035 +django/contrib/postgres/locale/id/LC_MESSAGES/django.po,sha256=_ndR6AO13JntyL3beVBEwvfrKzCQB3xRCFamUUxBAPM,3553 +django/contrib/postgres/locale/is/LC_MESSAGES/django.mo,sha256=tpeJt6pALKWF4g_dN_c-rAG3hdRi4S68-XJw2l7tDQY,3212 +django/contrib/postgres/locale/is/LC_MESSAGES/django.po,sha256=F06l1CoYwMydHPiT92MjMPW9FqwhkxLgs4ZQ7y2etGI,3570 +django/contrib/postgres/locale/it/LC_MESSAGES/django.mo,sha256=_qHttDX3mqYgsavBhsSzFLxkljTBAnfjO9UybUsY9iY,3243 +django/contrib/postgres/locale/it/LC_MESSAGES/django.po,sha256=tGG27pe5w9y5ReeHOnlO1BPGmTf_VmY45t_yWuKlKmI,3855 +django/contrib/postgres/locale/ja/LC_MESSAGES/django.mo,sha256=Ffenxw4bewdZBTQqIjRri4KwWmSeUZm8M6ExvX-vT68,3349 +django/contrib/postgres/locale/ja/LC_MESSAGES/django.po,sha256=qVAKneCc7YbVv6eNeP1LptgKKVXNzFnel8Hoyak-KUg,3664 +django/contrib/postgres/locale/ka/LC_MESSAGES/django.mo,sha256=E-ol6-skFX-xPJs3jsGMZaJTuqF_Riu2DXnWa8AqmM0,731 +django/contrib/postgres/locale/ka/LC_MESSAGES/django.po,sha256=MFPEF3-kjkeqLDUMjolV4d6yj1TDnH-vh11vFgnwODA,2524 +django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo,sha256=AdGfrugnkBOmvFZRKrc2KIpKZTZ8ez_k-4vG3SyrzzU,683 +django/contrib/postgres/locale/kk/LC_MESSAGES/django.po,sha256=MmZ0UiTLs2nnVURE3DlkmXuK0IcFkan9ymWhC9CdK7c,2495 +django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo,sha256=FYGWlcUihtq8BLX2qSyOHKATm03oF47x6k5P6HeOON4,3196 +django/contrib/postgres/locale/ko/LC_MESSAGES/django.po,sha256=_6nMfnr2uOV1lqVJ3lCXmgoLoSTrhbZVfDxPkVFg2EU,3680 +django/contrib/postgres/locale/lt/LC_MESSAGES/django.mo,sha256=RjZ0I6Dut3iDur2LwMwkiCbFYScfBlHBjPXPnKGwdDc,3853 +django/contrib/postgres/locale/lt/LC_MESSAGES/django.po,sha256=xrAuourVTpfB3aRn8EN5yDkYQ4xuWjXiLQF33OOhq_k,4282 +django/contrib/postgres/locale/lv/LC_MESSAGES/django.mo,sha256=fROgwHN9x9IibDl4-PGk_N0q2ghXnaOaB2qMk2dxcN0,3382 +django/contrib/postgres/locale/lv/LC_MESSAGES/django.po,sha256=2lE-Sy4xyScfl8bPmd-LOh__LLXS6eOO0PozOydnysI,3844 +django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo,sha256=UFofPo5u8GZFQeJUXpXv9WkzN8-L3RYB4QtpWSPZucw,3717 +django/contrib/postgres/locale/mk/LC_MESSAGES/django.po,sha256=p6bHPCPH1XuUJ_62EXW3fXnaKCtAvuDLAvS3H1JcX9s,4284 +django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo,sha256=Gk1EKEHiKepj9744QwX0ArC5pNoi0yZg4E18YN5qXqY,3732 +django/contrib/postgres/locale/mn/LC_MESSAGES/django.po,sha256=NdW4WOJZnETLMGuZ_UrIMvUBO8yDkCvY4K1eWjV14d8,4198 +django/contrib/postgres/locale/nb/LC_MESSAGES/django.mo,sha256=SY_EMMXIT-WXai7ubBt7SdR05hfRoxRPxDKWhB3iiWo,3112 +django/contrib/postgres/locale/nb/LC_MESSAGES/django.po,sha256=pyDi1-0Mfk67bRvu9lGLRdluyRgmzaasR9P_-q46o8c,3486 +django/contrib/postgres/locale/ne/LC_MESSAGES/django.mo,sha256=wZ0UYJI4qUpPjLvsPCqRCuHbEKpBz9uOh6qncgXh59g,934 +django/contrib/postgres/locale/ne/LC_MESSAGES/django.po,sha256=ndvFMUw2XzBukzedzXUiPQfnnOitrOlJtz2TZgv0TX4,2590 +django/contrib/postgres/locale/nl/LC_MESSAGES/django.mo,sha256=hZvrA_fw13fv9uSLiF0kIrjFSCZr5HBU-qvPsT1KLME,3223 +django/contrib/postgres/locale/nl/LC_MESSAGES/django.po,sha256=X-OOSCDVDXCUW4ZHrEkUr5jZxb2Fr4B8ayL71W0L4uk,3730 +django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo,sha256=vNKDjQ3702FrLnS3qN68oXR0WUl0HW_CEkcWcF4Vbaw,3694 +django/contrib/postgres/locale/pl/LC_MESSAGES/django.po,sha256=15v1ZdRbnnoZ_6ncPwQJPj5SSgFCBUpnokvt_qrOrvE,4417 +django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo,sha256=ajCZcwyubfnqn-X-rhPdfidkLRBM9HdHzrPezmGmZCw,3135 +django/contrib/postgres/locale/pt/LC_MESSAGES/django.po,sha256=Oo78Px9ZXGWC0aiuc-1cJFvyT0yEjJNuge9gzWqOdF0,3580 +django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo,sha256=JxFj-dnRDEwjJuaSVJu__NkqRF30GMASZNfOZpQfC2w,3190 +django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po,sha256=fJ6nfXMCnBDGbu2TfAvqv4abcGUVbxjlULrUyuLdHOE,3905 +django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo,sha256=wIyzI-mQ_wTDpsU5QhIVek_Wf6RfUUWzRsOEu7fdtIY,3454 +django/contrib/postgres/locale/ro/LC_MESSAGES/django.po,sha256=4MyOnJbBSza7grnCQ2-_-knfs5w6oBdlMFHrS9DbYXQ,3897 +django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo,sha256=tJm0QXyOt7USDeVXRE9ZoE5EDA0Xman6JooYEO3odNQ,5119 +django/contrib/postgres/locale/ru/LC_MESSAGES/django.po,sha256=G3Fsbh2qjnPNDeufzCs7SwITCaWsHEX30ltPJSpySQ4,5831 +django/contrib/postgres/locale/sk/LC_MESSAGES/django.mo,sha256=jgpnLYmOCNlj-BH605ybhVx0rG4yXKIIUCf696DwAVU,3630 +django/contrib/postgres/locale/sk/LC_MESSAGES/django.po,sha256=kv4raaUoWuOeOuTThku1_SiKsf7nYEBDaa-R5yGtg7U,4051 +django/contrib/postgres/locale/sl/LC_MESSAGES/django.mo,sha256=BT1LywwWuDO9iENJm-pqBksEisuETBlh0r4ILn4wgx0,3524 +django/contrib/postgres/locale/sl/LC_MESSAGES/django.po,sha256=YmFNHoKR5av9ychiCloy5OXeL_v-rDzA0vYqUy84umc,3988 +django/contrib/postgres/locale/sq/LC_MESSAGES/django.mo,sha256=kee7WbANs3H4qgSme6ERtCgsgvvTusVX92bpl3nR7oQ,3192 +django/contrib/postgres/locale/sq/LC_MESSAGES/django.po,sha256=3t0SaZ4hOGga9e2vRjmluinajxJERXaEr5IDpgfUPb4,3546 +django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo,sha256=6gW7KQoByAgFBZkJcQ1jKZjqEb1F4jIOiG_MdShwkPI,4106 +django/contrib/postgres/locale/sr/LC_MESSAGES/django.po,sha256=GrxjCPa0hhfDPPf6QoSbMrKuxb_3w5IQ9KK6fOkYtRo,4497 +django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=neXGMvkPwx3Kujk8JG_X8T6r5qQkI-br5R5__UZsXzw,3098 +django/contrib/postgres/locale/sr_Latn/LC_MESSAGES/django.po,sha256=RyUcNHzNBqADVud2paoK-EPegcv_3eFRyjVaJARDpJQ,3626 +django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo,sha256=cAc33SL4bBPVT5hVW22uJyr2EKPtHwglgXQrSR6SffE,3196 +django/contrib/postgres/locale/sv/LC_MESSAGES/django.po,sha256=rIueQEIpQmN6zpZeM36wqGCAdUWP7C2PWoSTfxgZzGY,3660 +django/contrib/postgres/locale/tr/LC_MESSAGES/django.mo,sha256=2pcddOVCVFzHvw19Oa9xpEu46mjkzJTnykunyDvDYZ4,3162 +django/contrib/postgres/locale/tr/LC_MESSAGES/django.po,sha256=Hrw_xRYpMWTVqj-xpNADRenPDXlicdictu12Nx1JJvY,3509 +django/contrib/postgres/locale/uk/LC_MESSAGES/django.mo,sha256=2kT-GcG490kWS9V-NTjS3nKxxA8xm4euTo0Dhqd4Yb4,4758 +django/contrib/postgres/locale/uk/LC_MESSAGES/django.po,sha256=AdBiSfMyt10qIxfTcquptNVyKxwI9k_9ZjuskaEM5JQ,5402 +django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=8QhVzkVySV8HW0bi44DOQHmX7PrTnqOvP7xflgL3fAA,2849 +django/contrib/postgres/locale/zh_Hans/LC_MESSAGES/django.po,sha256=K9FON5cG2bxUwXM5r6735FAO4bRV-JJa28WdMQdySxs,3274 +django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=65JDiksp4dDMlCPrCbbSZ-DDEXSD3rnPKF8o-RpdptA,2864 +django/contrib/postgres/locale/zh_Hant/LC_MESSAGES/django.po,sha256=MMLZpVZw1SdxWoscLSO9k2YTO5YX2GXFhSag99zNpoI,3211 +django/contrib/postgres/templates/postgres/widgets/split_array.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/contrib/redirects/__init__.py,sha256=9vdTkDvH0443yn0qXx59j4dXPn3P-Pf9lB8AWrSp_Bk,69 +django/contrib/redirects/admin.py,sha256=P9wp8yIvDjJSfIXpWYM2ftDlVhKvte_0AM9Ky_j1JIs,314 +django/contrib/redirects/apps.py,sha256=BvTvN3IXCv7yEKqhxwCDiSCZ3695YXNttEvmONHNxC4,197 +django/contrib/redirects/middleware.py,sha256=kJfTIj8G2loRgiEJkqiYEredzt4xhNAfDaTZkk9Coyo,1926 +django/contrib/redirects/models.py,sha256=x9f9oGGbUDsn1If6zLwDpkwW3M2Anl-Zj845WA121fg,985 +django/contrib/redirects/locale/af/LC_MESSAGES/django.mo,sha256=UqXzx3fQxw4n7RGNgnp4lzLJ93DPRAgIAg6bwPs5GFY,1119 +django/contrib/redirects/locale/af/LC_MESSAGES/django.po,sha256=JvDnHyWH_-IyOTSR36hwSBmd_fXa3trpUAgEThdtDvM,1260 +django/contrib/redirects/locale/ar/LC_MESSAGES/django.mo,sha256=BX8CzqhOiPIE2dZ1J-bomSuudCMDs8MKbZ1aCzFUrXk,1342 +django/contrib/redirects/locale/ar/LC_MESSAGES/django.po,sha256=v4WQ_5jy6a_JupP7YLLxVIOB82UjIDZJ09uuFCaJCIc,1533 +django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo,sha256=a1ixBQQIdBZ7o-ADnF2r74CBtPLsuatG7txjc05_GXI,1071 +django/contrib/redirects/locale/ast/LC_MESSAGES/django.po,sha256=PguAqeIUeTMWsADOYLTxoC6AuKrCloi8HN18hbm3pZ0,1266 +django/contrib/redirects/locale/az/LC_MESSAGES/django.mo,sha256=gxyTtthfuZik5KWZbsKzhsCa27pnDA7OdBkZt2Jnxn0,1157 +django/contrib/redirects/locale/az/LC_MESSAGES/django.po,sha256=5uyUelawIxgtoK4zA5w8VkSuoJPdjSBrJRud1zm1JjU,1341 +django/contrib/redirects/locale/be/LC_MESSAGES/django.mo,sha256=JBUJpaQqNT_SW5cYMKfb3b3s-DL5MDkLapmukI3-49M,1437 +django/contrib/redirects/locale/be/LC_MESSAGES/django.po,sha256=nqxsr8UCgQUhsUnvuQCMYiX4PbCQw9q5MGKDCUi3XaI,1622 +django/contrib/redirects/locale/bg/LC_MESSAGES/django.mo,sha256=fEXrzyixSGCWaWu5XxVsjRKMlPwYkORpFtAiwNNShvM,1268 +django/contrib/redirects/locale/bg/LC_MESSAGES/django.po,sha256=_Xha-uOePDqOqOVmYgcR8auVgNT3CS-Z_V_vwyTlwfk,1493 +django/contrib/redirects/locale/bn/LC_MESSAGES/django.mo,sha256=SbQh_pgxNCogvUFud7xW9T6NTAvpaQb2jngXCtpjICM,1319 +django/contrib/redirects/locale/bn/LC_MESSAGES/django.po,sha256=LgUuiPryDLSXxo_4KMCdjM5XC3BiRfINuEk0s5PUQYQ,1511 +django/contrib/redirects/locale/br/LC_MESSAGES/django.mo,sha256=Yt8xo5B5LJ9HB8IChCkj5mljFQAAKlaW_gurtF8q8Yw,1429 +django/contrib/redirects/locale/br/LC_MESSAGES/django.po,sha256=L2qPx6mZEVUNay1yYEweKBLr_fXVURCnACfsezfP_pI,1623 +django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo,sha256=0Yak4rXHjRRXLu3oYYzvS8qxvk2v4IFvUiDPA68a5YI,1115 +django/contrib/redirects/locale/bs/LC_MESSAGES/django.po,sha256=s9Nhx3H4074hlSqo1zgQRJbozakdJTwA1aTuMSqEJWw,1316 +django/contrib/redirects/locale/ca/LC_MESSAGES/django.mo,sha256=sqFznyD9vEvzgzVCTHrzsDmv6ZJy5UCzV15pLacScjc,1137 +django/contrib/redirects/locale/ca/LC_MESSAGES/django.po,sha256=GQhL6KJW4kwv-xta5DcPUlPOMXf5hgs8emZgSUGjbmk,1366 +django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo,sha256=s7dsB2LPmW6QjaBORdOClb7-HbJdjt927l8PL0ej-9k,1156 +django/contrib/redirects/locale/cs/LC_MESSAGES/django.po,sha256=Q94mVP6Q8sBz7NyEzkiXX43hSqHA8CrIv0_u2EHdgS8,1377 +django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo,sha256=NSGoK12A7gbtuAuzQEVFPNSZMqqmhHyRvTEn9PUm9So,1132 +django/contrib/redirects/locale/cy/LC_MESSAGES/django.po,sha256=jDmC64z5exPnO9zwRkBmpa9v3DBlaeHRhqZYPoWqiIY,1360 +django/contrib/redirects/locale/da/LC_MESSAGES/django.mo,sha256=fMxR__ME05FmYKVrcs77ggfqe03Nuvx_Iz2X0Fz89JM,1114 +django/contrib/redirects/locale/da/LC_MESSAGES/django.po,sha256=dpFo8F_pITvs9VafhSfJkS57__5I7Y9HAKjBa1kPrQo,1294 +django/contrib/redirects/locale/de/LC_MESSAGES/django.mo,sha256=iPnuOSbyoQESXyU3arhhm0ESlXrP3OxOkKL9ZpHy_6Q,1136 +django/contrib/redirects/locale/de/LC_MESSAGES/django.po,sha256=_7aysk610BBjdYBuF4NgVFW_sMVLY3xBfVfHtSEFNls,1308 +django/contrib/redirects/locale/dsb/LC_MESSAGES/django.mo,sha256=wAFETbVpnUkTChU3d58C2qUdh0_klrwZ5X0yqSavBeY,1242 +django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po,sha256=b1CcYJx9s6swmeXvcI6VE2b_FU_i2_xsHyB4IyAYMoQ,1386 +django/contrib/redirects/locale/el/LC_MESSAGES/django.mo,sha256=kzCurtbtzdZsJOzqLbTtn3kjltOnBq6Nd8p8EFTllF0,1384 +django/contrib/redirects/locale/el/LC_MESSAGES/django.po,sha256=-lFhtPYSaYaS81Zh1CX9vxx0lvQDpAUsTBRNT48ne94,1611 +django/contrib/redirects/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/redirects/locale/en/LC_MESSAGES/django.po,sha256=dKYdOJRafKUDXGsaRIoLCLt2PhwziQgp9SHMEhhfrD8,1098 +django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po,sha256=CcP5GVZaImhRgohA5zy5K3rCscOlBtn81DB-V26-Wxg,958 +django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo,sha256=VscL30uJnV-eiQZITpBCy0xk_FfKdnMh4O9Hk4HGxww,1053 +django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po,sha256=loe8xIVjZ7eyteQNLPoa-QceBZdgky22dR6deK5ubmA,1246 +django/contrib/redirects/locale/eo/LC_MESSAGES/django.mo,sha256=pZo0DSbfGGTHi-jgaTGp29kJK-iplaai-WXJoOPluMA,1138 +django/contrib/redirects/locale/eo/LC_MESSAGES/django.po,sha256=3AxFPHffYw3svHe-MR3zuVGLMtkJPL_SX_vB_ztx98c,1414 +django/contrib/redirects/locale/es/LC_MESSAGES/django.mo,sha256=RfNvdDrQeIfIw9I0dpnRjs10QzAFx-h-NRqYIfHx5gQ,1143 +django/contrib/redirects/locale/es/LC_MESSAGES/django.po,sha256=FePzvVGRJi6SmLm988JAbM3PADj1Bjn_XjGa7SFykkU,1392 +django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.mo,sha256=-e7vnpqOe9kFR63URFVovUR6-7HCLK7etTOBGVfPCSE,1127 +django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po,sha256=IaqYpNmhkP2xb9kcCGy6k4S12pVHKbOQSEFVgWFMIZU,1296 +django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.mo,sha256=wcAMOiqsgz2KEpRwirRH9FNoto6vmo_hxthrQJi0IHU,1147 +django/contrib/redirects/locale/es_CO/LC_MESSAGES/django.po,sha256=n8DM14vHekZRayH0B6Pm3L5XnSo4lto4ZAdu4OhcOmc,1291 +django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo,sha256=aU__Eh-OzuEO7sRI45r-7Jnpz9QQpEKtqAZuWpfwQyQ,1136 +django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.po,sha256=KyfWRFCA5kcBpi1uVK_rosEfYFs5mzpBvTsK5rdK4j0,1331 +django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 +django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po,sha256=f4XZW8OHjRJoztMJtSDCxd2_Mfy-XK44hLtigjGSsZY,958 +django/contrib/redirects/locale/et/LC_MESSAGES/django.mo,sha256=1KWgSYZUyo6JbwlQHdCg9IRwI4-llys7MfkFRCN10C8,1122 +django/contrib/redirects/locale/et/LC_MESSAGES/django.po,sha256=j0-f8wRSbi6oM8fwRmG1LptZrgUYCyoHzNE3sGuDmoU,1346 +django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo,sha256=c0en4U_IaOUGF0Tt8lMwCm2Fmv3bAiT-D8BO9pNVFIM,1119 +django/contrib/redirects/locale/eu/LC_MESSAGES/django.po,sha256=W-tZOxWXSOzUgZSKRG_CoOf7XjxYuQEMZp0D59EZK9A,1304 +django/contrib/redirects/locale/fa/LC_MESSAGES/django.mo,sha256=WEtbdwPLTpiEZqTb6hJZMeLjL1snmGDWbzoYwa3BQnI,1241 +django/contrib/redirects/locale/fa/LC_MESSAGES/django.po,sha256=-XfgGc8mlwIWIk0NvtWZlwBrcDG3Mrj9k7FLDJMKQl4,1463 +django/contrib/redirects/locale/fi/LC_MESSAGES/django.mo,sha256=mCSVYBr0r3ieZPuORu4t1bsxHVnXg5_4cV8C59RC-vk,1158 +django/contrib/redirects/locale/fi/LC_MESSAGES/django.po,sha256=5hNG5JNitRLU1YrFwSOnyiMRTlRw4rXgyTjRImXEy-g,1368 +django/contrib/redirects/locale/fr/LC_MESSAGES/django.mo,sha256=8lXEASsnoQMclcQ8itMj93Zkitfu1IFUwWuPaZJRa8o,1141 +django/contrib/redirects/locale/fr/LC_MESSAGES/django.po,sha256=uJ9ql71ntuAmpmbs2-Rq2jXcblGuPWfXUu0twdjflIg,1326 +django/contrib/redirects/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/redirects/locale/fy/LC_MESSAGES/django.po,sha256=D7xverCbf3kTCcFM8h7EKWM5DcxZRqeOSKDB1irbKeE,948 +django/contrib/redirects/locale/ga/LC_MESSAGES/django.mo,sha256=blwOMshClFZKvOZXVvqENK_E_OkdS1ydbjQCDXcHXd4,1075 +django/contrib/redirects/locale/ga/LC_MESSAGES/django.po,sha256=76rdrG4GVbcKwgUQN4bB-B0t6hpivCA_ehf4uzGM_mY,1341 +django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo,sha256=fcIwOFja3uSj8spusyE3ECkiugkvGk9pa5DLsGSkSMQ,1252 +django/contrib/redirects/locale/gd/LC_MESSAGES/django.po,sha256=CkNt_Ra3yA9uKDy4BeK6in2lc63VSqqlK2JPQ6s4S-Q,1371 +django/contrib/redirects/locale/gl/LC_MESSAGES/django.mo,sha256=LoMrpBThJSmWzZ1wT66xGndnNCVCOq2eCEyo88qKwkA,1127 +django/contrib/redirects/locale/gl/LC_MESSAGES/django.po,sha256=d8qXhC2wI45yXtFJuMBgibzHsCkZSxAD3I6pVdpxlSU,1313 +django/contrib/redirects/locale/he/LC_MESSAGES/django.mo,sha256=cVPF03bdLcUiZt52toHoPXMqE5rEYPU0vEb5uIZwH_4,1128 +django/contrib/redirects/locale/he/LC_MESSAGES/django.po,sha256=Ycu8QAgIhJm-zN3_dlJelXKK87YQZV8Ahc5i7AUtkVk,1302 +django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo,sha256=onR8L7Kvkx6HgFLK7jT-wA_zjarBN8pyltG6BbKFIWU,1409 +django/contrib/redirects/locale/hi/LC_MESSAGES/django.po,sha256=fNv9_qwR9iS-pjWNXnrUFIqvc10lwg3bfj5lgdQOy1U,1649 +django/contrib/redirects/locale/hr/LC_MESSAGES/django.mo,sha256=7wHi6Uu0czZhI6v0ndJJ1wSkalTRfn7D5ovyw8tr4U4,1207 +django/contrib/redirects/locale/hr/LC_MESSAGES/django.po,sha256=HtxZwZ-ymmf-XID0z5s7nGYg-4gJL8i6FDGWt9i4Wns,1406 +django/contrib/redirects/locale/hsb/LC_MESSAGES/django.mo,sha256=l_NcBALI4Tsc0cM_PtEXzWWM5AQsf-OEcULlf4TZv8E,1236 +django/contrib/redirects/locale/hsb/LC_MESSAGES/django.po,sha256=xoWJStp4xkPdJHjk39BhlSC0Nh0qSSLe4dXiYa3IEBU,1380 +django/contrib/redirects/locale/hu/LC_MESSAGES/django.mo,sha256=4rxfQPYRySmOlKWO7LIGzNuYyNlP-EsuK7IRpgIkdQY,1152 +django/contrib/redirects/locale/hu/LC_MESSAGES/django.po,sha256=8OaJ7UgFJXbpxEtnLu9UuOwOjAoE9MFVEU5cXT0ThUU,1329 +django/contrib/redirects/locale/hy/LC_MESSAGES/django.mo,sha256=gT5x1TZXMNyBwfmQ-C_cOB60JGYdKIM7tVb3-J5d6nw,1261 +django/contrib/redirects/locale/hy/LC_MESSAGES/django.po,sha256=40QTpth2AVeoy9P36rMJC2C82YsBh_KYup19WL6zM6w,1359 +django/contrib/redirects/locale/ia/LC_MESSAGES/django.mo,sha256=PDB5ZQP6iH31xN6N2YmPZYjt6zzc88TRmh9_gAWH2U0,1152 +django/contrib/redirects/locale/ia/LC_MESSAGES/django.po,sha256=GXjbzY-cQz2QLx_iuqgijT7VUMcoNKL7prbP6yIbj8E,1297 +django/contrib/redirects/locale/id/LC_MESSAGES/django.mo,sha256=ef2SKKOPZ3wDl-z-kZ3q6UVAjvgIGuioHi9U3PR_knE,1098 +django/contrib/redirects/locale/id/LC_MESSAGES/django.po,sha256=5axvDDh3Yg5NzMC4Ayr0noUOr7tOgU-BJ9S8j_sv-yY,1319 +django/contrib/redirects/locale/io/LC_MESSAGES/django.mo,sha256=vz7TWRML-DFDFapbEXTByb9-pRQwoeJ0ApSdh6nOzXY,1019 +django/contrib/redirects/locale/io/LC_MESSAGES/django.po,sha256=obStuMYYSQ7x2utkGS3gekdPfnsNAwp3DcNwlwdg1sI,1228 +django/contrib/redirects/locale/is/LC_MESSAGES/django.mo,sha256=OnT5N5YqvG6Vto1GM4vK9hu_gn19_Icfj-d55Exds_E,1065 +django/contrib/redirects/locale/is/LC_MESSAGES/django.po,sha256=qsstQGFLj6Tkzfzak2UjIRh5sZQLSeD9YN6kYBLKJnc,1278 +django/contrib/redirects/locale/it/LC_MESSAGES/django.mo,sha256=nFyQf8zpMFSgbDT85GHnOxQQbuss2Dp_DlwhgLvPVAQ,1105 +django/contrib/redirects/locale/it/LC_MESSAGES/django.po,sha256=_mI90dLhi--cxkJWjtTT9_JLesqyMOPKYrfGhzwVDQs,1307 +django/contrib/redirects/locale/ja/LC_MESSAGES/django.mo,sha256=98oXXZ0raebFOFB23-p5VaAhbW46kwC9jxM8I2FAV_U,1148 +django/contrib/redirects/locale/ja/LC_MESSAGES/django.po,sha256=XJQiqtbTrwDIBQCWfYJcHuXYDh7gr0HvCTiuGXcZtIQ,1324 +django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo,sha256=0aOLKrhUX6YAIMNyt6KES9q2iFk2GupEr76WeGlJMkk,1511 +django/contrib/redirects/locale/ka/LC_MESSAGES/django.po,sha256=bK3ULAIG00Nszoz74r-W3W8CihaoijYkWlc6sUqJXrg,1720 +django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo,sha256=Ogx9NXK1Nfw4ctZfp-slIL81ziDX3f4DZ01OkVNY5Tw,699 +django/contrib/redirects/locale/kab/LC_MESSAGES/django.po,sha256=gI6aUPkXH-XzKrStDsMCMNfQKDEc-D1ffqE-Z-ItQuI,1001 +django/contrib/redirects/locale/kk/LC_MESSAGES/django.mo,sha256=KVLc6PKL1MP_Px0LmpoW2lIvgLiSzlvoJ9062F-s3Zw,1261 +django/contrib/redirects/locale/kk/LC_MESSAGES/django.po,sha256=k3TtiYJ7x50M19DCu2eLcsCroKusJ3paiC2RvZ-920A,1473 +django/contrib/redirects/locale/km/LC_MESSAGES/django.mo,sha256=tcW1s7jvTG0cagtdRNT0jSNkhX-B903LKl7bK31ZvJU,1248 +django/contrib/redirects/locale/km/LC_MESSAGES/django.po,sha256=KJ4h1umpfFLdsWZtsfXoeOl6cUPUD97U4ISWt80UZ2U,1437 +django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo,sha256=-gqNBZVFvxqOiPWUb9jH4myXufHHfdyr_yROTfpk2jU,1396 +django/contrib/redirects/locale/kn/LC_MESSAGES/django.po,sha256=qFM2v3ys7E5u-WJE7CR-2IMrDTqFjNq96OQ1syMDWoI,1588 +django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo,sha256=gXKWhQ8zEU7D1DwkUmXXaeqgXjiVuGSFVm8S7P4dNVs,1112 +django/contrib/redirects/locale/ko/LC_MESSAGES/django.po,sha256=q8A446VIdu6xIbjzmZxw4X0z3SfJL5Jffi_1C_IfKWM,1343 +django/contrib/redirects/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/redirects/locale/lb/LC_MESSAGES/django.po,sha256=Hv1CF9CC78YuVVNpklDtPJDU5-iIUeuXcljewmc9akg,946 +django/contrib/redirects/locale/lt/LC_MESSAGES/django.mo,sha256=reiFMXJnvE4XUosbKjyvUFzl4IKjlJoFK1gVJE9Tbnc,1191 +django/contrib/redirects/locale/lt/LC_MESSAGES/django.po,sha256=3D3sSO1D9XyRpiT57l-0emy7V11uKCWJYqpEzmmpUzE,1377 +django/contrib/redirects/locale/lv/LC_MESSAGES/django.mo,sha256=gH-QSWtlMTIuvz0HkCQwCUKPsaGH6ffjS8DIlJK-D38,1179 +django/contrib/redirects/locale/lv/LC_MESSAGES/django.po,sha256=EHJnRXo3G9mhYYySGHC-6pF1CRB2RHJaLGzcscYh9fY,1355 +django/contrib/redirects/locale/mk/LC_MESSAGES/django.mo,sha256=3XGgf2K60LclScPKcgw07TId6x535AW5jtGVJ9lC01A,1353 +django/contrib/redirects/locale/mk/LC_MESSAGES/django.po,sha256=Smsdpid5VByoxvnfzju_XOlp6aTPl8qshFptot3cRYM,1596 +django/contrib/redirects/locale/ml/LC_MESSAGES/django.mo,sha256=IhSkvbgX9xfE4GypOQ7W7SDM-wOOqx1xgSTW7L1JofU,1573 +django/contrib/redirects/locale/ml/LC_MESSAGES/django.po,sha256=9KpXf88GRUB5I51Rj3q9qhvhjHFINuiJ9ig0SZdYE6k,1755 +django/contrib/redirects/locale/mn/LC_MESSAGES/django.mo,sha256=14fdHC_hZrRaA0EAFzBJy8BHj4jMMX6l2e6rLLBtJ8E,1274 +django/contrib/redirects/locale/mn/LC_MESSAGES/django.po,sha256=7_QzUWf5l0P-7gM35p9UW7bOj33NabQq_zSrekUeZsY,1502 +django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/redirects/locale/mr/LC_MESSAGES/django.po,sha256=0aGKTlriCJoP-Tirl-qCl7tjjpjURhgCjRGmurHVO3c,940 +django/contrib/redirects/locale/my/LC_MESSAGES/django.mo,sha256=H5-y9A3_1yIXJzC4sSuHqhURxhOlnYEL8Nvc0IF4zUE,549 +django/contrib/redirects/locale/my/LC_MESSAGES/django.po,sha256=MZGNt0jMQA6aHA6OmjvaC_ajvRWfUfDiKkV0j3_E480,1052 +django/contrib/redirects/locale/nb/LC_MESSAGES/django.mo,sha256=flh3A8h-hu_Ed0dGUAPH7ZxF1WC9sYB2NqCPkNPfMLQ,1147 +django/contrib/redirects/locale/nb/LC_MESSAGES/django.po,sha256=9v20yzVkeilgDRfoXetQNytBShYEsgOLVctsZpzOfBI,1405 +django/contrib/redirects/locale/ne/LC_MESSAGES/django.mo,sha256=TxTnBGIi5k0PKAjADeCuOAJQV5dtzLrsFRXBXtfszWI,1420 +django/contrib/redirects/locale/ne/LC_MESSAGES/django.po,sha256=5b5R-6AlSIQrDyTtcmquoW5xrQRGZwlxZpBpZfVo5t4,1607 +django/contrib/redirects/locale/nl/LC_MESSAGES/django.mo,sha256=u-B4KXev_OLcnejazr3bYtlMLM-uDXsYzdoObi0hZzY,1105 +django/contrib/redirects/locale/nl/LC_MESSAGES/django.po,sha256=1Dygreha6L7sO8Rhk8gKUX-t6pmn92ae_nNQjOv_7RI,1384 +django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo,sha256=oiw7wSgqGUrHIdec6sIa7OlHXGME5iWA9h1UUlhl6Mw,1072 +django/contrib/redirects/locale/nn/LC_MESSAGES/django.po,sha256=pfu1XKvB-9DS_5dAbvjGzZCKAYxBEtnStJlBJxRSEXk,1267 +django/contrib/redirects/locale/os/LC_MESSAGES/django.mo,sha256=joQ-ibV9_6ctGMNPLZQLCx5fUamRQngs6_LDd_s9sMQ,1150 +django/contrib/redirects/locale/os/LC_MESSAGES/django.po,sha256=ZwFWiuGS9comy7r2kMnKuqaPOvVehVdAAuFvXM5ldxM,1358 +django/contrib/redirects/locale/pa/LC_MESSAGES/django.mo,sha256=MY-OIDNXlZth-ZRoOJ52nlUPg_51_F5k0NBIpc7GZEw,748 +django/contrib/redirects/locale/pa/LC_MESSAGES/django.po,sha256=TPDTK2ZvDyvO1ob8Qfr64QDbHVWAREfEeBO5w9jf63E,1199 +django/contrib/redirects/locale/pl/LC_MESSAGES/django.mo,sha256=DrsiZaeqMKkydQS2QyGCePj39Jh7aWR6DCMxBhZdaOU,1279 +django/contrib/redirects/locale/pl/LC_MESSAGES/django.po,sha256=0Dp53dQhxQyt_NDNuRYs2vcsQzPkbyo5RzewEY35CEc,1512 +django/contrib/redirects/locale/pt/LC_MESSAGES/django.mo,sha256=WocPaVk3fQEz_MLmGVtFBGwsThD-gNU7GDocqEbeaBA,1129 +django/contrib/redirects/locale/pt/LC_MESSAGES/django.po,sha256=ptCzoE41c9uFAbgSjb6VHSFYPEUv_51YyBdoThXN3XA,1350 +django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo,sha256=VN3i7dnTRkGwPmOfTXnQW3GNDpBpbc9gvBed2Mz0gQw,1162 +django/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po,sha256=DXFcxZ75Jz0l5uQV2skTW3y6WJVpjor7lr6vg2eADfA,1408 +django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo,sha256=HSQTOHGdyzkHlm6Ti1FBLU7Oj896At-xJJnwQF4Orgw,1222 +django/contrib/redirects/locale/ro/LC_MESSAGES/django.po,sha256=OYNV39_gWPt8ZgHDs6Bkv5_o4rveTnnlhcZLXhbwPXw,1453 +django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo,sha256=pV_IGa3dFWwIymZyWyVdmQHdJO2dpMTm0ut3W1qBz0I,1456 +django/contrib/redirects/locale/ru/LC_MESSAGES/django.po,sha256=Mz9QdfJfRwOGxvZ4VmvXgBDImvp0uHZMCg4Z6-Yvf3I,1669 +django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo,sha256=4U3JX_UnnYmBNtKseSUobgTslILeZWfn37Dg7q52svY,1160 +django/contrib/redirects/locale/sk/LC_MESSAGES/django.po,sha256=8tDwfdkGAXo4eAR66nfkIdegbyjc3-qBfrMZgrf_cF4,1376 +django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo,sha256=GAZtOFSUxsOHdXs3AzT40D-3JFWIlNDZU_Z-cMvdaHo,1173 +django/contrib/redirects/locale/sl/LC_MESSAGES/django.po,sha256=gkZTyxNh8L2gNxyLVzm-M1HTiK8KDvughTa2MK9NzWo,1351 +django/contrib/redirects/locale/sq/LC_MESSAGES/django.mo,sha256=Js-5m2a1qd32OUxH-iPrgdUGfmMMaAjAXEZHpmQxr-0,1125 +django/contrib/redirects/locale/sq/LC_MESSAGES/django.po,sha256=WpenX8X1zZ6vAM7xi0kAmEXtPX-hz-m1QS4V7UzBeBQ,1307 +django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo,sha256=98eGFHvaFIE3E9wHJZASamCveVAq3QIpbomp-v98PP0,1350 +django/contrib/redirects/locale/sr/LC_MESSAGES/django.po,sha256=oBVQHiz2S5tyx7oLxYSj_iPObbrQb_fdoh9YRXm7mno,1542 +django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=NtYbs9CByLODdJjIZl9tww4H0lYTkzlQyxQPH3zDFiI,1145 +django/contrib/redirects/locale/sr_Latn/LC_MESSAGES/django.po,sha256=QaY-2djs6TVf7eGtExSP_68ZLMlBO-rOj1HgvlIJ5Sw,1354 +django/contrib/redirects/locale/sv/LC_MESSAGES/django.mo,sha256=y1KpTjzF2FWY_x373UyaEFTTNYPT6hroB6zvA1ev010,1147 +django/contrib/redirects/locale/sv/LC_MESSAGES/django.po,sha256=7Us64PRHRyIZ8D7lY6HCef9xXnoSfwWI3YYtlNEaFSo,1362 +django/contrib/redirects/locale/sw/LC_MESSAGES/django.mo,sha256=oJnTp9CTgNsg5TSOV_aPZIUXdr6-l65hAZbaARZCO2w,1078 +django/contrib/redirects/locale/sw/LC_MESSAGES/django.po,sha256=CTVwA3O7GUQb7l1WpbmT8kOfqr7DpqnIyQt3HWJ6YTQ,1245 +django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo,sha256=AE6Py2_CV2gQKjKQAa_UgkLT9i61x3i1hegQpRGuZZM,1502 +django/contrib/redirects/locale/ta/LC_MESSAGES/django.po,sha256=ojdq8p4HnwtK0n6By2I6_xuucOpJIobJEGRMGc_TrS8,1700 +django/contrib/redirects/locale/te/LC_MESSAGES/django.mo,sha256=Gtcs4cbgrD7-bSkPKiPbM5DcjONS2fSdHhvWdbs_E1M,467 +django/contrib/redirects/locale/te/LC_MESSAGES/django.po,sha256=RT-t3TjcOLyNQQWljVrIcPWErKssh_HQMyGujloy-EI,939 +django/contrib/redirects/locale/th/LC_MESSAGES/django.mo,sha256=1l6eO0k1KjcmuRJKUS4ZdtJGhAUmUDMAMIeNwEobQqY,1331 +django/contrib/redirects/locale/th/LC_MESSAGES/django.po,sha256=DVVqpGC6zL8Hy8e6P8ZkhKbvcMJmXV5euLxmfoTCtms,1513 +django/contrib/redirects/locale/tr/LC_MESSAGES/django.mo,sha256=RiZJ_Acsxwz0d4q1JTZWPnbCpW8uiedE_X8PRJdZB0E,1124 +django/contrib/redirects/locale/tr/LC_MESSAGES/django.po,sha256=Gr6fwZ2nLkbosrikKpSgODsRf40GKXBc3RL9pOffCGM,1348 +django/contrib/redirects/locale/tt/LC_MESSAGES/django.mo,sha256=Hf1JXcCGNwedxy1nVRM_pQ0yUebC-tvOXr7P0h86JyI,1178 +django/contrib/redirects/locale/tt/LC_MESSAGES/django.po,sha256=2WCyBQtqZk-8GXgtu-x94JYSNrryy2QoMnirhiBrgV0,1376 +django/contrib/redirects/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/redirects/locale/udm/LC_MESSAGES/django.po,sha256=xsxlm4itpyLlLdPQRIHLuvTYRvruhM3Ezc9jtp3XSm4,934 +django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo,sha256=nCpHZGF8aYaw3UDrSXugypDHEIkWYHXncmyC_YHzxw0,1414 +django/contrib/redirects/locale/uk/LC_MESSAGES/django.po,sha256=-UDqtKOxcTA4C4O0QW7GnjtnXtEmwDfvfLmNQFMI1No,1700 +django/contrib/redirects/locale/ur/LC_MESSAGES/django.mo,sha256=CQkt-yxyAaTd_Aj1ZZC8s5-4fI2TRyTEZ-SYJZgpRrQ,1138 +django/contrib/redirects/locale/ur/LC_MESSAGES/django.po,sha256=CkhmN49PvYTccvlSRu8qGpcbx2C-1aY7K3Lq1VC2fuM,1330 +django/contrib/redirects/locale/uz/LC_MESSAGES/django.mo,sha256=Q5r3tSAy6M2wsn59n68a9bwAgi5oakrtqKLv4f1fSRs,592 +django/contrib/redirects/locale/uz/LC_MESSAGES/django.po,sha256=8A3YApKQjbEDhEMrI-2yR8XNNiXUScXAfDbyP7epS-0,1058 +django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo,sha256=BquXycJKh-7-D9p-rGUNnjqzs1d6S1YhEJjFW8_ARFA,1106 +django/contrib/redirects/locale/vi/LC_MESSAGES/django.po,sha256=xsCASrGZNbQk4d1mhsTZBcCpPJ0KO6Jr4Zz1wfnL67s,1301 +django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=6BYNDezC7sivl2kFYJRZf2lphYze8z4PVhdRG9XU0xY,1093 +django/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po,sha256=m0lZpC3XCfE-H9-PFK5-v9gD9zgXIn_VMqsnO36CiZw,1359 +django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=35HyQ7p6_pB1xNNbNzjNX8JhMa5HOzAmkF5YUgC70N0,1096 +django/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po,sha256=bbDd7Y0E1xAv7EmqAQI3am7VhDo3NxBgjRP8WvolS1s,1313 +django/contrib/redirects/migrations/0001_initial.py,sha256=jl-W40P9AY3VHUP69TmXS3lKVFlwGVIHJ04lEFBkgEY,1491 +django/contrib/redirects/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/__init__.py,sha256=W7kKt-gCROzrUA6UpIRAit3SHa-coN4_A4fphGikCEk,67 +django/contrib/sessions/apps.py,sha256=q_fkp7a7_1GT14XHkHgNIET0sItgfBeFT7B137_KeZM,194 +django/contrib/sessions/base_session.py,sha256=5FofwClB_ukwCsXPfJbzUvKoYaMQ78B_lWXU0fqSg1k,1490 +django/contrib/sessions/exceptions.py,sha256=epvfG9haHc8p34Ic6IqUSC-Yj06Ruh2TSm9G6HQMdno,256 +django/contrib/sessions/middleware.py,sha256=3fVSQXjKOPhVLEiLvgkpF-PxdBQO5a6EX0ugryjzSl8,3490 +django/contrib/sessions/models.py,sha256=vmROoszsXHnPHoSbFca8k-U9Z8Wg6EAHYeEK87VHHk8,1257 +django/contrib/sessions/serializers.py,sha256=clq2ENNQ3ujEuuc5gHSDvaz30kWWHelnQPY6tzUu0qs,424 +django/contrib/sessions/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sessions/backends/base.py,sha256=2jiGIB_SXYAz-1uk99FIPUf4oNgDyIWm1ZQp3FWGw88,11887 +django/contrib/sessions/backends/cache.py,sha256=-qeSz07gUidiY_xq7imMJ3SP17J_rLsIO50KxOhq_8E,2713 +django/contrib/sessions/backends/cached_db.py,sha256=c9JtGXxyJYRT7MMVrqwo0jw1v3JCpaBNXeL8d1tAfBE,2011 +django/contrib/sessions/backends/db.py,sha256=zzhv0nQ4OIFeyM2QXrIUG26l_IJosagKaGOI2NcZnz4,3770 +django/contrib/sessions/backends/file.py,sha256=rDpqOwgFsS79EGE4L3TlKBWE0e7TbdHS77wcLoQ-Jkw,7758 +django/contrib/sessions/backends/signed_cookies.py,sha256=jcBrD3gUHrdETWf6JvwDVCFe4eAiRbH8i2oMJjwpXPs,2696 +django/contrib/sessions/locale/af/LC_MESSAGES/django.mo,sha256=0DS0pgVrMN-bUimDfesgHs8Lgr0loz2c6nJdz58RxyQ,717 +django/contrib/sessions/locale/af/LC_MESSAGES/django.po,sha256=ZJRLBshQCAiTTAUycdB3MZIadLeHR5LxbSlDvSWLnEo,838 +django/contrib/sessions/locale/ar/LC_MESSAGES/django.mo,sha256=yoepqaR68PTGLx--cAOzP94Sqyl5xIYpeQ0IFWgY380,846 +django/contrib/sessions/locale/ar/LC_MESSAGES/django.po,sha256=ZgwtBYIdtnqp_8nKHXF1NVJFzQU81-3yv9b7STrQHMc,995 +django/contrib/sessions/locale/ast/LC_MESSAGES/django.mo,sha256=hz2m-PkrHby2CKfIOARj6kCzisT-Vs0syfDSTx_iVVw,702 +django/contrib/sessions/locale/ast/LC_MESSAGES/django.po,sha256=M90j1Nx6oDJ16hguUkfKYlyb5OymUeZ5xzPixWxSC7I,846 +django/contrib/sessions/locale/az/LC_MESSAGES/django.mo,sha256=_4XcYdtRasbCjRoaWGoULsXX2cEa--KdRdqbnGoaRuM,731 +django/contrib/sessions/locale/az/LC_MESSAGES/django.po,sha256=qYd7vz6A-hHQNwewzI6wEsxRVLdoc2xLGm1RPW0Hxc4,891 +django/contrib/sessions/locale/be/LC_MESSAGES/django.mo,sha256=8b7MeFDTL6VStOnVHtkb_o4Iiy0gTHoCwTUbT1vRr9Q,895 +django/contrib/sessions/locale/be/LC_MESSAGES/django.po,sha256=tHsYVn3XNTcukB0SrHUWP1iV763rrQHCimOyJHRPiek,1023 +django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo,sha256=DGp3j3E0-5bBjFCKx9c6Jcz9ZaXysd2DgVPuxROWDmU,783 +django/contrib/sessions/locale/bg/LC_MESSAGES/django.po,sha256=AEgnW2F8S85JZOh4JVJ6nLynsmHRZOBBoOluVxHosVo,942 +django/contrib/sessions/locale/bn/LC_MESSAGES/django.mo,sha256=0BdFN7ou9tmoVG00fCA-frb1Tri3iKz43W7SWal398s,762 +django/contrib/sessions/locale/bn/LC_MESSAGES/django.po,sha256=LycmTel6LXV2HGGN6qzlAfID-cVEQCNnW1Nv_hbWXJk,909 +django/contrib/sessions/locale/br/LC_MESSAGES/django.mo,sha256=6ubPQUyXX08KUssyVZBMMkTlD94mlA6wzsteAMiZ8C8,1027 +django/contrib/sessions/locale/br/LC_MESSAGES/django.po,sha256=LKxGGHOQejKpUp18rCU2FXW8D_H3WuP_P6dPlEluwcE,1201 +django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo,sha256=M7TvlJMrSUAFhp7oUSpUKejnbTuIK-19yiGBBECl9Sc,759 +django/contrib/sessions/locale/bs/LC_MESSAGES/django.po,sha256=Ur0AeRjXUsLgDJhcGiw75hRk4Qe98DzPBOocD7GFDRQ,909 +django/contrib/sessions/locale/ca/LC_MESSAGES/django.mo,sha256=tbaZ48PaihGGD9-2oTKiMFY3kbXjU59nNciCRINOBNk,738 +django/contrib/sessions/locale/ca/LC_MESSAGES/django.po,sha256=tJuJdehKuD9aXOauWOkE5idQhsVsLbeg1Usmc6N_SP0,906 +django/contrib/sessions/locale/cs/LC_MESSAGES/django.mo,sha256=4ZL8ECaHYx2PdPoQlpQ1YiNVVyQRH1TR5NblBRmmxB8,747 +django/contrib/sessions/locale/cs/LC_MESSAGES/django.po,sha256=-Y7fL3Ge6Cfiet1UZtA6xejOnpD0FPj37ruqImKxKn4,906 +django/contrib/sessions/locale/cy/LC_MESSAGES/django.mo,sha256=GeWVeV2PvgLQV8ecVUA2g3-VvdzMsedgIDUSpn8DByk,774 +django/contrib/sessions/locale/cy/LC_MESSAGES/django.po,sha256=zo18MXtkEdO1L0Q6ewFurx3lsEWTCdh0JpQJTmvw5bY,952 +django/contrib/sessions/locale/da/LC_MESSAGES/django.mo,sha256=cR9YutBJxPiisDQ-C14H2J7TiNOVmna3094Vuq0txqs,722 +django/contrib/sessions/locale/da/LC_MESSAGES/django.po,sha256=qX_Oo7niVo57bazlIYFA6bnVmPBclUUTWvZFYNLaG04,880 +django/contrib/sessions/locale/de/LC_MESSAGES/django.mo,sha256=N3kTal0YK9z7Te3zYGLbJmoSB6oWaviWDLGdPlsPa9g,721 +django/contrib/sessions/locale/de/LC_MESSAGES/django.po,sha256=0qnfDeCUQN2buKn6R0MvwhQP05XWxSu-xgvfxvnJe3k,844 +django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo,sha256=RABl3WZmY6gLh4IqmTUhoBEXygDzjp_5lLF1MU9U5fA,810 +django/contrib/sessions/locale/dsb/LC_MESSAGES/django.po,sha256=cItKs5tASYHzDxfTg0A_dgBQounpzoGyOEFn18E_W_g,934 +django/contrib/sessions/locale/el/LC_MESSAGES/django.mo,sha256=QbTbmcfgc8_4r5hFrIghDhk2XQ4f8_emKmqupMG2ah0,809 +django/contrib/sessions/locale/el/LC_MESSAGES/django.po,sha256=HeaEbpVmFhhrZt2NsZteYaYoeo8FYKZF0IoNJwtzZkc,971 +django/contrib/sessions/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/sessions/locale/en/LC_MESSAGES/django.po,sha256=afaM-IIUZtcRZduojUTS8tT0w7C4Ya9lXgReOvq_iF0,804 +django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/sessions/locale/en_AU/LC_MESSAGES/django.po,sha256=gvnvUpim1l7oImnzPXqBww-Uz0TgGjzCLaaszpdkQ10,761 +django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo,sha256=T5NQCTYkpERfP9yKbUvixT0VdBt1zGmGB8ITlkVc420,707 +django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po,sha256=1ks_VE1qpEfPcyKg0HybkTG0-DTttTHTfUPhQCR53sw,849 +django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo,sha256=eBvYQbZS_WxVV3QCSZAOyHNIljC2ZXxVc4mktUuXVjI,727 +django/contrib/sessions/locale/eo/LC_MESSAGES/django.po,sha256=Ru9xicyTgHWVHh26hO2nQNFRQmwBnYKEagsS8TZRv3E,917 +django/contrib/sessions/locale/es/LC_MESSAGES/django.mo,sha256=jbHSvHjO2OCLlBD66LefocKOEbefWbPhj-l3NugiWuc,734 +django/contrib/sessions/locale/es/LC_MESSAGES/django.po,sha256=fY5WXeONEXHeuBlH0LkvzdZ2CSgbvLZ8BJc429aIbhI,909 +django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.mo,sha256=ACc53N0nFsdhIhvuinICI6XhGhHwxMeZjA--46TAXso,735 +django/contrib/sessions/locale/es_AR/LC_MESSAGES/django.po,sha256=AnmvjeOA7EBTJ6wMOkCl8JRLVYRU8KS0egPijcKutns,879 +django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo,sha256=UP7ia0gV9W-l0Qq5AS4ZPadJtml8iuzzlS5C9guMgh8,754 +django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po,sha256=_XeiiRWvDaGjofamsRHr5up_EQvcw0w-GLLeWK27Af8,878 +django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo,sha256=MDM0K3xMvyf8ymvAurHYuacpxfG_YfJFyNnp1uuc6yY,756 +django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.po,sha256=Y7VNa16F_yyK7_XJvF36rR2XNW8aBJK4UDweufyXpxE,892 +django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 +django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po,sha256=zWjgB0AmsmhX2tjk1PgldttqY56Czz8epOVCaYWXTLU,761 +django/contrib/sessions/locale/et/LC_MESSAGES/django.mo,sha256=aL1jZWourEC7jtjsuBZHD-Gw9lpL6L1SoqjTtzguxD0,737 +django/contrib/sessions/locale/et/LC_MESSAGES/django.po,sha256=VNBYohAOs59jYWkjVMY-v2zwVy5AKrtBbFRJZLwdCFg,899 +django/contrib/sessions/locale/eu/LC_MESSAGES/django.mo,sha256=M9piOB_t-ZnfN6pX-jeY0yWh2S_5cCuo1oGiy7X65A4,728 +django/contrib/sessions/locale/eu/LC_MESSAGES/django.po,sha256=bHdSoknoH0_dy26e93tWVdO4TT7rnCPXlSLPsYAhwyw,893 +django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo,sha256=6DdJcqaYuBnhpFFHR42w-RqML0eQPFMAUEEDY0Redy8,755 +django/contrib/sessions/locale/fa/LC_MESSAGES/django.po,sha256=NgJlLPsS9FXjRzKqGgUTkNG9puYrBRf0KQK-QqXMIxQ,916 +django/contrib/sessions/locale/fi/LC_MESSAGES/django.mo,sha256=oAugvlTEvJmG8KsZw09WcfnifYY5oHnGo4lxcxqKeaY,721 +django/contrib/sessions/locale/fi/LC_MESSAGES/django.po,sha256=BVVrjbZZtLGAuZ9HK63p769CbjZFZMlS4BewSMfNMKU,889 +django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo,sha256=HQ3DEjxHQeHRYmu7SYVSDl1ZQHhamnw-mJ5vci5io1g,733 +django/contrib/sessions/locale/fr/LC_MESSAGES/django.po,sha256=hARxGdtBOzEZ_iVyzkNvcKlgyM8fOkdXTH3upj2XFYM,893 +django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/sessions/locale/fy/LC_MESSAGES/django.po,sha256=U-VEY4WbmIkmrnPK4Mv-B-pbdtDzusBCVmE8iHyvzFU,751 +django/contrib/sessions/locale/ga/LC_MESSAGES/django.mo,sha256=zTrydRCRDiUQwF4tQ3cN1-5w36i6KptagsdA5_SaGy0,747 +django/contrib/sessions/locale/ga/LC_MESSAGES/django.po,sha256=Qpk1JaUWiHSEPdgBk-O_KfvGzwlZ4IAA6c6-nsJe400,958 +django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo,sha256=Yi8blY_fUD5YTlnUD6YXZvv1qjm4QDriO6CJIUe1wIk,791 +django/contrib/sessions/locale/gd/LC_MESSAGES/django.po,sha256=fEa40AUqA5vh743Zqv0FO2WxSFXGYk4IzUR4BoaP-C4,890 +django/contrib/sessions/locale/gl/LC_MESSAGES/django.mo,sha256=uQ2ZmtUNoVCB2mSlMGSy-j4a_hu9PBfJDo796d8beFA,701 +django/contrib/sessions/locale/gl/LC_MESSAGES/django.po,sha256=FovTLHdVK15N9FI9lFFAOP4zt7GsvO0kKdocgeVDkNk,902 +django/contrib/sessions/locale/he/LC_MESSAGES/django.mo,sha256=qhgjSWfGAOgl-i7iwzSrJttx88xcj1pB0iLkEK64mJU,809 +django/contrib/sessions/locale/he/LC_MESSAGES/django.po,sha256=gtBgkC2bpVyWm8B5pjV3-9tBo0xqUsJuJz2neN79isg,969 +django/contrib/sessions/locale/hi/LC_MESSAGES/django.mo,sha256=naqxOjfAnNKy3qqnUG-4LGf9arLRJpjyWWmSj5tEfao,759 +django/contrib/sessions/locale/hi/LC_MESSAGES/django.po,sha256=WnTGvOz9YINMcUJg2BYCaHceZLKaTfsba_0AZtRNP38,951 +django/contrib/sessions/locale/hr/LC_MESSAGES/django.mo,sha256=axyJAmXmadpFxIhu8rroVD8NsGGadQemh9-_ZDo7L1U,819 +django/contrib/sessions/locale/hr/LC_MESSAGES/django.po,sha256=3G-qOYXBO-eMWWsa5LwTCW9M1oF0hlWgEz7hAK8hJqI,998 +django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo,sha256=_OXpOlCt4KU0i65Iw4LMjSsyn__E9wH20l9vDNBSEzw,805 +django/contrib/sessions/locale/hsb/LC_MESSAGES/django.po,sha256=yv3vX_UCDrdl07GQ79Mnytwgz2oTvySYOG9enzMpFJA,929 +django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo,sha256=ik40LnsWkKYEUioJB9e11EX9XZ-qWMa-S7haxGhM-iI,727 +django/contrib/sessions/locale/hu/LC_MESSAGES/django.po,sha256=1-UWEEsFxRwmshP2x4pJbitWIGZ1YMeDDxnAX-XGNxc,884 +django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo,sha256=x6VQWGdidRJFUJme-6jf1pcitktcQHQ7fhmw2UBej1Q,815 +django/contrib/sessions/locale/hy/LC_MESSAGES/django.po,sha256=eRMa3_A2Vx195mx2lvza1v-wcEcEeMrU63f0bgPPFjc,893 +django/contrib/sessions/locale/ia/LC_MESSAGES/django.mo,sha256=-o4aQPNJeqSDRSLqcKuYvJuKNBbFqDJDe3IzHgSgZeQ,744 +django/contrib/sessions/locale/ia/LC_MESSAGES/django.po,sha256=PULLDd3QOIU03kgradgQzT6IicoPhLPlUvFgRl-tGbA,869 +django/contrib/sessions/locale/id/LC_MESSAGES/django.mo,sha256=mOaIF0NGOO0-dt-nhHL-i3cfvt9-JKTbyUkFWPqDS9Y,705 +django/contrib/sessions/locale/id/LC_MESSAGES/django.po,sha256=EA6AJno3CaFOO-dEU9VQ_GEI-RAXS0v0uFqn1RJGjEs,914 +django/contrib/sessions/locale/io/LC_MESSAGES/django.mo,sha256=_rqAY6reegqmxmWc-pW8_kDaG9zflZuD-PGOVFsjRHo,683 +django/contrib/sessions/locale/io/LC_MESSAGES/django.po,sha256=tbKMxGuB6mh_m0ex9rO9KkTy6qyuRW2ERrQsGwmPiaw,840 +django/contrib/sessions/locale/is/LC_MESSAGES/django.mo,sha256=3QeMl-MCnBie9Sc_aQ1I7BrBhkbuArpoSJP95UEs4lg,706 +django/contrib/sessions/locale/is/LC_MESSAGES/django.po,sha256=LADIFJv8L5vgDJxiQUmKPSN64zzzrIKImh8wpLBEVWQ,853 +django/contrib/sessions/locale/it/LC_MESSAGES/django.mo,sha256=qTY3O-0FbbpZ5-BR5xOJWP0rlnIkBZf-oSawW_YJWlk,726 +django/contrib/sessions/locale/it/LC_MESSAGES/django.po,sha256=hEv0iTGLuUvEBk-lF-w7a9P3ifC0-eiodNtuSc7cXhg,869 +django/contrib/sessions/locale/ja/LC_MESSAGES/django.mo,sha256=hbv9FzWzXRIGRh_Kf_FLQB34xfmPU_9RQKn9u1kJqGU,757 +django/contrib/sessions/locale/ja/LC_MESSAGES/django.po,sha256=ppGx5ekOWGgDF3vzyrWsqnFUZ-sVZZhiOhvAzl_8v54,920 +django/contrib/sessions/locale/ka/LC_MESSAGES/django.mo,sha256=VZ-ysrDbea_-tMV-1xtlTeW62IAy2RWR94V3Y1iSh4U,803 +django/contrib/sessions/locale/ka/LC_MESSAGES/django.po,sha256=MDOG7BAO8Ez75CfgERCq1zA3syJbvQKpc4wBVlryfqQ,950 +django/contrib/sessions/locale/kab/LC_MESSAGES/django.mo,sha256=W_yE0NDPJrVznA2Qb89VuprJNwyxSg59ovvjkQe6mAs,743 +django/contrib/sessions/locale/kab/LC_MESSAGES/django.po,sha256=FJeEuv4P3NT_PpWHEUsQVSWXu65nYkJ6Z2AlbSKb0ZA,821 +django/contrib/sessions/locale/kk/LC_MESSAGES/django.mo,sha256=FROGz_MuIhsIU5_-EYV38cHnRZrc3-OxxkBeK0ax9Rk,810 +django/contrib/sessions/locale/kk/LC_MESSAGES/django.po,sha256=l5gu1XfvRMNhCHBl-NTGoUHWa0nRSxqSDt0zljpr7Kg,1024 +django/contrib/sessions/locale/km/LC_MESSAGES/django.mo,sha256=VOuKsIG2DEeCA5JdheuMIeJlpmAhKrI6lD4KWYqIIPk,929 +django/contrib/sessions/locale/km/LC_MESSAGES/django.po,sha256=09i6Nd_rUK7UqFpJ70LMXTR6xS0NuGETRLe0CopMVBk,1073 +django/contrib/sessions/locale/kn/LC_MESSAGES/django.mo,sha256=X5svX5_r3xZUy4OjUuo2gItc5PIOSjZOvE5IZwnM6Io,814 +django/contrib/sessions/locale/kn/LC_MESSAGES/django.po,sha256=Rq-I2veQe5l7Q7HG9pRY_mKeNcxhSRDgqphKbuNpoNc,961 +django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo,sha256=EUyVQYGtiFJg01mP30a0iOqBYHvpzHAcGTZM28Ubs5Q,700 +django/contrib/sessions/locale/ko/LC_MESSAGES/django.po,sha256=PjntvSzRz_Aekj9VFhGsP5yO6rAsxTMzwFj58JqToIU,855 +django/contrib/sessions/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/sessions/locale/lb/LC_MESSAGES/django.po,sha256=3igeAnQjDg6D7ItBkQQhyBoFJOZlBxT7NoZiExwD-Fo,749 +django/contrib/sessions/locale/lt/LC_MESSAGES/django.mo,sha256=L9w8-qxlDlCqR_2P0PZegfhok_I61n0mJ1koJxzufy4,786 +django/contrib/sessions/locale/lt/LC_MESSAGES/django.po,sha256=7e5BmXuaHHgGX5W1eC6wIH2QyMTNOg4JZjkZM0i-jTc,952 +django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo,sha256=exEzDUNwNS0GLsUkKPu_SfqBxU7T6VRA_T2schIQZ88,753 +django/contrib/sessions/locale/lv/LC_MESSAGES/django.po,sha256=fBgQEbsGg1ECVm1PFDrS2sfKs2eqmsqrSYzx9ELotNQ,909 +django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo,sha256=4oTWp8-qzUQBiqG32hNieABgT3O17q2C4iEhcFtAxLA,816 +django/contrib/sessions/locale/mk/LC_MESSAGES/django.po,sha256=afApb5YRhPXUWR8yF_TTym73u0ov7lWiwRda1-uNiLY,988 +django/contrib/sessions/locale/ml/LC_MESSAGES/django.mo,sha256=tff5TsHILSV1kAAB3bzHQZDB9fgMglZJTofzCunGBzc,854 +django/contrib/sessions/locale/ml/LC_MESSAGES/django.po,sha256=eRkeupt42kUey_9vJmlH8USshnXPZ8M7aYHq88u-5iY,1016 +django/contrib/sessions/locale/mn/LC_MESSAGES/django.mo,sha256=CcCH2ggVYrD29Q11ZMthcscBno2ePkQDbZfoYquTRPM,784 +django/contrib/sessions/locale/mn/LC_MESSAGES/django.po,sha256=nvcjbJzXiDvWFXrM5CxgOQIq8XucsZEUVdYkY8LnCRE,992 +django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/sessions/locale/mr/LC_MESSAGES/django.po,sha256=FQRdZ-qIDuvTCrwbnWfxoxNi8rywLSebcNbxGvr-hb0,743 +django/contrib/sessions/locale/my/LC_MESSAGES/django.mo,sha256=8zzzyfJYok969YuAwDUaa6YhxaSi3wcXy3HRNXDb_70,872 +django/contrib/sessions/locale/my/LC_MESSAGES/django.po,sha256=mfs0zRBI0tugyyEfXBZzZ_FMIohydq6EYPZGra678pw,997 +django/contrib/sessions/locale/nb/LC_MESSAGES/django.mo,sha256=hfJ1NCFgcAAtUvNEpaZ9b31PyidHxDGicifUWANIbM8,717 +django/contrib/sessions/locale/nb/LC_MESSAGES/django.po,sha256=yXr6oYuiu01oELdQKuztQFWz8x5C2zS5OzEfU9MHJsU,908 +django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo,sha256=slFgMrqGVtLRHdGorLGPpB09SM92_WnbnRR0rlpNlPQ,802 +django/contrib/sessions/locale/ne/LC_MESSAGES/django.po,sha256=1vyoiGnnaB8f9SFz8PGfzpw6V_NoL78DQwjjnB6fS98,978 +django/contrib/sessions/locale/nl/LC_MESSAGES/django.mo,sha256=X-ZuB8Zn9c5saUvUf8gj9R8gyrQuKUyUDVfs_0IvCY0,733 +django/contrib/sessions/locale/nl/LC_MESSAGES/django.po,sha256=smRr-QPGm6h6hdXxghggWES8b2NnL7yDQ07coUypa8g,909 +django/contrib/sessions/locale/nn/LC_MESSAGES/django.mo,sha256=042gOyJuXb51nG7gxI_rYst9QWuB3thtAeevKpDLFVQ,695 +django/contrib/sessions/locale/nn/LC_MESSAGES/django.po,sha256=j2kDL1vDsHoBX_ky6_S0tWxaqFst6v7OLqqlt6N2ECI,842 +django/contrib/sessions/locale/os/LC_MESSAGES/django.mo,sha256=xVux1Ag45Jo9HQBbkrRzcWrNjqP09nMQl16jIh0YVlo,732 +django/contrib/sessions/locale/os/LC_MESSAGES/django.po,sha256=1hG5Vsz2a2yW05_Z9cTNrBKtK9VRPZuQdx4KJ_0n98o,892 +django/contrib/sessions/locale/pa/LC_MESSAGES/django.mo,sha256=qEx4r_ONwXK1-qYD5uxxXEQPqK5I6rf38QZoUSm7UVA,771 +django/contrib/sessions/locale/pa/LC_MESSAGES/django.po,sha256=M7fmVGP8DtZGEuTV3iJhuWWqILVUTDZvUey_mrP4_fM,918 +django/contrib/sessions/locale/pl/LC_MESSAGES/django.mo,sha256=55aWzhu56-g9b84xx-zfBDIDd_pH82iLu7Nx87HcCRU,869 +django/contrib/sessions/locale/pl/LC_MESSAGES/django.po,sha256=C_MJBB-vwTZbx-t4-mzun-RxHhdOVv04b6xrWdnTv8E,1084 +django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo,sha256=dlJF7hF4GjLmQPdAJhtf-FCKX26XsOmZlChOcxxIqPk,738 +django/contrib/sessions/locale/pt/LC_MESSAGES/django.po,sha256=cOycrw3HCHjSYBadpalyrg5LdRTlqZCTyMh93GOQ8O0,896 +django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo,sha256=XHNF5D8oXIia3e3LYwxd46a2JOgDc_ykvc8yuo21fT0,757 +django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po,sha256=K_zxKaUKngWPFpvHgXOcymJEsiONSw-OrVrroRXmUUk,924 +django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo,sha256=WR9I9Gum_pq7Qg2Gzhf-zAv43OwR_uDtsbhtx4Ta5gE,776 +django/contrib/sessions/locale/ro/LC_MESSAGES/django.po,sha256=fEgVxL_0Llnjspu9EsXBf8AVL0DGdfF7NgV88G7WN1E,987 +django/contrib/sessions/locale/ru/LC_MESSAGES/django.mo,sha256=n-8vXR5spEbdfyeWOYWC_6kBbAppNoRrWYgqKFY6gJA,913 +django/contrib/sessions/locale/ru/LC_MESSAGES/django.po,sha256=sNqNGdoof6eXzFlh4YIp1O54MdDOAFDjD3GvAFsNP8k,1101 +django/contrib/sessions/locale/sk/LC_MESSAGES/django.mo,sha256=Yntm624Wt410RwuNPU1c-WwQoyrRrBs69VlKMlNUHeQ,766 +django/contrib/sessions/locale/sk/LC_MESSAGES/django.po,sha256=JIvzoKw_r4jZXWEaHvIYAZDAzrEkfpr0WM9dNfUlzBE,924 +django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo,sha256=EE6mB8BiYRyAxK6qzurRWcaYVs96FO_4rERYQdtIt3k,770 +django/contrib/sessions/locale/sl/LC_MESSAGES/django.po,sha256=KTjBWyvaNCHbpV9K6vbnavwxxXqf2DlIqVPv7MVFcO8,928 +django/contrib/sessions/locale/sq/LC_MESSAGES/django.mo,sha256=3mGqKLgno-t7B3jyQpSaIJfDVAxbfOSDr5G9OUE7fqc,724 +django/contrib/sessions/locale/sq/LC_MESSAGES/django.po,sha256=9pzp7834LQKafe5fJzC4OKsAd6XfgtEQl6K6hVLaBQM,844 +django/contrib/sessions/locale/sr/LC_MESSAGES/django.mo,sha256=ZDBOYmWIoSyDeT0nYIIFeMtW5jwpr257CbdTZlkVeRQ,855 +django/contrib/sessions/locale/sr/LC_MESSAGES/django.po,sha256=OXQOYeac0ghuzLrwaErJGr1FczuORTu2yroFX5hvRnk,1027 +django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=f3x9f9hTOsJltghjzJMdd8ueDwzxJex6zTXsU-_Hf_Y,757 +django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po,sha256=HKjo7hjSAvgrIvlI0SkgF3zxz8TtKWyBT51UGNhDwek,946 +django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo,sha256=SGbr0K_5iAMA22MfseAldMDgLSEBrI56pCtyV8tMAPc,707 +django/contrib/sessions/locale/sv/LC_MESSAGES/django.po,sha256=vraY3915wBYGeYu9Ro0-TlBeLWqGZP1fbckLv8y47Ys,853 +django/contrib/sessions/locale/sw/LC_MESSAGES/django.mo,sha256=Edhqp8yuBnrGtJqPO7jxobeXN4uU5wKSLrOsFO1F23k,743 +django/contrib/sessions/locale/sw/LC_MESSAGES/django.po,sha256=iY4rN4T-AA2FBQA7DiWWFvrclqKiDYQefqwwVw61-f8,858 +django/contrib/sessions/locale/ta/LC_MESSAGES/django.mo,sha256=qLIThhFQbJKc1_UVr7wVIm1rJfK2rO5m84BCB_oKq7s,801 +django/contrib/sessions/locale/ta/LC_MESSAGES/django.po,sha256=bYqtYf9XgP9IKKFJXh0u64JhRhDvPPUliI1J-NeRpKE,945 +django/contrib/sessions/locale/te/LC_MESSAGES/django.mo,sha256=kteZeivEckt4AmAeKgmgouMQo1qqSQrI8M42B16gMnQ,786 +django/contrib/sessions/locale/te/LC_MESSAGES/django.po,sha256=dQgiNS52RHrL6bV9CEO7Jk9lk3YUQrUBDCg_bP2OSZc,980 +django/contrib/sessions/locale/th/LC_MESSAGES/django.mo,sha256=D41vbkoYMdYPj3587p-c5yytLVi9pE5xvRZEYhZrxPs,814 +django/contrib/sessions/locale/th/LC_MESSAGES/django.po,sha256=43704TUv4ysKhL8T5MowZwlyv1JZrPyVGrpdIyb3r40,988 +django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo,sha256=H-DMP3N3AHZj1Q9aYeBOMA10nN1CIuJkUEY7QAy1b3g,726 +django/contrib/sessions/locale/tr/LC_MESSAGES/django.po,sha256=XYKo0_P5xitYehvjMzEw2MTp_Nza-cIXEECV3dA6BmY,863 +django/contrib/sessions/locale/tt/LC_MESSAGES/django.mo,sha256=Q-FGu_ljTsxXO_EWu7zCzGwoqFXkeoTzWSlvx85VLGc,806 +django/contrib/sessions/locale/tt/LC_MESSAGES/django.po,sha256=UC85dFs_1836noZTuZEzPqAjQMFfSvj7oGmEWOGcfCA,962 +django/contrib/sessions/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/sessions/locale/udm/LC_MESSAGES/django.po,sha256=CPml2Fn9Ax_qO5brCFDLPBoTiNdvsvJb1btQ0COwUfY,737 +django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo,sha256=jzNrLuFghQMCHNRQ0ihnKMCicgear0yWiTOLnvdPszw,841 +django/contrib/sessions/locale/uk/LC_MESSAGES/django.po,sha256=GM9kNL1VoFSRfbHB5KiivIbp-nJl1aZ69wL2xszNqlM,1017 +django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo,sha256=FkGIiHegr8HR8zjVyJ9TTW1T9WYtAL5Mg77nRKnKqWk,729 +django/contrib/sessions/locale/ur/LC_MESSAGES/django.po,sha256=qR4QEBTP6CH09XFCzsPSPg2Dv0LqzbRV_I67HO2OUwk,879 +django/contrib/sessions/locale/uz/LC_MESSAGES/django.mo,sha256=asPu0RhMB_Ui1li-OTVL4qIXnM9XpjsYyx5yJldDYBY,744 +django/contrib/sessions/locale/uz/LC_MESSAGES/django.po,sha256=KsHuLgGJt-KDH0h6ND7JLP2dDJAdLVHSlau4DkkfqA8,880 +django/contrib/sessions/locale/vi/LC_MESSAGES/django.mo,sha256=KriTpT-Hgr10DMnY5Bmbd4isxmSFLmav8vg2tuL2Bb8,679 +django/contrib/sessions/locale/vi/LC_MESSAGES/django.po,sha256=M7S46Q0Q961ykz_5FCAN8SXQ54w8tp4rZeZpy6bPtXs,909 +django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=zsbhIMocgB8Yn1XEBxbIIbBh8tLifvvYNlhe5U61ch8,722 +django/contrib/sessions/locale/zh_Hans/LC_MESSAGES/django.po,sha256=tPshgXjEv6pME4N082ztamJhd5whHB2_IV_egdP-LlQ,889 +django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=WZzfpFKZ41Pu8Q9SuhGu3hXwp4eiq8Dt8vdiQfxvF9M,733 +django/contrib/sessions/locale/zh_Hant/LC_MESSAGES/django.po,sha256=6IRDQu6-PAYh6SyEIcKdhuR172lX0buY8qqsU0QXlYU,898 +django/contrib/sessions/management/commands/clearsessions.py,sha256=yDcSmK65l5H1-2hiHhDlN0zivQrxm_ihNKLKt6MmRiQ,650 +django/contrib/sessions/migrations/0001_initial.py,sha256=F7fzk2d9hDPjUwx2w-lXdZcFG1h4HyHnkfcJ6aK7C-0,955 +django/contrib/sessions/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/sitemaps/__init__.py,sha256=FI4QoFGgY4j9UVt4Z3-W4M8HDBdQHzq109y7gG2Nu5s,5764 +django/contrib/sitemaps/apps.py,sha256=ktY9PcWsmv5TOlvEdG6IL8ZBbGMtZRpO24j5g7DGilU,195 +django/contrib/sitemaps/views.py,sha256=KP-cCkD4VGFbd4ZavWK79gAkZa83APeRgTx-eouny4M,3516 +django/contrib/sitemaps/management/commands/ping_google.py,sha256=gqfCpod-Wp3nFBc8mpWhbP2QSWsWE74IJ-hlcm8_7SY,558 +django/contrib/sitemaps/templates/sitemap.xml,sha256=KTiksPVpo22dkRjjavoJtckzo-Rin7aZ_QgbC42Y8O0,479 +django/contrib/sitemaps/templates/sitemap_index.xml,sha256=VqDmRlWMx9kC6taiBoi1h9JVspV54ou3nFjE8Nfofl8,209 +django/contrib/sites/__init__.py,sha256=qIj6PsbyT_DVkvjrASve-9F8GeoCKv6sO0-jlEhRJv4,61 +django/contrib/sites/admin.py,sha256=ClzCRn4fUPWO1dNlEWEPjSDInnK87XbNRmadvjYs1go,214 +django/contrib/sites/apps.py,sha256=xRYkn8bbxOK7rSsDiLHPkxUqAN4iscVMvwKIjiwdj94,365 +django/contrib/sites/management.py,sha256=K6cgSOdN4ins_TiWjUIkGFwuibJmshTlFonqYT2QKrw,1597 +django/contrib/sites/managers.py,sha256=OJfKicEOuqcD0B7NuH4scszrknQZ-X1Nf1PL0XgWqLM,1929 +django/contrib/sites/middleware.py,sha256=qYcVHsHOg0VxQNS4saoLHkdF503nJR-D7Z01vE0SvUM,309 +django/contrib/sites/models.py,sha256=nXbWDsKuokp2-bwxnrDhw2yA221wByMOsGaTxwwX4B8,3697 +django/contrib/sites/requests.py,sha256=74RhONzbRqEGoNXLu4T7ZjAFKYvCLmY_XQWnGRz6jdw,640 +django/contrib/sites/shortcuts.py,sha256=RZr1iT8zY_z8o52PIWEBFCQL03pE28pp6708LveS240,581 +django/contrib/sites/locale/af/LC_MESSAGES/django.mo,sha256=A10bZFMs-wUetVfF5UrFwmuiKnN4ZnlrR4Rx8U4Ut1A,786 +django/contrib/sites/locale/af/LC_MESSAGES/django.po,sha256=O0-ZRvmXvV_34kONuqakuXV5OmYbQ569K1Puj3qQNac,907 +django/contrib/sites/locale/ar/LC_MESSAGES/django.mo,sha256=kLoytp2jvhWn6p1c8kNVua2sYAMnrpS4xnbluHD22Vs,947 +django/contrib/sites/locale/ar/LC_MESSAGES/django.po,sha256=HYA3pA29GktzXBP-soUEn9VP2vkZuhVIXVA8TNPCHCs,1135 +django/contrib/sites/locale/ast/LC_MESSAGES/django.mo,sha256=eEvaeiGnZFBPGzKLlRz4M9AHemgJVAb-yNpbpxRqtd0,774 +django/contrib/sites/locale/ast/LC_MESSAGES/django.po,sha256=huBohKzLpdaJRFMFXXSDhDCUOqVqyWXfxb8_lLOkUd0,915 +django/contrib/sites/locale/az/LC_MESSAGES/django.mo,sha256=CjAGI4qGoXN95q4LpCLXLKvaNB33Ocf5SfXdurFBkas,773 +django/contrib/sites/locale/az/LC_MESSAGES/django.po,sha256=E84kNPFhgHmIfYT0uzCnTPGwPkAqKzqwFvJB7pETbVo,933 +django/contrib/sites/locale/be/LC_MESSAGES/django.mo,sha256=b-0febeZF-EX53E--W-G3lkpiozt7En6yfDIJYnNrQw,1024 +django/contrib/sites/locale/be/LC_MESSAGES/django.po,sha256=W5FhVJKcmd3WHl2Lpd5NJUsc7_sE_1Pipk3CVPoGPa4,1152 +django/contrib/sites/locale/bg/LC_MESSAGES/django.mo,sha256=a2R52umIQIhnzFaFYSRhQ6nBlywE8RGMj2FUOFmyb0A,904 +django/contrib/sites/locale/bg/LC_MESSAGES/django.po,sha256=awB8RMS-qByhNB6eH2f0Oyxb3SH8waLhrZ--rokGfaI,1118 +django/contrib/sites/locale/bn/LC_MESSAGES/django.mo,sha256=cI3a9_L-OC7gtdyRNaGX7A5w0Za0M4ERnYB7rSNkuRU,925 +django/contrib/sites/locale/bn/LC_MESSAGES/django.po,sha256=8ZxYF16bgtTZSZRZFok6IJxUV02vIztoVx2qXqwO8NM,1090 +django/contrib/sites/locale/br/LC_MESSAGES/django.mo,sha256=rI_dIznbwnadZbxOPtQxZ1pGYePNwcNNXt05iiPkchU,1107 +django/contrib/sites/locale/br/LC_MESSAGES/django.po,sha256=7Ein5Xw73DNGGtdd595Bx6ixfSD-dBXZNBUU44pSLuQ,1281 +django/contrib/sites/locale/bs/LC_MESSAGES/django.mo,sha256=bDeqQNme586LnQRQdvOWaLGZssjOoECef3vMq_OCXno,692 +django/contrib/sites/locale/bs/LC_MESSAGES/django.po,sha256=xRTWInDNiLxikjwsjgW_pYjhy24zOro90-909ns9fig,923 +django/contrib/sites/locale/ca/LC_MESSAGES/django.mo,sha256=lEUuQEpgDY3bVWzRONrPzYlojRoNduT16_oYDkkbdfk,791 +django/contrib/sites/locale/ca/LC_MESSAGES/django.po,sha256=aORAoVn69iG1ynmEfnkBzBO-UZOzzbkPVOU-ZvfMtZg,996 +django/contrib/sites/locale/cs/LC_MESSAGES/django.mo,sha256=1T_5VDHXNjFLGDhvUFYEx6LNM-7jENMvSjUzcA8njeQ,815 +django/contrib/sites/locale/cs/LC_MESSAGES/django.po,sha256=UCoVCD6JhUxB2IgegTnFQqd3_yPBkZ-5HJhif4v5Awg,979 +django/contrib/sites/locale/cy/LC_MESSAGES/django.mo,sha256=70pOie0K__hkmM9oBUaQfVwHjK8Cl48E26kRQL2mtew,835 +django/contrib/sites/locale/cy/LC_MESSAGES/django.po,sha256=FAZrVc72x-4R1A-1qYOBwADoXngC_F6FO8nRjr5-Z6g,1013 +django/contrib/sites/locale/da/LC_MESSAGES/django.mo,sha256=_vLc8KTeuNCWqBAAajbYl9KSnn5tbrBC8unB0gwdsCw,794 +django/contrib/sites/locale/da/LC_MESSAGES/django.po,sha256=Po1Z6u52CFCyz9hLfK009pMbZzZgHrBse0ViX8wCYm8,957 +django/contrib/sites/locale/de/LC_MESSAGES/django.mo,sha256=5Q6X0_bDQ1ZRpkTy7UpPNzrhmQsB9Q0P1agB7koRyzs,792 +django/contrib/sites/locale/de/LC_MESSAGES/django.po,sha256=aD0wBinqtDUPvBbwtHrLEhFdoVRx1nOh17cJFuWhN3U,980 +django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo,sha256=pPpWYsYp81MTrqCsGF0QnGktZNIll70bdBwSkuVE8go,868 +django/contrib/sites/locale/dsb/LC_MESSAGES/django.po,sha256=IA3G8AKJls20gzfxnrfPzivMNpL8A0zBQBg7OyzrP6g,992 +django/contrib/sites/locale/el/LC_MESSAGES/django.mo,sha256=G9o1zLGysUePGzZRicQ2aIIrc2UXMLTQmdpbrUMfWBU,878 +django/contrib/sites/locale/el/LC_MESSAGES/django.po,sha256=RBi_D-_znYuV6LXfTlSOf1Mvuyl96fIyEoiZ-lgeyWs,1133 +django/contrib/sites/locale/en/LC_MESSAGES/django.mo,sha256=U0OV81NfbuNL9ctF-gbGUG5al1StqN-daB-F-gFBFC8,356 +django/contrib/sites/locale/en/LC_MESSAGES/django.po,sha256=tSjfrNZ_FqLHsXjm5NuTyo5-JpdlPLsPZjFqF2APhy8,817 +django/contrib/sites/locale/en_AU/LC_MESSAGES/django.mo,sha256=dTndJxA-F1IE_nMUOtf1sRr7Kq2s_8yjgKk6mkWkVu4,486 +django/contrib/sites/locale/en_AU/LC_MESSAGES/django.po,sha256=7V9dBdbfHa9aGAfs9nw6ivSxX30CqaYc1ptfplTAPJc,791 +django/contrib/sites/locale/en_GB/LC_MESSAGES/django.mo,sha256=FbSh7msJdrHsXr0EtDMuODFzSANG_HJ3iBlW8ePpqFs,639 +django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po,sha256=Ib-DIuTWlrN3kg99kLCuqWJVtt1NWaFD4UbDFK6d4KY,862 +django/contrib/sites/locale/eo/LC_MESSAGES/django.mo,sha256=N4KkH12OHxic3pp1okeBhpfDx8XxxpULk3UC219vjWU,792 +django/contrib/sites/locale/eo/LC_MESSAGES/django.po,sha256=ymXSJaFJWGBO903ObqR-ows-p4T3KyUplc_p_3r1uk8,1043 +django/contrib/sites/locale/es/LC_MESSAGES/django.mo,sha256=qLN1uoCdslxdYWgdjgSBi7szllP-mQZtHbuZnNOthsQ,804 +django/contrib/sites/locale/es/LC_MESSAGES/django.po,sha256=QClia2zY39269VSQzkQsLwwukthN6u2JBsjbLNxA1VQ,1066 +django/contrib/sites/locale/es_AR/LC_MESSAGES/django.mo,sha256=sMZ_BBcxMK440lFG-dT6ekbGMIfLDvNHGL-sV6bUycU,817 +django/contrib/sites/locale/es_AR/LC_MESSAGES/django.po,sha256=RwyNylXbyxdSXn6qRDXd99-GaEPlmr6TicHTUW0boaQ,969 +django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo,sha256=a4Xje2M26wyIx6Wlg6puHo_OXjiDEy7b0FquT9gbThA,825 +django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po,sha256=9bnRhVD099JzkheO80l65dufjuawsj9aSFgFu5A-lnM,949 +django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo,sha256=AtGta5jBL9XNBvfSpsCcnDtDhvcb89ALl4hNjSPxibM,809 +django/contrib/sites/locale/es_MX/LC_MESSAGES/django.po,sha256=TnkpQp-7swH-x9cytUJe-QJRd2n_pYMVo0ltDw9Pu8o,991 +django/contrib/sites/locale/es_VE/LC_MESSAGES/django.mo,sha256=59fZBDut-htCj38ZUoqPjhXJPjZBz-xpU9__QFr3kLs,486 +django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po,sha256=8PWXy2L1l67wDIi98Q45j7OpVITr0Lt4zwitAnB-d_o,791 +django/contrib/sites/locale/et/LC_MESSAGES/django.mo,sha256=I2E-49UQsG-F26OeAfnKlfUdA3YCkUSV8ffA-GMSkE0,788 +django/contrib/sites/locale/et/LC_MESSAGES/django.po,sha256=mEfD6EyQ15PPivb5FTlkabt3Lo_XGtomI9XzHrrh34Y,992 +django/contrib/sites/locale/eu/LC_MESSAGES/django.mo,sha256=1HTAFI3DvTAflLJsN7NVtSd4XOTlfoeLGFyYCOX69Ec,807 +django/contrib/sites/locale/eu/LC_MESSAGES/django.po,sha256=NWxdE5-mF6Ak4nPRpCFEgAMIsVDe9YBEZl81v9kEuX8,1023 +django/contrib/sites/locale/fa/LC_MESSAGES/django.mo,sha256=odtsOpZ6noNqwDb18HDc2e6nz3NMsa-wrTN-9dk7d9w,872 +django/contrib/sites/locale/fa/LC_MESSAGES/django.po,sha256=uL2I9XjqIxqTUKf6buewtm9rwflM23pxspFMs7w4SPM,1088 +django/contrib/sites/locale/fi/LC_MESSAGES/django.mo,sha256=I5DUeLk1ChUC32q5uzriABCLLJpJKNbEK4BfqylPQzg,786 +django/contrib/sites/locale/fi/LC_MESSAGES/django.po,sha256=LH2sFIKM3YHPoz9zIu10z1DFv1svXphBdOhXNy4a17s,929 +django/contrib/sites/locale/fr/LC_MESSAGES/django.mo,sha256=lQe7mHXWDoQGSEZyK0TsPOwvnR-rjAzt8-FeLTCeXyU,797 +django/contrib/sites/locale/fr/LC_MESSAGES/django.po,sha256=u24rHDJ47AoBgcmBwI1tIescAgbjFxov6y906H_uhK0,999 +django/contrib/sites/locale/fy/LC_MESSAGES/django.mo,sha256=YQQy7wpjBORD9Isd-p0lLzYrUgAqv770_56-vXa0EOc,476 +django/contrib/sites/locale/fy/LC_MESSAGES/django.po,sha256=Yh6Lw0QI2Me0zCtlyXraFLjERKqklB6-IJLDTjH_jTs,781 +django/contrib/sites/locale/ga/LC_MESSAGES/django.mo,sha256=g5popLirHXWn6ZWJHESQaG5MmKWZL_JNI_5Vgn5FTqU,683 +django/contrib/sites/locale/ga/LC_MESSAGES/django.po,sha256=34hj3ELt7GQ7CaHL246uBDmvsVUaaN5kTrzt8j7eETM,962 +django/contrib/sites/locale/gd/LC_MESSAGES/django.mo,sha256=df4XIGGD6FIyMUXsb-SoSqNfBFAsRXf4qYtolh_C964,858 +django/contrib/sites/locale/gd/LC_MESSAGES/django.po,sha256=NPKp7A5-y-MR7r8r4WqtcVQJEHCIOP5mLTd0cIfUsug,957 +django/contrib/sites/locale/gl/LC_MESSAGES/django.mo,sha256=QUJdJV71VT-4iVQ5mUAeyszTVhD2LlmmPQv0WpPWttU,742 +django/contrib/sites/locale/gl/LC_MESSAGES/django.po,sha256=cLcejsFyoFk0fRX9fAcl9owHoxiD593QZZeZTfObBVw,940 +django/contrib/sites/locale/he/LC_MESSAGES/django.mo,sha256=L3bganfG4gHqp2WXGh4rfWmmbaIxHaGc7-ypAqjSL_E,820 +django/contrib/sites/locale/he/LC_MESSAGES/django.po,sha256=nT0Gu0iWpFV7ZJ6SAdcogZccCz3CV-R5rgqwEl5NA6c,985 +django/contrib/sites/locale/hi/LC_MESSAGES/django.mo,sha256=J4oIS1vJnCvdCCUD4tlTUVyTe4Xn0gKcWedfhH4C0t0,665 +django/contrib/sites/locale/hi/LC_MESSAGES/django.po,sha256=INBrm37jL3okBHuzX8MSN1vMptj77a-4kwQkAyt8w_8,890 +django/contrib/sites/locale/hr/LC_MESSAGES/django.mo,sha256=KjDUhEaOuYSMexcURu2UgfkatN2rrUcAbCUbcpVSInk,876 +django/contrib/sites/locale/hr/LC_MESSAGES/django.po,sha256=-nFMFkVuDoKYDFV_zdNULOqQlnqtiCG57aakN5hqlmg,1055 +django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo,sha256=RyHVb7u9aRn5BXmWzR1gApbZlOioPDJ59ufR1Oo3e8Y,863 +django/contrib/sites/locale/hsb/LC_MESSAGES/django.po,sha256=Aq54y5Gb14bIt28oDDrFltnSOk31Z2YalwaJMDMXfWc,987 +django/contrib/sites/locale/hu/LC_MESSAGES/django.mo,sha256=P--LN84U2BeZAvRVR-OiWl4R02cTTBi2o8XR2yHIwIU,796 +django/contrib/sites/locale/hu/LC_MESSAGES/django.po,sha256=b0VhyFdNaZZR5MH1vFsLL69FmICN8Dz-sTRk0PdK49E,953 +django/contrib/sites/locale/hy/LC_MESSAGES/django.mo,sha256=Hs9XwRHRkHicLWt_NvWvr7nMocmY-Kc8XphhVSAMQRc,906 +django/contrib/sites/locale/hy/LC_MESSAGES/django.po,sha256=MU4hXXGfjXKfYcjxDYzFfsEUIelz5ZzyQLkeSrUQKa0,1049 +django/contrib/sites/locale/ia/LC_MESSAGES/django.mo,sha256=gRMs-W5EiY26gqzwnDXEMbeb1vs0bYZ2DC2a9VCciew,809 +django/contrib/sites/locale/ia/LC_MESSAGES/django.po,sha256=HXZzn9ACIqfR2YoyvpK2FjZ7QuEq_RVZ1kSC4nxMgeg,934 +django/contrib/sites/locale/id/LC_MESSAGES/django.mo,sha256=__2E_2TmVUcbf1ygxtS1lHvkhv8L0mdTAtJpBsdH24Y,791 +django/contrib/sites/locale/id/LC_MESSAGES/django.po,sha256=e5teAHiMjLR8RDlg8q99qtW-K81ltcIiBIdb1MZw2sE,1000 +django/contrib/sites/locale/io/LC_MESSAGES/django.mo,sha256=W-NP0b-zR1oWUZnHZ6fPu5AC2Q6o7nUNoxssgeguUBo,760 +django/contrib/sites/locale/io/LC_MESSAGES/django.po,sha256=G4GUUz3rxoBjWTs-j5RFCvv52AEHiwrCBwom5hYeBSE,914 +django/contrib/sites/locale/is/LC_MESSAGES/django.mo,sha256=lkJgTzDjh5PNfIJpOS2DxKmwVUs9Sl5XwFHv4YdCB30,812 +django/contrib/sites/locale/is/LC_MESSAGES/django.po,sha256=1DVgAcHSZVyDd5xn483oqICIG4ooyZY8ko7A3aDogKM,976 +django/contrib/sites/locale/it/LC_MESSAGES/django.mo,sha256=6NQjjtDMudnAgnDCkemOXinzX0J-eAE5gSq1F8kjusY,795 +django/contrib/sites/locale/it/LC_MESSAGES/django.po,sha256=zxavlLMmp1t1rCDsgrw12kVgxiK5EyR_mOalSu8-ws8,984 +django/contrib/sites/locale/ja/LC_MESSAGES/django.mo,sha256=RNuCS6wv8uK5TmXkSH_7SjsbUFkf24spZfTsvfoTKro,814 +django/contrib/sites/locale/ja/LC_MESSAGES/django.po,sha256=e-cj92VOVc5ycIY6NwyFh5bO7Q9q5vp5CG4dOzd_eWQ,982 +django/contrib/sites/locale/ka/LC_MESSAGES/django.mo,sha256=m8GTqr9j0ijn0YJhvnsYwlk5oYcASKbHg_5hLqZ91TI,993 +django/contrib/sites/locale/ka/LC_MESSAGES/django.po,sha256=BCsMvNq-3Pi9-VnUvpUQaGx6pbCgI8rCcIHUA8VL4as,1155 +django/contrib/sites/locale/kab/LC_MESSAGES/django.mo,sha256=Utdj5gH5YPeaYMjeMzF-vjqYvYTCipre2qCBkEJSc-Y,808 +django/contrib/sites/locale/kab/LC_MESSAGES/django.po,sha256=d78Z-YanYZkyP5tpasj8oAa5RimVEmce6dlq5vDSscA,886 +django/contrib/sites/locale/kk/LC_MESSAGES/django.mo,sha256=T2dTZ83vBRfQb2dRaKOrhvO00BHQu_2bu0O0k7RsvGA,895 +django/contrib/sites/locale/kk/LC_MESSAGES/django.po,sha256=9ixNnoE3BxfBj4Xza0FM5qInd0uiNnAlXgDb_KaICn4,1057 +django/contrib/sites/locale/km/LC_MESSAGES/django.mo,sha256=Q7pn5E4qN957j20-iCHgrfI-p8sm3Tc8O2DWeuH0By8,701 +django/contrib/sites/locale/km/LC_MESSAGES/django.po,sha256=TOs76vlCMYOZrdHgXPWZhQH1kTBQTpzsDJ8N4kbJQ7E,926 +django/contrib/sites/locale/kn/LC_MESSAGES/django.mo,sha256=fikclDn-FKU_t9lZeBtQciisS3Kqv4tJHtu923OXLJI,676 +django/contrib/sites/locale/kn/LC_MESSAGES/django.po,sha256=p_P7L0KAUoKNLH8vuHV4_2mTWK1m1tjep5XgRqbWd2k,904 +django/contrib/sites/locale/ko/LC_MESSAGES/django.mo,sha256=wlfoWG-vmMSCipUJVVC0Y_W7QbGNNE-oEnVwl_6-AmY,807 +django/contrib/sites/locale/ko/LC_MESSAGES/django.po,sha256=TENAk9obGUxFwMnJQj_V9sZxEKJj4DyWMuGpx3Ft_pM,1049 +django/contrib/sites/locale/lb/LC_MESSAGES/django.mo,sha256=xokesKl7h7k9dXFKIJwGETgwx1Ytq6mk2erBSxkgY-o,474 +django/contrib/sites/locale/lb/LC_MESSAGES/django.po,sha256=1yRdK9Zyh7kcWG7wUexuF9-zxEaKLS2gG3ggVOHbRJ8,779 +django/contrib/sites/locale/lt/LC_MESSAGES/django.mo,sha256=bK6PJtd7DaOgDukkzuqos5ktgdjSF_ffL9IJTQY839s,869 +django/contrib/sites/locale/lt/LC_MESSAGES/django.po,sha256=9q7QfFf_IR2A1Cr_9aLVIWf-McR0LivtRC284w2_bo0,1124 +django/contrib/sites/locale/lv/LC_MESSAGES/django.mo,sha256=t9bQiVqpAmXrq8QijN4Lh0n6EGUGQjnuH7hDcu21z4c,823 +django/contrib/sites/locale/lv/LC_MESSAGES/django.po,sha256=vMaEtXGosD3AcTomiuctbOpjLes8TRBnumLe8DC4yq4,1023 +django/contrib/sites/locale/mk/LC_MESSAGES/django.mo,sha256=_YXasRJRWjYmmiEWCrAoqnrKuHHPBG_v_EYTUe16Nfo,885 +django/contrib/sites/locale/mk/LC_MESSAGES/django.po,sha256=AgdIjiSpN0P5o5rr5Ie4sFhnmS5d4doB1ffk91lmOvY,1062 +django/contrib/sites/locale/ml/LC_MESSAGES/django.mo,sha256=axNQVBY0nbR7hYa5bzNtdxB17AUOs2WXhu0Rg--FA3Q,1007 +django/contrib/sites/locale/ml/LC_MESSAGES/django.po,sha256=Sg7hHfK8OMs05ebtTv8gxS6_2kZv-OODwf7okP95Jtk,1169 +django/contrib/sites/locale/mn/LC_MESSAGES/django.mo,sha256=w2sqJRAe0wyz_IuCZ_Ocubs_VHL6wV1BcutWPz0dseQ,867 +django/contrib/sites/locale/mn/LC_MESSAGES/django.po,sha256=Zh_Eao0kLZsrQ8wkL1f-pRrsAtNJOspu45uStq5t8Mo,1127 +django/contrib/sites/locale/mr/LC_MESSAGES/django.mo,sha256=2Z5jaGJzpiJTCnhCk8ulCDeAdj-WwR99scdHFPRoHoA,468 +django/contrib/sites/locale/mr/LC_MESSAGES/django.po,sha256=pqnjF5oxvpMyjijy6JfI8qJbbbowZzE5tZF0DMYiCBs,773 +django/contrib/sites/locale/my/LC_MESSAGES/django.mo,sha256=jN59e9wRheZYx1A4t_BKc7Hx11J5LJg2wQRd21aQv08,961 +django/contrib/sites/locale/my/LC_MESSAGES/django.po,sha256=EhqYIW5-rX33YjsDsBwfiFb3BK6fZKVc3CRYeJpZX1E,1086 +django/contrib/sites/locale/nb/LC_MESSAGES/django.mo,sha256=AaiHGcmcciy5IMBPVAShcc1OQOETJvBCv7GYHMcIQMA,793 +django/contrib/sites/locale/nb/LC_MESSAGES/django.po,sha256=936zoN1sPSiiq7GuH01umrw8W6BtymYEU3bCfOQyfWE,1000 +django/contrib/sites/locale/ne/LC_MESSAGES/django.mo,sha256=wM13WrA4uMhfpU1GKFMcbVBh5LRB4v-v-t7t4AHqaU4,899 +django/contrib/sites/locale/ne/LC_MESSAGES/django.po,sha256=9_78nN66h6ioTnd0OO6YM8MHbqw8uoiaSAyn69aT8Ag,1021 +django/contrib/sites/locale/nl/LC_MESSAGES/django.mo,sha256=aIF7pcJ4uB6YqvOhN-3W-WXA645APTnk8WFIgf-ZzFw,776 +django/contrib/sites/locale/nl/LC_MESSAGES/django.po,sha256=1DCQNzMRhy4vW-KkmlPGy58UR27Np5ilmYhmjaq-8_k,1030 +django/contrib/sites/locale/nn/LC_MESSAGES/django.mo,sha256=m1SUw5bhDUemD8yMGDxcWdhbUMtzZ9WXWXtV2AHIzBs,633 +django/contrib/sites/locale/nn/LC_MESSAGES/django.po,sha256=i8BQyewiU2ymkAkj12M2MJBVbCJPp8PB8_NcQiScaD4,861 +django/contrib/sites/locale/os/LC_MESSAGES/django.mo,sha256=Su06FkWMOPzBxoung3bEju_EnyAEAXROoe33imO65uQ,806 +django/contrib/sites/locale/os/LC_MESSAGES/django.po,sha256=4i4rX6aXDUKjq64T02iStqV2V2erUsSVnTivh2XtQeY,963 +django/contrib/sites/locale/pa/LC_MESSAGES/django.mo,sha256=tOHiisOtZrTyIFoo4Ipn_XFH9hhu-ubJLMdOML5ZUgk,684 +django/contrib/sites/locale/pa/LC_MESSAGES/django.po,sha256=ztGyuqvzxRfNjqDG0rMLCu_oQ8V3Dxdsx0WZoYUyNv8,912 +django/contrib/sites/locale/pl/LC_MESSAGES/django.mo,sha256=TbH30lyyQ2QpAxc5XJKWCBNV3WUl7wOL4a-BKkeyUdM,944 +django/contrib/sites/locale/pl/LC_MESSAGES/django.po,sha256=-kQ49UvXITMy1vjJoN_emuazV_EjNDQnZDERXWNoKvw,1181 +django/contrib/sites/locale/pt/LC_MESSAGES/django.mo,sha256=PrcFQ04lFJ7mIYThXbW6acmDigEFIoLAC0PYk5hfaJs,797 +django/contrib/sites/locale/pt/LC_MESSAGES/django.po,sha256=Aj8hYI9W5nk5uxKHj1oE-b9bxmmuoeXLKaJDPfI2x2o,993 +django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo,sha256=BsFfarOR6Qk67fB-tTWgGhuOReJSgjwJBkIzZsv28vo,824 +django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po,sha256=jfvgelpWn2VQqYe2_CE39SLTsscCckvjuZo6dWII28c,1023 +django/contrib/sites/locale/ro/LC_MESSAGES/django.mo,sha256=oGsZw4_uYpaH6adMxnAuifJgHeZ_ytRZ4rFhiNfRQkQ,857 +django/contrib/sites/locale/ro/LC_MESSAGES/django.po,sha256=tWbWVbjFFELNzSXX4_5ltmzEeEJsY3pKwgEOjgV_W_8,1112 +django/contrib/sites/locale/ru/LC_MESSAGES/django.mo,sha256=bIZJWMpm2O5S6RC_2cfkrp5NXaTU2GWSsMr0wHVEmcw,1016 +django/contrib/sites/locale/ru/LC_MESSAGES/django.po,sha256=jHy5GR05ZSjLmAwaVNq3m0WdhO9GYxge3rDBziqesA8,1300 +django/contrib/sites/locale/sk/LC_MESSAGES/django.mo,sha256=-EYdm14ZjoR8bd7Rv2b5G7UJVSKmZa1ItLsdATR3-Cg,822 +django/contrib/sites/locale/sk/LC_MESSAGES/django.po,sha256=L2YRNq26DdT3OUFhw25ncZBgs232v6kSsAUTc0beIC8,1019 +django/contrib/sites/locale/sl/LC_MESSAGES/django.mo,sha256=JmkpTKJGWgnBM3CqOUriGvrDnvg2YWabIU2kbYAOM4s,845 +django/contrib/sites/locale/sl/LC_MESSAGES/django.po,sha256=qWrWrSz5r3UOVraX08ILt3TTmfyTDGKbJKbTlN9YImU,1059 +django/contrib/sites/locale/sq/LC_MESSAGES/django.mo,sha256=gVY4vWlvDvWI9mSlFfIWqHP4a_NNFt-0CFzStPRXuoQ,810 +django/contrib/sites/locale/sq/LC_MESSAGES/django.po,sha256=zg3ALcMNZErAS_xFxmtv6TmXZ0vxobX5AzCwOSRSwc8,930 +django/contrib/sites/locale/sr/LC_MESSAGES/django.mo,sha256=8kfi9IPdB2reF8C_eC2phaP6qonboHPwes_w3UgNtzw,935 +django/contrib/sites/locale/sr/LC_MESSAGES/django.po,sha256=A7xaen8H1W4uMBRAqCXT_0KQMoA2-45AUNDfGo9FydI,1107 +django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.mo,sha256=jMXiq18efq0wErJAQfJR1fCnkYcEb7OYXg8sv6kzP0s,815 +django/contrib/sites/locale/sr_Latn/LC_MESSAGES/django.po,sha256=9jkWYcZCTfQr2UZtyvhWDAmEHBrzunJUZcx7FlrFOis,1004 +django/contrib/sites/locale/sv/LC_MESSAGES/django.mo,sha256=qmhdn3N2C_DR_FYrUaFSacVjghgfb0CuWKanVRJSTq8,792 +django/contrib/sites/locale/sv/LC_MESSAGES/django.po,sha256=dDVuuuHGpZIoT6dU48aT2j4nEuGrd6zZ3FiZEs3TCeE,987 +django/contrib/sites/locale/sw/LC_MESSAGES/django.mo,sha256=cWjjDdFXBGmpUm03UDtgdDrREa2r75oMsXiEPT_Bx3g,781 +django/contrib/sites/locale/sw/LC_MESSAGES/django.po,sha256=oOKNdztQQU0sd6XmLI-n3ONmTL7jx3Q0z1YD8673Wi8,901 +django/contrib/sites/locale/ta/LC_MESSAGES/django.mo,sha256=CLO41KsSKqBrgtrHi6fmXaBk-_Y2l4KBLDJctZuZyWY,714 +django/contrib/sites/locale/ta/LC_MESSAGES/django.po,sha256=YsTITHg7ikkNcsP29tDgkZrUdtO0s9PrV1XPu4mgqCw,939 +django/contrib/sites/locale/te/LC_MESSAGES/django.mo,sha256=GmIWuVyIOcoQoAmr2HxCwBDE9JUYEktzYig93H_4v50,687 +django/contrib/sites/locale/te/LC_MESSAGES/django.po,sha256=jbncxU9H3EjXxWPsEoCKJhKi392XXTGvWyuenqLDxps,912 +django/contrib/sites/locale/th/LC_MESSAGES/django.mo,sha256=dQOp4JoP3gvfsxqEQ73L6F8FgH1YtAA9hYY-Uz5sv6Y,898 +django/contrib/sites/locale/th/LC_MESSAGES/django.po,sha256=auZBoKKKCHZbbh0PaUr9YKiWB1TEYZoj4bE7efAonV8,1077 +django/contrib/sites/locale/tr/LC_MESSAGES/django.mo,sha256=NxEKAJFmns0tWftlgyKXHJcBKBxo6ImR4SjIw8-zbgk,799 +django/contrib/sites/locale/tr/LC_MESSAGES/django.po,sha256=L9tsnwxw1BEJD-Nm3m1RAS7ekgdmyC0ETs_mr7tQw1E,1043 +django/contrib/sites/locale/tt/LC_MESSAGES/django.mo,sha256=gmmjXeEQUlBpfDmouhxE-qpEtv-iWdQSobYL5MWprZc,706 +django/contrib/sites/locale/tt/LC_MESSAGES/django.po,sha256=yj49TjwcZ4YrGqnJrKh3neKydlTgwYduto9KsmxI_eI,930 +django/contrib/sites/locale/udm/LC_MESSAGES/django.mo,sha256=CNmoKj9Uc0qEInnV5t0Nt4ZnKSZCRdIG5fyfSsqwky4,462 +django/contrib/sites/locale/udm/LC_MESSAGES/django.po,sha256=vrLZ0XJF63CO3IucbQpd12lxuoM9S8tTUv6cpu3g81c,767 +django/contrib/sites/locale/uk/LC_MESSAGES/django.mo,sha256=H4806mPqOoHJFm549F7drzsfkvAXWKmn1w_WVwQx9rk,960 +django/contrib/sites/locale/uk/LC_MESSAGES/django.po,sha256=jmJKTuGLhfP4rg8M_d86XR4X8qYB-JAtEf6jRKuzi3w,1187 +django/contrib/sites/locale/ur/LC_MESSAGES/django.mo,sha256=s6QL8AB_Mp9haXS4n1r9b0YhEUECPxUyPrHTMI3agts,654 +django/contrib/sites/locale/ur/LC_MESSAGES/django.po,sha256=R9tv3qtett8CUGackoHrc5XADeygVKAE0Fz8YzK2PZ4,885 +django/contrib/sites/locale/uz/LC_MESSAGES/django.mo,sha256=OsuqnLEDl9gUAwsmM2s1KH7VD74ID-k7JXcjGhjFlEY,799 +django/contrib/sites/locale/uz/LC_MESSAGES/django.po,sha256=RoaOwLDjkqqIJTuxpuY7eMLo42n6FoYAYutCfMaDk4I,935 +django/contrib/sites/locale/vi/LC_MESSAGES/django.mo,sha256=YOaKcdrN1238Zdm81jUkc2cpxjInAbdnhsSqHP_jQsI,762 +django/contrib/sites/locale/vi/LC_MESSAGES/django.po,sha256=AHcqR2p0fdscLvzbJO_a-CzMzaeRL4LOw4HB9K3noVQ,989 +django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.mo,sha256=7D9_pDY5lBRpo1kfzIQL-PNvIg-ofCm7cBHE1-JWlMk,779 +django/contrib/sites/locale/zh_Hans/LC_MESSAGES/django.po,sha256=xI_N00xhV8dWDp4fg5Mmj9ivOBBdHP79T3-JYXPyc5M,946 +django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.mo,sha256=0F6Qmh1smIXlOUNDaDwDajyyGecc1azfwh8BhXrpETo,790 +django/contrib/sites/locale/zh_Hant/LC_MESSAGES/django.po,sha256=ixbXNBNKNfrpI_B0O_zktTfo63sRFMOk1B1uIh4DGGg,1046 +django/contrib/sites/migrations/0001_initial.py,sha256=CkzQ6PgORwSokrpq6Dj6u-WCEtcuSf4Pau6UyiBpSlA,1069 +django/contrib/sites/migrations/0002_alter_domain_unique.py,sha256=HECWqP0R0hp77p_ubI5bI9DqEXIiGOTTszAr4EpgtVE,517 +django/contrib/sites/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/staticfiles/__init__.py,sha256=eGxMURIKxiv-dE7rP1hwNgUhfzUN36-Bc58jCpHgmCE,73 +django/contrib/staticfiles/apps.py,sha256=q0Tfga23RfN9gCRPhopgChqOFqbtGfkc3-VeH1CRClg,413 +django/contrib/staticfiles/checks.py,sha256=rH9A8NIYtEkA_PRYXQJxndm243O6Mz6GwyqWSUe3f24,391 +django/contrib/staticfiles/finders.py,sha256=fQeOtH6BnJGTvwtknbC8dJHLWuj5IQMP3Wriyp_1C5E,10451 +django/contrib/staticfiles/handlers.py,sha256=6Cmy7KVA7ngivB40ptamR02vGfP-Re6Kxles-8ylWFQ,2299 +django/contrib/staticfiles/storage.py,sha256=L3XSTnfVsJpwXmw_XRaK6OgFN1P6vTLX9PzvNuN9QCo,19391 +django/contrib/staticfiles/testing.py,sha256=4X-EtOfXnwkJAyFT8qe4H4sbVTKgM65klLUtY81KHiE,463 +django/contrib/staticfiles/urls.py,sha256=owDM_hdyPeRmxYxZisSMoplwnzWrptI_W8-3K2f7ITA,498 +django/contrib/staticfiles/utils.py,sha256=KLa19JS3KGJxwQXn6EDRhdhOU-l8nzkkaF1SiO4Lmjc,2289 +django/contrib/staticfiles/views.py,sha256=CaWZq4AHEbOGW7mg_0mbkGUP8KJTlVNnofDBNIhRUo4,1264 +django/contrib/staticfiles/management/commands/collectstatic.py,sha256=sQKml_HiU0A5PG2oHKj3m2PlXv82vHQ4l5lxg0AlKr0,15021 +django/contrib/staticfiles/management/commands/findstatic.py,sha256=R5CN75jGnvsV16MQ23eWake_EBE7NG94ExKL-54NqYQ,1539 +django/contrib/staticfiles/management/commands/runserver.py,sha256=uv-h6a8AOs0c92ILT_3Mu0UTBoCiQzThpUEmR-blj70,1318 +django/contrib/staticfiles/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/contrib/staticfiles/templatetags/staticfiles.py,sha256=7rzKqqThXO9CrLOP5kq3uzS80dzksC9cRENc86G9-Qo,720 +django/contrib/syndication/__init__.py,sha256=b5C6iIdbIOHf5wvcm1QJYsspErH3TyWJnCDYS9NjFY4,73 +django/contrib/syndication/apps.py,sha256=hXquFH_3BL6NNR2cxLU-vHlBJZ3OCjbcl8jkzCNvE64,203 +django/contrib/syndication/views.py,sha256=kXBT4kGjWBqmYVU0BFrMxMyqkdPeUjgIr-TGp5HvCS0,8617 +django/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/exceptions.py,sha256=V61tsXhjxUnLxfNVAQBUUhvSgvdDhLL3ajIS5TCGlyI,5275 +django/core/paginator.py,sha256=rBbj7G0wDTPHuLLxvWAHIvJ6lj95OacRGeRKxtyVKog,6204 +django/core/signals.py,sha256=uGRybHCJZ74by2HV-9JEWvfmnw_scuhcxaRP3UmZDjE,247 +django/core/signing.py,sha256=5ABHjzgBzFyGmomEx9R2Y83HA0zhDd0A0B2JYqsnZj4,6676 +django/core/validators.py,sha256=025VMZ2gZjyKOgrFZYiikG8iNsvw3_s1me6BsEM0U7k,18854 +django/core/wsgi.py,sha256=2sYMSe3IBrENeQT7rys-04CRmf8hW2Q2CjlkBUIyjHk,388 +django/core/cache/__init__.py,sha256=GxbLBzFT3_6rqW-E26u30__BYkqhaCh6pzhM1KykZE8,3694 +django/core/cache/utils.py,sha256=fdSTmMvnVTM7dhwf-qbHRnhLJAV1XIJe_Ut5H-EGKBw,381 +django/core/cache/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/cache/backends/base.py,sha256=vrMhKrAAo0vbSDOfsQVMX8OFfROJZFoebofntlFpPMg,10102 +django/core/cache/backends/db.py,sha256=rQAh5B7NGKMFYnrNs-P7fVPD8bbtwPSIlk-pbsowvWo,11371 +django/core/cache/backends/dummy.py,sha256=zJiIXLVJ9Tucb__RoYQFuZJeSvhpCG7NvpLJgOp8bfk,1116 +django/core/cache/backends/filebased.py,sha256=JckfmtM11yi7H5L1YxUoeltqPT8OqSComqBhmbciKDI,5667 +django/core/cache/backends/locmem.py,sha256=0nvukuE5UPuuYaGNlTh1xbtxxF9U74yc0jvcCGtaL1g,4095 +django/core/cache/backends/memcached.py,sha256=R8m-Yl5AVyLwSw9QhGWbYn_2cnTwBeXWw-hX29wsNBo,7244 +django/core/checks/__init__.py,sha256=V84NUpItdggGTGW06qO_VhQ7dxzYBPbtsrN1CzLIjB0,936 +django/core/checks/caches.py,sha256=jhyfX_m6TepTYRBa-j3qh1owD1W-3jmceu8b8dIFqVk,415 +django/core/checks/database.py,sha256=IpXyIS-TDTH4p037aG2l0qWnAVFtp8ozJEsXMvaoIu8,261 +django/core/checks/messages.py,sha256=ZbasGH7L_MeIGIwb_nYiO9Z_MXF0-aXO1ru2xFACj6Y,2161 +django/core/checks/model_checks.py,sha256=SWQkyklSxGtg-2QiEdOt5kdef6tbuQXPQnBakKMKAHI,7287 +django/core/checks/registry.py,sha256=Nzt4fNaK9PhwHiJ8h2BxQd0MWSEXCH9bfPKEQtNVHwk,3099 +django/core/checks/templates.py,sha256=9_qZn_MWX94i209MVu2uS66NPRgbKWtk_XxetKczyfU,1092 +django/core/checks/translation.py,sha256=4ShatZ9pmMIUjrkELnnuT-xRAdGK1ZG6fSdznvg-4lA,497 +django/core/checks/urls.py,sha256=lA8wbw2WDC-e4ZAr-9ooEWtGvrNyMh1G-MZbojGq9W8,3246 +django/core/checks/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/checks/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/checks/security/base.py,sha256=fEcse-Eg8W-NrLPkIhKx6DCToL46-7BeJtMrFd7Tgzw,6743 +django/core/checks/security/csrf.py,sha256=CH09reOHXQEdCMqhlejyh0IsGwDQkFeHRYO25glZTYE,1259 +django/core/checks/security/sessions.py,sha256=vvsxKEwb3qHgnCG0R5KUkfUpMHuZMfxjo9-X-2BTp-4,2558 +django/core/files/__init__.py,sha256=OjalFLvs-vPaTE3vP0eYZWyNwMj9pLJZNgG4AcGn2_Y,60 +django/core/files/base.py,sha256=jsYsE3bNpAgaQcUvTE8m1UTj6HVXkHd4bh-Y38JmF84,4812 +django/core/files/images.py,sha256=jmF29FQ1RHZ1Sio6hNjJ6FYVAiz5JQTkAyqX7qWSAFA,2569 +django/core/files/locks.py,sha256=Y5FN6iaVNeFW4HOK1Q424BPTxBpro9l-lxLsE9rUa3E,3514 +django/core/files/move.py,sha256=1R3xTJKI9Plo0xRknz-Uv2_QQRw_vmr-rUEcrTJloMA,2956 +django/core/files/storage.py,sha256=w3WTyN5CVcNwYMlHA4ib-4KBf123cfFAmPiSFcZgIWE,14592 +django/core/files/temp.py,sha256=RHPxZQx1xv5jxhstX_7-upJf6ovTtSjlPH8wcY-PjJE,2502 +django/core/files/uploadedfile.py,sha256=dzZcC1OWFMK52Wp6jzVGIo-MYbkkhSHOhRR4JZgaoQE,3890 +django/core/files/uploadhandler.py,sha256=DtlUF2T0WkDCrf6fUmmriffX_8aZLzwJvRZn7CCsvqg,6470 +django/core/files/utils.py,sha256=5Ady6JuzCYb_VAtSwc9Dr-iTmpuMIVuJ3RKck1-sYzk,1752 +django/core/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/handlers/base.py,sha256=sNM1um7hLmyJjbeAAnmk0vbEPuqIZ1vpAFUhifdc-M0,6523 +django/core/handlers/exception.py,sha256=ewEsuAuHED3sV1G4dYR7G6btKJJaGIz57FbkTRzOtYQ,4773 +django/core/handlers/wsgi.py,sha256=M7ItpAH-a5mQSmBvfAFTEWYvTS_5CsPO5zcrWcHGYZk,7745 +django/core/mail/__init__.py,sha256=LBC94qDGLULxasR97XAb0xGssr29-EbNUTDpbtnQ6iE,4484 +django/core/mail/message.py,sha256=232jQiFQq8NR8yjSNRPYO88UgnCIAZylqrl8x1oQUhY,17366 +django/core/mail/utils.py,sha256=nUQWqzPAZfqWY2J7SsYfVlihYMYz6i_A8H5D0pSkBvo,452 +django/core/mail/backends/__init__.py,sha256=VJ_9dBWKA48MXBZXVUaTy9NhgfRonapA6UAjVFEPKD8,37 +django/core/mail/backends/base.py,sha256=f9Oeaw1RAiPHmsTdQakeYzEabfOtULz0UvldP4Cydpk,1660 +django/core/mail/backends/console.py,sha256=l1XFESBbk1Ney5bUgjCYVPoSDzjobzIK3GMQyxQX1Qk,1402 +django/core/mail/backends/dummy.py,sha256=sI7tAa3MfG43UHARduttBvEAYYfiLasgF39jzaZPu9E,234 +django/core/mail/backends/filebased.py,sha256=OPRc5lDsB9Gble251fwXp0oq1qKeZM9T2JTcZwL_5js,2715 +django/core/mail/backends/locmem.py,sha256=OgTK_4QGhsBdqtDKY6bwYNKw2MXudc0PSF5GNVqS7gk,884 +django/core/mail/backends/smtp.py,sha256=B-COkTSGIj7DvfiJ4r4g5QgU8WVfEIri-5vCytRv9oE,5306 +django/core/management/__init__.py,sha256=N3eTJ4gk2S-m8Q39RlI7Te9jHeLMw3IOsPkFPbkzt7E,15857 +django/core/management/base.py,sha256=aD-29_cJv6UzeyuiTRI3YvrvzhkZExhfVHwujyiY92s,21276 +django/core/management/color.py,sha256=3m8gYaiYGpthRU2PFPkuKxZFvfk3-A8pRj4Lq7ejHTw,1817 +django/core/management/sql.py,sha256=bnxEUUIJScj6A67s0txpq4RT8sh0n-RS5ZxcNqySaAU,1921 +django/core/management/templates.py,sha256=jI9KLV8wALb_Qc4ZRk-jc3AxNr1CvEvG15FKKZTQ0uk,13468 +django/core/management/utils.py,sha256=vt925zdsFIe_ZnD06dItMjPSDFFJCix_jcjqlJuLZds,3934 +django/core/management/commands/check.py,sha256=z7K7s5QtpMKT84mbwVPH0c_qSvGgoa2bgbSaFEeoOAc,2248 +django/core/management/commands/compilemessages.py,sha256=tS8KFirmhwTdOYbcWJtU04hfwrmv1WU8BLoH3GIqQxk,5719 +django/core/management/commands/createcachetable.py,sha256=xRU5-icXi05yXI1fqDDAYQwlskgmWDBnXFWJoouZkBw,4322 +django/core/management/commands/dbshell.py,sha256=ZfbM6Wewc07gzU6kS4pq5_WSEVyE9_8QhGZkAJhrY2I,1207 +django/core/management/commands/diffsettings.py,sha256=5EnX2aERD8OpKOzvvvBAQWs3mfOwhmdBKbPF6yvImcw,3373 +django/core/management/commands/dumpdata.py,sha256=AK762M9-FPPd40-Tx5IR6esHN2GIX5cPpG-Ix5bMFjk,8479 +django/core/management/commands/flush.py,sha256=IYUA8yXZs68f8zNYeSIA_VFsVfuTBB-p-2Fgdpd1lI0,3557 +django/core/management/commands/inspectdb.py,sha256=aeuDuRiejHrx2hCyZ8SP_YH6XZpWsPuXqUhsojr3JfY,13763 +django/core/management/commands/loaddata.py,sha256=MTTGLAi5J7FfdJ2PRz9W2ra-Zr4CbOG_p57hO9_1Gxc,14542 +django/core/management/commands/makemessages.py,sha256=nt7c7nmytkuOx81UdJYrJhsb9RdiDr_fl0DuoBBbXJQ,27189 +django/core/management/commands/makemigrations.py,sha256=aH0wQnjA-HGQ6OYdltRwrJrjVKexhSubifLB2xctAaM,14587 +django/core/management/commands/migrate.py,sha256=XOESESXCkXvuqVivvJNHskgdFkPtTYS1ODc7MuJyREI,16363 +django/core/management/commands/runserver.py,sha256=vIra3zUFTYVAXb1RSJGk59HI92-XOTWHcbXv_dCT6EY,6283 +django/core/management/commands/sendtestemail.py,sha256=LsiP5Xg4AWLtc0vS0JinaaAAKjBbLUnfCq0pa0r4FFw,1456 +django/core/management/commands/shell.py,sha256=tW6wSIq_TxGreSNBEnB1ZAqKAG_i6xSnOYAymeqIOsk,4029 +django/core/management/commands/showmigrations.py,sha256=oLsN7XHkJEXwqMp7LM_mcXYY-t8Q2dSgLfpDzk1Yfpc,5428 +django/core/management/commands/sqlflush.py,sha256=mNxqSBp-fF36h3JMtEsDvYzCysxDA5R0IjhyiYyDMiI,795 +django/core/management/commands/sqlmigrate.py,sha256=R_RuBTL7Zx2MDE1qAL3yVERZq-NpLur2tNfb1mTGUJQ,2914 +django/core/management/commands/sqlsequencereset.py,sha256=hCyc6og7K4cDbVflf85lusgoQz0fWiOylo6Jtlold8U,872 +django/core/management/commands/squashmigrations.py,sha256=V5elYLfX2AW156eCupw4c54_QaluV5zv5B3AT41z4hk,9741 +django/core/management/commands/startapp.py,sha256=rvXApmLdP3gBinKaOMJtT1g3YrgVTlHteqNqFioNu8Y,503 +django/core/management/commands/startproject.py,sha256=ygP95ZEldotgEVmxDYBPUyAedNQTTwJulKLinGUxZtg,688 +django/core/management/commands/test.py,sha256=MZ8KXfCDUuq-ynHxURrHk5aJOmGg0Ue7bZw1G0v9nWg,2050 +django/core/management/commands/testserver.py,sha256=Veo-U69NUEyFuM_O9tG7GjRZ3aR2vWzcaVWahAIdS_M,2117 +django/core/serializers/__init__.py,sha256=TEJTEGHsW5vUAJWqQz7FdlD_NEGNaGlBN4zJAe21yeo,8073 +django/core/serializers/base.py,sha256=0K-a17-xJvqUM4VWVn1LmfNfXOzmzVkXyF2Bzn5ZHLs,11610 +django/core/serializers/json.py,sha256=sKfzArRjK2zNaRUxYRBbUWmoQfDUKzyKdIKu1gBeKnc,3352 +django/core/serializers/python.py,sha256=JH9PQCJC5JH7c0ERnmGSmhc1aQwtpYUTBWAIRWmYD74,6028 +django/core/serializers/pyyaml.py,sha256=qtYQyp2BXz9AffNLzPpCZBNIxkYR4myf9Oylb9fl6M4,2675 +django/core/serializers/xml_serializer.py,sha256=qZ5oDy_AV16iY7f1UgqcJ7ga8woA1lb9SVc9sr06bFU,16643 +django/core/servers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/core/servers/basehttp.py,sha256=VM29yPPrpEwFdXGWdelvxqd23CRKCLAGWBmUnu2rjCo,7735 +django/db/__init__.py,sha256=T8s-HTPRYj1ezRtUqzam8wQup01EhaQQXHQYVkAH8jY,1900 +django/db/transaction.py,sha256=xXN-GTrKG5ensCVhcPz8aZPt5YMbJ1xRHePFRz8H4UI,12100 +django/db/utils.py,sha256=2hiOB3FF-r2WnB0w0opov-WS_x75j9QGtL8iaBH3reA,9793 +django/db/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/ddl_references.py,sha256=byT3kdAxOMy7uqIh_D2CgxyABBb2aNoPKcGJfM8gOEo,6494 +django/db/backends/signals.py,sha256=rAFB5bUdnk5jckIT4PwVwEuE6aj4dbtasRHcRnIyH6Y,95 +django/db/backends/utils.py,sha256=nTaXwqJtSfSjNeZLYoDoGE0KaRQBMHRZYIDZXbbfXFg,8496 +django/db/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/base/base.py,sha256=7dv0o7s5PChROKRxAhumUit3ucPJk7PdTOGkQMpfVkk,24312 +django/db/backends/base/client.py,sha256=r6dcRhY5tPx9lzDZhbcDC1z9LDdXxRe_vtkgYQSmuEI,513 +django/db/backends/base/creation.py,sha256=6_8IIKdYuI3wI-zUtBbTHUa6pwOJyYivjV72VEiew28,11919 +django/db/backends/base/features.py,sha256=LfQUvxrjk2OMU_EhCOM95Yf7R5Uzdzhe8l06rzwRiDI,11483 +django/db/backends/base/introspection.py,sha256=x-x32jBMSGSvBnGb_9EFgKWk0STYbOis9YoF4czEm0k,7277 +django/db/backends/base/operations.py,sha256=LD948w1x22t7aACqNMIlolK3Fvagtro-QNKKH4j__XM,26004 +django/db/backends/base/schema.py,sha256=sqdafk0plBi72YWfCBCeEbYSuPGhWUaxGNLgZQcxD18,54177 +django/db/backends/base/validation.py,sha256=4zIAVsePyETiRtK7CAw78y4ZiCPISs0Pv17mFWy2Tr4,1040 +django/db/backends/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/dummy/base.py,sha256=ZsB_hKOW9tuaNbZt64fGY6tk0_FqMiF72rp8TE3NrDA,2244 +django/db/backends/dummy/features.py,sha256=Pg8_jND-aoJomTaBBXU3hJEjzpB-rLs6VwpoKkOYuQg,181 +django/db/backends/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/mysql/base.py,sha256=YqPhjaiuPX3huZxLk9oE7XxmlQRyOoUtEr_tXBBeN6E,13779 +django/db/backends/mysql/client.py,sha256=vvt1-wevYeQR4JmklrmZ_nrUrXdMaAXQOV7j42XZx4M,1834 +django/db/backends/mysql/compiler.py,sha256=J30bWgLviaWfUktegN7YnXmp6CaEZ6u8VeuiN4DUk4E,704 +django/db/backends/mysql/creation.py,sha256=pn3utQHFhPX93T8g1Z8k8_U3TDUss6fDIeUgaINtobc,3058 +django/db/backends/mysql/features.py,sha256=0XwOby_HzgbOkrBo3zha1q9iEtn9baqzkRuqrHzqWac,4548 +django/db/backends/mysql/introspection.py,sha256=rmiTkcCIw5-3tC7ajmMy82zHpkk0naQipiS1VLU9VwA,8779 +django/db/backends/mysql/operations.py,sha256=s5YtCw3dsnWFaIOAfdrl0KjIbU0bNYQcVRVb_1B3mnI,12911 +django/db/backends/mysql/schema.py,sha256=YqRlXZem9jIXilH9eKGwjfoTZ4g018UN-dDjZQ69AJU,4598 +django/db/backends/mysql/validation.py,sha256=C0MLttf0KGEU9i0N1jrXwprRgSV0uT7qL4Eu9yllpRQ,2565 +django/db/backends/oracle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/oracle/base.py,sha256=arIVWHqHwZgS1OJxWoARg67g21FLh7kVwQzJZHlOLy4,22668 +django/db/backends/oracle/client.py,sha256=JYYBOZAr814iEi2WOEOT7tcCfJclk8gMgPxzZu4SB8c,494 +django/db/backends/oracle/compiler.py,sha256=24yd7jxHln4QEcDypMi8bl2ywMIpjbxbH_mlUUBbYxE,2387 +django/db/backends/oracle/creation.py,sha256=FgNUj3kMaK5m3h_Wjcw7pEAMqxM6tt87H_dt82OgmME,19643 +django/db/backends/oracle/features.py,sha256=Y1JP0LVRmtJIbycv_W49dOizAy9_8GzAiM3wKOmCm10,2539 +django/db/backends/oracle/functions.py,sha256=PHMO9cApG1EhZPD4E0Vd6dzPmE_Dzouf9GIWbF1X7kc,768 +django/db/backends/oracle/introspection.py,sha256=U5Hoo6GFKKlCXZtR128a8SXykbZrjFs2tFyNhoT46OE,11358 +django/db/backends/oracle/operations.py,sha256=FVGoXfXHGY6eLJehcd8LX_tsyCfCKrkmsKncckeTLYY,25377 +django/db/backends/oracle/schema.py,sha256=h4pzJW5WJt3wv-A60o6_Pv8eKbWciQB-4ecBPtRfkus,7682 +django/db/backends/oracle/utils.py,sha256=mYTe-6R--xoYizlJd26O-5H_lCtfFkZ4aVXaLlsqS4Y,1489 +django/db/backends/oracle/validation.py,sha256=O1Vx5ljfyEVo9W-o4OVsu_OTfZ5V5P9HX3kNMtdE75o,860 +django/db/backends/postgresql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/postgresql/base.py,sha256=DNpNimYc1wEz-Gk0YMb0URhwCKjM8NJWkJZeEqTZ5Sg,11118 +django/db/backends/postgresql/client.py,sha256=0uzZPVsjsH28p0eBn6hWS3u2heVQfBJWzm0sQB49hZk,2383 +django/db/backends/postgresql/creation.py,sha256=a10p-xMnIVyy1y0vAFk9M6CxLqUihcdsXNTAJGdRevM,3357 +django/db/backends/postgresql/features.py,sha256=DRM_sjayMGWyUpel-LhhHUwgqdNGLj5oqJi6OiCzE-s,2940 +django/db/backends/postgresql/introspection.py,sha256=24RMKYDKu_p3jv7f0EosK9HXHUBR9o1waYWlc6dddkg,10497 +django/db/backends/postgresql/operations.py,sha256=ff8e0vG4TPNbrKU_F3yLmX3PnkQvqW7XJXw2h_SSI0I,12000 +django/db/backends/postgresql/schema.py,sha256=MG6qliMsIN2s6Z23EO2wfuNtyrgbOeQz-pNtOvctUnw,6661 +django/db/backends/postgresql/utils.py,sha256=3GXuTEoyPNqfUcXOCVnC-gw7xdAV17ZvZYb4Qu6f7Mc,176 +django/db/backends/postgresql_psycopg2/__init__.py,sha256=5v4iwk9d_ENPQMdjDfQxvPKTlOXxfaWsnaR-qgCPMcM,261 +django/db/backends/postgresql_psycopg2/base.py,sha256=g2aAztfMtAL93F8tGmO1W2YQbmr-w5sm_Obopi4JHX4,40 +django/db/backends/postgresql_psycopg2/client.py,sha256=IRCmGthBTRhO2RVGdyuxWLJowAc5H1_-1azwzrvJ-Ag,42 +django/db/backends/postgresql_psycopg2/creation.py,sha256=K2mX3uKrYKPu6snParWOUpdPE7njMl7d5F_9rWTEMy4,44 +django/db/backends/postgresql_psycopg2/features.py,sha256=5wEMe_Zj-SGxQ5AF06SH7ghMuamD_y7ddvJ9LBqZxhA,44 +django/db/backends/postgresql_psycopg2/introspection.py,sha256=uhjKJBighkTzV0JeFYJsYedni4w5I_N9LpIwDaPmOsE,49 +django/db/backends/postgresql_psycopg2/operations.py,sha256=xkIOUX-rLI6YjTKtEHYEK89whe2J1T-FKNVRBW2Jbh4,46 +django/db/backends/postgresql_psycopg2/schema.py,sha256=R-3T1eOq2-yD66L2--ICntPF2ZsLZ-Ok4TV4FGxyG5c,42 +django/db/backends/postgresql_psycopg2/utils.py,sha256=eneNs5az6_Q07x0q991G7ZABYgE-YgMg9-Xk35LT7PM,41 +django/db/backends/sqlite3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/db/backends/sqlite3/base.py,sha256=xk4drYPzVQbuNXDh_QhGC02mkWd9VWE1fNcfqOCN4O4,22958 +django/db/backends/sqlite3/client.py,sha256=wiSj2r4sCG-n3SwFKJV2mVEw9GFXiyFbHgD_Ic_DjxA,311 +django/db/backends/sqlite3/creation.py,sha256=iepxncH5Ln-OPtigZOcnbTiK9lLVsoASIOC2IWuzhAs,4224 +django/db/backends/sqlite3/features.py,sha256=L4_HFC3YKPKIzwIF9BgZo6vj28cZ697gIkiEkot-uKk,1900 +django/db/backends/sqlite3/introspection.py,sha256=LcvxQCSutdY_saEsq6338kUvFv4vwg8HowudBV-GwVc,18775 +django/db/backends/sqlite3/operations.py,sha256=D7wIvmOY31538j-9nQEAUWPrBw-nKhEcagiDmWbS_TA,13910 +django/db/backends/sqlite3/schema.py,sha256=i8F4Nawr8huJK_SQNr8lA3bwnP9rmOmgRsczsOu1_iE,19584 +django/db/migrations/__init__.py,sha256=Oa4RvfEa6hITCqdcqwXYC66YknFKyluuy7vtNbSc-L4,97 +django/db/migrations/autodetector.py,sha256=1Y6476Yy31CdguPhGf7onKHVMoQ4r23DmTEXsq9BWYA,63909 +django/db/migrations/exceptions.py,sha256=cfa6q9WVRsTmwIucNjq8W2MbvSA-CNChenY3vFie4xg,1204 +django/db/migrations/executor.py,sha256=MTwq6bjjAYLIrRGhUtYGc_wqrGfzP0iFK-H_r8g9QEI,17772 +django/db/migrations/graph.py,sha256=qho3dqkbm8QyaRebGQUBQWFv1TQ-70AS8aWtOmw3Ius,12841 +django/db/migrations/loader.py,sha256=BtIdk7Ao1Iw170AnJ5obikZxU38b-NScr8I_7n170Lw,15167 +django/db/migrations/migration.py,sha256=qK9faUXqRpPrZ8vnQ8t3beBLVHzqX5QgFyobiWNRkqI,8242 +django/db/migrations/optimizer.py,sha256=_SmLipGoJ4naKcFYPfMVbzWDV9dsMKIpU4Rz2IN74Mk,3283 +django/db/migrations/questioner.py,sha256=9wje3vaocR4jMKTLLVRwXECMD7FZSdJbh-o4--SKvA0,9918 +django/db/migrations/recorder.py,sha256=4e2dmcQRXaGhtUO0H266E3hEDwghy8r2VcaMBwUhOI8,3338 +django/db/migrations/serializer.py,sha256=Gxp6UcEhQEkukIqBO4ukq31TmM7iKJU5P0x81gQ8gSQ,12278 +django/db/migrations/state.py,sha256=Hoeuq2IAWsDG3M3ph96vmun6fzXSifuFmUV0R1GMKkM,25660 +django/db/migrations/utils.py,sha256=ApIIVhNrnnZ79yzrbPeREFsk5kxLCuOd1rwh3dDaNLI,388 +django/db/migrations/writer.py,sha256=pk1HbwGx0YKTHXmB_M3lwqJ96U4iuB_Csu4UVy_9qZQ,11322 +django/db/migrations/operations/__init__.py,sha256=48VoWNmXeVdSqnMql-wdWVGmv8BWpfFLz2pH3I5RDCY,778 +django/db/migrations/operations/base.py,sha256=EwaG6KgnhjlvIrFXlFF-WBUaQn8yXzfpW0VEnJY38AQ,5231 +django/db/migrations/operations/fields.py,sha256=y83OFWuTrFgYLxAy73zNcJY7VEXJjkJBkz5LUHEWym0,16515 +django/db/migrations/operations/models.py,sha256=eN6zvV0rSSAhYl0hnYyeV0UglhSTLQtn6s033NTMevc,34167 +django/db/migrations/operations/special.py,sha256=6vO2RRgaUPnxEjbkTX3QwAN-LaadZFHYpFHouAaMmig,7792 +django/db/migrations/operations/utils.py,sha256=E0SdwjQBJRlx_IydA47Iho7r31erLusI1n11EHxWjnw,2257 +django/db/models/__init__.py,sha256=4XCPD0FfiCtfEBQBMaGDLlxhfTgg5KChArLEU-A2lE0,2226 +django/db/models/aggregates.py,sha256=-Uy46N8EjChw8p2Apb63IhcIH6OiZMwNAnqvyUhDgek,5869 +django/db/models/base.py,sha256=bA-oDZjHUXfY-XroK86nz7QSaMRw7DGljfJX7Oqtb9I,75360 +django/db/models/constants.py,sha256=BstFLrG_rKBHL-IZ7iqXY9uSKLL6IOKOjheXBetCan0,117 +django/db/models/constraints.py,sha256=JD66ugB1U957CYcrGLxKMq73XlUTC1Yy9NaSZRTZAdY,4739 +django/db/models/deletion.py,sha256=Rf1QRcdiAjpvtbna6_iiN3-o1nPAphTorjIhvIdOK_w,14098 +django/db/models/expressions.py,sha256=LfrhbSp5Ch7Y7pKDCwxRLzN2OAFJPiIIDNugyxq2KTQ,48796 +django/db/models/indexes.py,sha256=qTsieRkqaBMfatuF6eZeHq2Pb2Z-o6gCc1xYWdwGSuw,5877 +django/db/models/lookups.py,sha256=16tOS72_G7amTT52f5zDIxnlblqruxLMJ50WqAU7YTc,19957 +django/db/models/manager.py,sha256=UCeTO9N4jXuY_BbyDxRdeDROW2y0gxSDSjZ3bb-q1mY,6767 +django/db/models/options.py,sha256=UwZwOAnLkI17eB_kYph-1h0KyDbNKXPy5TGdJVOJ-Gc,34378 +django/db/models/query.py,sha256=qLOE2GKhKqcNYuZtIf_9VN7C14Hml541L7VFq46Dc8g,79905 +django/db/models/query_utils.py,sha256=z69GrkJoMDOneYJ96q8QniJsfeRpPi6OeW5JfP8pFAA,12173 +django/db/models/signals.py,sha256=KWJCYuMFWrZPsLDPiM2TfkzC_Hq8gbEYWkvw-qXAA9w,2160 +django/db/models/utils.py,sha256=1mQ_zPVpHleO_BFdEU714a09NMvSmR65-T3P31hhMEk,852 +django/db/models/fields/__init__.py,sha256=hHi074NYTlLBBjwycOlYwamtrYAeP8vpw934gQM7fHw,84338 +django/db/models/fields/files.py,sha256=oRkgEqtvxQZa0GbgpaKJua83RKzHmNWSdkJ27oJlaU0,17776 +django/db/models/fields/mixins.py,sha256=5Ckq4d1cZODHfViLGcUyuJwvVPyV-Kfd2aZJzY4ckxc,816 +django/db/models/fields/proxy.py,sha256=fcJ2d1ZiY0sEouSq9SV7W1fm5eE3C_nMGky3Ma347dk,515 +django/db/models/fields/related.py,sha256=tnPp9R6Sp0HNc2-OiQr1EWB77DDiyhMPUg-avSxM6g4,68214 +django/db/models/fields/related_descriptors.py,sha256=FhA3z_BJKYAPjDkjO14bCzVLu9P1HwOdOVKEfIAyqcc,51000 +django/db/models/fields/related_lookups.py,sha256=-T9rIa4aOgy3Uy8Q0QkTj8Npux0E8P4ZSVAf9jsMf6I,7023 +django/db/models/fields/reverse_related.py,sha256=XZEOAsZmnqhap-q99hZCHftivqVHpHb7l_dfbJ9pGNU,10135 +django/db/models/functions/__init__.py,sha256=z1GkLKTRA2nmGhNiY4MmScBUGZAgm8q9TI4bWh7Ep1A,1910 +django/db/models/functions/comparison.py,sha256=ouR8XAAGOAsHkcUwIh6RrScNcCry8_6SR_9hO3FCLoM,4831 +django/db/models/functions/datetime.py,sha256=XcL_IdUBJW1qPImFnwThIql_J-Do-byn0wtW3AxBLDM,10947 +django/db/models/functions/math.py,sha256=iyRt0xZ1vBvJ7QtMnuOdVEGWqqQZd6IawGD7cnVH8IU,4607 +django/db/models/functions/mixins.py,sha256=LsnLHHFrIv5_hZEBN7iTQMFua_gQlG4nDORB8DnVeSw,2078 +django/db/models/functions/text.py,sha256=X5XqQYjKWJ4dvGnp8AtdfLaaXT_m1V8lEcigXTC9s_o,9039 +django/db/models/functions/window.py,sha256=yL07Blhu1WudxHMbIfRA2bBIXuwZec8wLPbW6N5eOyc,2761 +django/db/models/sql/__init__.py,sha256=zuetuU9AGj1MdjWYMtzErxZH2VlY9dGp-RQGdCXd6uM,297 +django/db/models/sql/compiler.py,sha256=bZzzWKkAVFwkVyUm4syfv9n5hZg-jBhKtw1EhDrZyLU,69585 +django/db/models/sql/constants.py,sha256=gMg0n_j0fsfmqV5XFiywZXgSvuPq_WPV50ZSFlWYaCE,591 +django/db/models/sql/datastructures.py,sha256=1IXmOSSaqnu_d3Ab2iyp97nrVw0l_wpFLEosaAfLiHM,6701 +django/db/models/sql/query.py,sha256=4KAJprOcaxk7CtyXZvuJg4qzPaKmp7QHsAh4Frb2e-I,100717 +django/db/models/sql/subqueries.py,sha256=mGv0szYV_L3MQ62d_sABqpUOsQU3vQZgxCUCkVov4M4,7280 +django/db/models/sql/where.py,sha256=2o2kVQ8hXK0UuPlQeELDv9EQajKgVW9rxNT1MHXmTac,7991 +django/dispatch/__init__.py,sha256=qP203zNwjaolUFnXLNZHnuBn7HNzyw9_JkODECRKZbc,286 +django/dispatch/dispatcher.py,sha256=sos1Caqi0aUeddtC_kQ6vxQ3Sau2j02Yej1OHVxJSOQ,10707 +django/dispatch/license.txt,sha256=VABMS2BpZOvBY68W0EYHwW5Cj4p4oCb-y1P3DAn0qU8,1743 +django/forms/__init__.py,sha256=S6ckOMmvUX-vVST6AC-M8BzsfVQwuEUAdHWabMN-OGI,368 +django/forms/boundfield.py,sha256=X7zpRwQNc6QQOPnrXA9t4eLiGJlFY209do7N4bSFzPc,9978 +django/forms/fields.py,sha256=8z1bCzmkyW6Oik6QNAcbwuPJmCd2-FPYm297nAYSrOE,44659 +django/forms/forms.py,sha256=FFv07TkZhPV6_lvDBwQphE2fkOYMUSKL4X9p67IQI9M,20256 +django/forms/formsets.py,sha256=R9w0MoQitKwCfXylbAU2O4JxzEj6MKAt_adxBYDfyfQ,18199 +django/forms/models.py,sha256=OEDKgzXTixAqBJi8Q-JHomIMRY4TFRQSmef8A0JF8-s,56146 +django/forms/renderers.py,sha256=URxnFGbWNa5Mco2LNxQDrWWHmsXh4WY1QPLJ9rlTDpk,1975 +django/forms/utils.py,sha256=1EkxKX6-y-kj0Xzdwv-eJjL3zvbqjx0-Saw4EAOQAgg,5659 +django/forms/widgets.py,sha256=cazUSZ0Xnx1pLdTxszUY7vYqPInPCdboBMxB3zErsF0,37084 +django/forms/jinja2/django/forms/widgets/attrs.html,sha256=_J2P-AOpHFhIwaqCNcrJFxEY4s-KPdy0Wcq0KlarIG0,172 +django/forms/jinja2/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 +django/forms/jinja2/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 +django/forms/jinja2/django/forms/widgets/clearable_file_input.html,sha256=f3TWFr6fXxgVfpKPM2QQgQzPXm9RsPtDs6lQfhnaUVU,461 +django/forms/jinja2/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/input.html,sha256=u12fZde-ugkEAAkPAtAfSxwGQmYBkXkssWohOUs-xoE,172 +django/forms/jinja2/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 +django/forms/jinja2/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 +django/forms/jinja2/django/forms/widgets/multiple_input.html,sha256=O9W9tLA_gdxNqN_No2Tesd8_2GhOTyKEkCOnp_rUBn4,431 +django/forms/jinja2/django/forms/widgets/multiwidget.html,sha256=pr-MxRyucRxn_HvBGZvbc3JbFyrAolbroxvA4zmPz2Y,86 +django/forms/jinja2/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 +django/forms/jinja2/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 +django/forms/jinja2/django/forms/widgets/select.html,sha256=ESyDzbLTtM7-OG34EuSUnvxCtyP5IrQsZh0jGFrIdEA,365 +django/forms/jinja2/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/jinja2/django/forms/widgets/select_option.html,sha256=tNa1D3G8iy2ZcWeKyI-mijjDjRmMaqSo-jnAR_VS3Qc,110 +django/forms/jinja2/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/jinja2/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/jinja2/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 +django/forms/jinja2/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/jinja2/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/attrs.html,sha256=9ylIPv5EZg-rx2qPLgobRkw6Zq_WJSM8kt106PpSYa0,172 +django/forms/templates/django/forms/widgets/checkbox.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/checkbox_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 +django/forms/templates/django/forms/widgets/checkbox_select.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 +django/forms/templates/django/forms/widgets/clearable_file_input.html,sha256=f3TWFr6fXxgVfpKPM2QQgQzPXm9RsPtDs6lQfhnaUVU,461 +django/forms/templates/django/forms/widgets/date.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/datetime.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/file.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/hidden.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/input.html,sha256=dwzzrLocGLZQIaGe-_X8k7z87jV6AFtn28LilnUnUH0,189 +django/forms/templates/django/forms/widgets/input_option.html,sha256=PyRNn9lmE9Da0-RK37zW4yJZUSiJWgIPCU9ou5oUC28,219 +django/forms/templates/django/forms/widgets/multiple_hidden.html,sha256=T54-n1ZeUlTd-svM3C4tLF42umKM0R5A7fdfsdthwkA,54 +django/forms/templates/django/forms/widgets/multiple_input.html,sha256=HwEaZLEiZYdPJ6brC9QWRGaIKzcX5UA2Tj5Rsq_NvOk,462 +django/forms/templates/django/forms/widgets/multiwidget.html,sha256=slk4AgCdXnVmFvavhjVcsza0quTOP2LG50D8wna0dw0,117 +django/forms/templates/django/forms/widgets/number.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/password.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/radio.html,sha256=-ob26uqmvrEUMZPQq6kAqK4KBk2YZHTCWWCM6BnaL0w,57 +django/forms/templates/django/forms/widgets/radio_option.html,sha256=U2dFtAXvOn_eK4ok0oO6BwKE-3-jozJboGah_PQFLVM,55 +django/forms/templates/django/forms/widgets/select.html,sha256=7U0RzjeESG87ENzQjPRUF71gvKvGjVVvXcpsW2-BTR4,384 +django/forms/templates/django/forms/widgets/select_date.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/templates/django/forms/widgets/select_option.html,sha256=N_psd0JYCqNhx2eh2oyvkF2KU2dv7M9mtMw_4BLYq8A,127 +django/forms/templates/django/forms/widgets/splitdatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/templates/django/forms/widgets/splithiddendatetime.html,sha256=AzaPLlNLg91qkVQwwtAJxwOqDemrtt_btSkWLpboJDs,54 +django/forms/templates/django/forms/widgets/text.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/textarea.html,sha256=Av1Y-hpXUU2AjrhnUivgZFKNBLdwCSZSeuSmCqmCkDA,145 +django/forms/templates/django/forms/widgets/time.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/forms/templates/django/forms/widgets/url.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48 +django/http/__init__.py,sha256=5JImoB1BZNuZBOt5qyDX7t51McYbkDLX45eKmNN_Fes,1010 +django/http/cookie.py,sha256=Zpg6OEW9-dGvr5ByQhlHyGjLJzvNNrnGL1WzolnsM6U,818 +django/http/multipartparser.py,sha256=nVsO_ltddU2WwGHpmx33-a2LPBvLCvhsSKJCrXMGYRs,24849 +django/http/request.py,sha256=L9Hm9EncumIimwhDNJsYwkBDE4H5QCZ58jiQgIA9urY,22018 +django/http/response.py,sha256=Jb6UKYq38gz-bmvQ_-_Clmxu23ndOCLrokMkGOg2vYI,19822 +django/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/middleware/cache.py,sha256=O2o_oy_WqqOdIT8ncgTOFv--WQDZxslVPgKeV0ZGWc8,7721 +django/middleware/clickjacking.py,sha256=4rzsG5m_Z2VabN7J_5ZVeFj14X3FAbs0iU5LKoBb9js,1733 +django/middleware/common.py,sha256=j8uL14Du1FaiY-tK87YEQRb1MsYSREqpLjWxkQzaVVM,7337 +django/middleware/csrf.py,sha256=AmhsvvJcwcZi6WDvffsJyM5Cr7Po_S0By82HfVN2qkU,13695 +django/middleware/gzip.py,sha256=oq6J0L_1NLZuvV1F1MxuFPzdUS71301py0GWHBAmk2k,2060 +django/middleware/http.py,sha256=JiRGXvtfmXxYTomy7gde5pcG45GX7R0qpXiI5Fk06dE,1624 +django/middleware/locale.py,sha256=MLUCXirb6za_o2T4mKokGvow8Z-jTrUhfGBJ82y0Mz4,3017 +django/middleware/security.py,sha256=E0R1W9k8qFIfPZ72GjRXg9YE4Cn0P8mzFdIh5vnlhNo,1952 +django/template/__init__.py,sha256=t5onT26DOSny4Qi7iz_a82M5WJydvPpkb6hFjE010CE,1871 +django/template/base.py,sha256=gH4PtPPv2koQxF6z5DPIA1RSLpn074G8RkXAece6owM,38162 +django/template/context.py,sha256=FkH-98jR88v26qIKKEJA8ZQxXIFliZZsfX-v7CNQ6AY,8974 +django/template/context_processors.py,sha256=drfyVYugSe1lg9VIbsC3oRLUG64Gw94Oq77FLfk2ZNI,2407 +django/template/defaultfilters.py,sha256=dZ8fmd9aHgk3plHhyef_bVVJQovJVXqzeaUdmyzqf-M,25959 +django/template/defaulttags.py,sha256=6O2VusUshB-vsqR3zFiHyZ1mSv2MSDc9OjJx3ijx_XY,49592 +django/template/engine.py,sha256=PJBXkDmv3AIh6WugbyFcUKu01XKNDxk43BKURTLhI7g,6854 +django/template/exceptions.py,sha256=awd7B80xhFB574Lt2IdIyHCpD6KGGyuKGkIoalr9deo,1340 +django/template/library.py,sha256=g2gi5FfSug-Wak2P4Weg7qGcwHrwIy47vse35YYkLbk,12812 +django/template/loader.py,sha256=-t5cTnWJrxtS2vyg9cguz4rXxlTBni4XoJUuqJNglPI,2054 +django/template/loader_tags.py,sha256=beGFoV5luVMZj6zaUaY1lUFv5gWzQqmDybHsnTOG8Jo,12306 +django/template/response.py,sha256=dBq9wQvYEvCtHqpeK6Diw-yYkcQpbVDIeL22nckII3Q,5425 +django/template/smartif.py,sha256=QBvsTtD4YiyGoU4hXrW8vqR0CBAFOZGuDoRP3aGEgOs,6408 +django/template/utils.py,sha256=e30XcUAZkeMk2kp4kYZg-7wx2PQlBMqWOxCJoj8fEco,3589 +django/template/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/template/backends/base.py,sha256=P8dvOmQppJ8YMZ5_XyOJGDzspbQMNGV82GxL5IwrMFM,2751 +django/template/backends/django.py,sha256=_w350tmHAMSLOw-b2o9rR0Wn6YX3QMkpHkkpvbo_EwI,4186 +django/template/backends/dummy.py,sha256=Nl313SxX1rxE1F-5AHCljgejrYpYCx-QXJpNUkQWXR4,1767 +django/template/backends/jinja2.py,sha256=bx8DcA2PqqzDmcgegY11pm5EhmD_gWTTLauGo91imL4,3504 +django/template/backends/utils.py,sha256=5Ixx08oifnjpIFod1t9IRJJ_S-UCGk_-CH6oTuIZqXE,414 +django/template/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/template/loaders/app_directories.py,sha256=w3a84EAXWX12w7F1CyxIQ_lFiTwxFS7xf3rCEcnUqyc,313 +django/template/loaders/base.py,sha256=kvjmN-UHxdd6Pwgkexw7IHL0YeJQgXXbuz_tdj5ciKc,1558 +django/template/loaders/cached.py,sha256=tbkSEaMOyX9Ys29opTpI8Wui59beO25FJOHHm2MP6Vo,3619 +django/template/loaders/filesystem.py,sha256=OWTnIwWbVj-Td5VrOkKw1G_6pIuz1Vnh5CedZN5glyU,1507 +django/template/loaders/locmem.py,sha256=8cBYI8wPOOnIx_3v7fC5jezA_6pJLqgqObeLwHXQJKo,673 +django/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/templatetags/cache.py,sha256=otY3c4Ti9YLxFfOuIX5TZ7w12aGDPkyGfQNsaPVZ_M0,3401 +django/templatetags/i18n.py,sha256=59uC1SiRTPW0R3E5ML_svVdhRLHj8WYxVxYOmwrg1Ro,18830 +django/templatetags/l10n.py,sha256=I6jRSBLvL34H-_rwGuHfU22VBhO2IHNRue78KWb8pTc,1723 +django/templatetags/static.py,sha256=om3cu4NVaH4MVUq-XPLxPVNlLUCxTbbp0qAVVSaClj4,4502 +django/templatetags/tz.py,sha256=HFzJsvh-x9yjoju4kiIpKAI0U_4crtoftqiT8llM_u8,5400 +django/test/__init__.py,sha256=5FrmvgBrxzZo5UVLW9HZ1iHBMMhcnXcNL5Y2xnaqVPA,682 +django/test/client.py,sha256=iCDiaiNLKJB_fcZLDk4s7qlFg0d58SSj62OGXN-F0W8,28732 +django/test/html.py,sha256=xAGIOb_w045KfPLsABOvcQPNZbYXZfKaGl7C4thSJwQ,7486 +django/test/runner.py,sha256=HKY8sUY9uMcmgg9fpafCXu5QT16qSU5ZR2-MkSdvHrc,26443 +django/test/selenium.py,sha256=HphIIQixsP3uUWqEXbU-wgkQSeLE2379s0bWOpleSbg,4580 +django/test/signals.py,sha256=BQlO0pXZTOdcbhgW1gJLc16WW2Q75wx_2wheG5kCh9U,6729 +django/test/testcases.py,sha256=6OIglcO4loIEcZbrXLht43ciW_d28_hTz5ESLM_dlyM,61365 +django/test/utils.py,sha256=0327cjxpw1oKe9H5d8Xf7cdtXE4dl9XrpDL54xldr2k,29769 +django/urls/__init__.py,sha256=FdHfNv5NwWEIt1EqEpRY7xJ-i4tD-SCLj0tq3qT6X1E,959 +django/urls/base.py,sha256=FyzHdMGoWj9chy8m4pxuEQggbrtbixY1VAvsWr6Pw4Q,5652 +django/urls/conf.py,sha256=8Xug9NhJXDEysRXWrY2iHf0snfJMUmQkYZAomPltWMY,2946 +django/urls/converters.py,sha256=_eluhZBczkfMwCZJEQtM7s7KJQYbwoO4lygFQvtWSHA,1216 +django/urls/exceptions.py,sha256=alLNjkORtAxneC00g4qnRpG5wouOHvJvGbymdpKtG_I,115 +django/urls/resolvers.py,sha256=z7tGl3Gk_-M6iHCUmMOkzTHmn7XjuAWr58U6qVb-hdU,27298 +django/urls/utils.py,sha256=VHDcmggNRHSbPJAql5KJhe7wX4pSjrKb64Fu-p14D9Q,2152 +django/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/utils/_os.py,sha256=O8TdR7f0VZUJLtEJ8wRuAU4O30aDt7jRBJPe0uJx6FU,2319 +django/utils/archive.py,sha256=vfnm15A6vgrLvgzhKRE9oJvHhd1JvKtDKc1RibEfCug,7459 +django/utils/autoreload.py,sha256=prf3bdR3Obt6zMoByNadQApxYfD8qfL8s1EOiQprDLk,22389 +django/utils/baseconv.py,sha256=xYReIqcF2FFD85BqDrl48xo4UijII9D6YyC-FHsUPbw,2989 +django/utils/cache.py,sha256=zmLMJyoUXn1WMs8HwN4hER1841iV6BCEQp7A9APKTL8,15236 +django/utils/crypto.py,sha256=IIqgXjuPnXLufCY-nX61pSnAutVrr_cQXnSq6jrctNw,3079 +django/utils/datastructures.py,sha256=WQNC_3HeOUXV4KLEDzMAdA5KxBC2BqLnU40i2ziVODc,10194 +django/utils/dateformat.py,sha256=YyUXezYqG_R-hMqSh4Q50qyTfvReD_4TTHVD2c1zH4U,11508 +django/utils/dateparse.py,sha256=1KNeTgoBPnZYFMrj60P0TqlXFKURG5Tk9ypvEZokLVg,4708 +django/utils/dates.py,sha256=hl7plurNHC7tj_9Olb7H7-LCtOhOV71oWg-xx5PBFh4,2021 +django/utils/datetime_safe.py,sha256=9svjsJ9NVgOuSmgoecmBj2OlAk6kbZBlPLnPTxjxyfc,2811 +django/utils/deconstruct.py,sha256=hcO_7qassSI5dTfQ5CPttA8s3f9yaF8UnqKKma3bI6M,1975 +django/utils/decorators.py,sha256=shbm4hl9EZnkGSarU8kCNCfvi3fRz-y4IpMn3cLn_j0,6839 +django/utils/deprecation.py,sha256=WT5IBFUCZZEQRXBE3oEFS9Owm-jFPufjGzmNzpxXkh4,3335 +django/utils/duration.py,sha256=VtDUAQKIPFuv6XkwG6gIjLQYtcs8vgGMcS4OQpSFx-E,1234 +django/utils/encoding.py,sha256=E8Cv6BhVcQb9qXlXAJyyrJRxVSoWplw3Z7k0RU1TeV0,9034 +django/utils/feedgenerator.py,sha256=rI74OiJ8cWgt9AhA0RnYdKTVi7IXUM6FCLpFUQjDRmc,15109 +django/utils/formats.py,sha256=vuB-IV1PlQH3qWQRtwFG6HqTeZinOc-iOXiZbioMpFs,8973 +django/utils/functional.py,sha256=SV8B49LKJWYMTLPSTudqm4QdRNZc2yosfKHACLfvzhg,14934 +django/utils/hashable.py,sha256=oKA7b4KMSFYou8278uoKN8OhIr1v_4HvqpnFuWX6CcY,541 +django/utils/html.py,sha256=anX8pynFCghrdbrm5eNBxwR0c5aPFPyumUC4R2e-d3o,13625 +django/utils/http.py,sha256=N71gtpRFHI6RPFtuvZTIjLeF9V1XK4L75Xi_bH64MWY,15869 +django/utils/inspect.py,sha256=6UgUGkYM4O6tgD2xLf4-_SwccNsYyCj-qm-eV-UuQsU,1789 +django/utils/ipv6.py,sha256=WBkmZXdtbIHgcaWDKm4ElRvzyu_wKLCW2aA18g1RCJo,1350 +django/utils/itercompat.py,sha256=lacIDjczhxbwG4ON_KfG1H6VNPOGOpbRhnVhbedo2CY,184 +django/utils/jslex.py,sha256=jOes0kfZoIIPxPMNWkXMJ6D3x3f95B5cZWKXo38Rhcc,7707 +django/utils/log.py,sha256=EgHENXlsZvbOrGeCwhFM89cZmJe6FMsgG3DE5Zf3m1U,7617 +django/utils/lorem_ipsum.py,sha256=P_BSLsITDP2ZW9EJPy6ciFneib0iz9ezBz2LD7CViRE,4775 +django/utils/lru_cache.py,sha256=4g-svLUmsvn2wlS-rPEJbFr_ODqoar5qxwIjGxrLlxA,256 +django/utils/module_loading.py,sha256=7axS-Noau0eW1yvFe4teC5cs774eUqrcSSWjf-1tml4,3650 +django/utils/numberformat.py,sha256=waacNvqlzLly_0y50tLhVg8WAGooX6VKhxkSWgE9ryA,3142 +django/utils/regex_helper.py,sha256=4aWtTpg-WxCBF3VdjE0z1Q9m-0vEjUs4hBf0wQ2seNk,12225 +django/utils/safestring.py,sha256=PeuXouObw-6U6PZaqQscCpUIAAszA1qrgdMM4tGkTOo,2393 +django/utils/six.py,sha256=ecocr7GKytCmp9FbyOLDUR4_0vngcOjMJItxTGnTRV8,30502 +django/utils/termcolors.py,sha256=JrysYBjC72oq0WBL6EJ44A8ZEij_S7QsivoRQugxPEk,7362 +django/utils/text.py,sha256=EE8x4eoUUNNU_Waq3jybptiIIRbDSAnS8DbHIxiDPT8,13761 +django/utils/timesince.py,sha256=QlkajdzXVftZlf9VIF-vlOK9M_UpErK2DH-6cCTJmLQ,3177 +django/utils/timezone.py,sha256=2i1ZvOBmUxxuff6nQ-Q1go7VZ4jSlBIxreIkurD89Q0,8369 +django/utils/topological_sort.py,sha256=AwF4mvJw4CXhFgLyA7HCgSZY68sh8aQZxDaL9NeyIZA,1198 +django/utils/tree.py,sha256=HKi-DFkh6PCmWxwQhKRvMPDP5AufD_BY3DpZM1ivnNo,4886 +django/utils/version.py,sha256=6iP04QtIAc3QyEEWsvLArFi74NmqtIGX0vYtHbTJyDk,3214 +django/utils/xmlutils.py,sha256=74FlMIKhIkMsZb9RL9RZ4EpteGhVoxDespUEqgfDPaw,1185 +django/utils/translation/__init__.py,sha256=djQ2D2tj9_QCrHWUdqNFd_FayfWMMrymoT5c3b6QWtc,8738 +django/utils/translation/reloader.py,sha256=AblCuViaqJBgA19B95hMnjGRhjk3c9sSPRc8f_4_4yQ,968 +django/utils/translation/template.py,sha256=YB4F--bYjTZgo7MFYhEFxXQIxLlZHEtGd16xWwDVit0,9958 +django/utils/translation/trans_null.py,sha256=yp82bHt5oqqL95Z5PFoYCZeENOulxzp-IqMmkWz0l9Y,1257 +django/utils/translation/trans_real.py,sha256=L2u0qwbnBE3Jq4jPm4r9zADmWdWOXgo5b6qVkEu1lMI,17932 +django/views/__init__.py,sha256=DGdAuGC0t1bMju9i-B9p_gqPgRIFHtLXTdIxNKWFGsw,63 +django/views/csrf.py,sha256=TOnXES5w0BmUvyq7whGB6Z6Ds4-RotIVammFGN88UKY,6252 +django/views/debug.py,sha256=culMfkCBmUFYwG8PszvU7cyUQeJL9bxhwzoYWEKZu2Y,20351 +django/views/defaults.py,sha256=Guifqw0keMcwBSqpYlhxxO6LxA6usW9QLrr5h7O2iNw,4468 +django/views/i18n.py,sha256=gJLS6spFc8RSu9ntlVKc2Mb0XwcHxHrPxKu96cDURRU,11000 +django/views/static.py,sha256=R1tS45T8r5P6Xa8umzH6RcO4dnhIzHnlSKFEpIobpHw,4548 +django/views/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django/views/decorators/cache.py,sha256=uSLzb61mCuFKIm8tR3Gs_NP1H7U-BOEU_QOc3IhBC_4,1705 +django/views/decorators/clickjacking.py,sha256=EW-DRe2dR8yg4Rf8HRHl8c4-C8mL3HKGa6PxZRKmFtU,1565 +django/views/decorators/csrf.py,sha256=xPWVVNw_DBidvX_ZVYvN7CePt1HpxpUxsb6wMr0Oe4Y,2073 +django/views/decorators/debug.py,sha256=Q_ul_n8M89WoPL87mDYomZ74mv_djuudZZ-b-uB1I6s,2569 +django/views/decorators/gzip.py,sha256=PtpSGd8BePa1utGqvKMFzpLtZJxpV2_Jej8llw5bCJY,253 +django/views/decorators/http.py,sha256=NgZFNkaX0DwDJWUNNgj-FRbBOQEyW4KwbrWDZOa_9Go,4713 +django/views/decorators/vary.py,sha256=6wEXI5yBFZYDVednNPc0bYbXGG-QzkIUQ-50ErDrA_k,1084 +django/views/generic/__init__.py,sha256=WTnzEXnKyJqzHlLu_VsXInYg-GokDNBCUYNV_U6U-ok,822 +django/views/generic/base.py,sha256=lAS2D3uaDd3KgWsPjenp6OSNG3DLbse_K1v6ijcu5ao,7805 +django/views/generic/dates.py,sha256=p9PKscdpueKRZ4n5jpiqsTZM8IS1w6ITd9xO4kagA44,25423 +django/views/generic/detail.py,sha256=m8otoffJXPW9ml-vAtXeM4asTT5I4pvuoR4BhjpWB6A,6507 +django/views/generic/edit.py,sha256=zPO3D8rFrSDjJG1OnRYn0frGqVq8VMKAEUihZU2NrIk,8332 +django/views/generic/list.py,sha256=GS6wVgiFz4MHsZXi7jfKjlSiHrrmZw8agJl26fVZwjM,7674 +django/views/templates/default_urlconf.html,sha256=Fsbawa-zQhrvcfjfBPVoHgOxSFS0orqEyPudrXT5DmU,16595 +django/views/templates/technical_404.html,sha256=nZT2gkPAYc7G8VNJXst-dEyim0t83xjX-TtCGtxJZwc,2453 +django/views/templates/technical_500.html,sha256=4bFi98TJHN56C3ZnQmDP4uN1yhn2QJXQcmqsaWsEG2w,17182 +django/views/templates/technical_500.txt,sha256=7VWOipQg2poVyusbM8dQHRyRR-iUB_dOehAoF0HBHNM,3367 +Django-2.2.6.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 +Django-2.2.6.dist-info/METADATA,sha256=jPcKFWjLtRfKCaie58SkxXe6G4pyrNNt-y-w0nnjKxE,3511 +Django-2.2.6.dist-info/WHEEL,sha256=S8S5VL-stOTSZDYxHyf0KP7eds0J72qrK0Evu3TfyAY,92 +Django-2.2.6.dist-info/entry_points.txt,sha256=daYW_s0r8Z5eiRi_bNU6vodHqVUXQWzm-DHFOQHTV2Q,83 +Django-2.2.6.dist-info/top_level.txt,sha256=V_goijg9tfO20ox_7os6CcnPvmBavbxu46LpJiNLwjA,7 +Django-2.2.6.dist-info/RECORD,, +../../../bin/django-admin,sha256=FuzhoUFORGVSn0cfbVFrUSieYa6JWLNdLRBuY7X2blg,317 +Django-2.2.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +django/templatetags/__pycache__/tz.cpython-37.pyc,, +django/templatetags/__pycache__/l10n.cpython-37.pyc,, +django/templatetags/__pycache__/i18n.cpython-37.pyc,, +django/templatetags/__pycache__/cache.cpython-37.pyc,, +django/templatetags/__pycache__/static.cpython-37.pyc,, +django/templatetags/__pycache__/__init__.cpython-37.pyc,, +django/middleware/__pycache__/clickjacking.cpython-37.pyc,, +django/middleware/__pycache__/csrf.cpython-37.pyc,, +django/middleware/__pycache__/common.cpython-37.pyc,, +django/middleware/__pycache__/gzip.cpython-37.pyc,, +django/middleware/__pycache__/locale.cpython-37.pyc,, +django/middleware/__pycache__/security.cpython-37.pyc,, +django/middleware/__pycache__/cache.cpython-37.pyc,, +django/middleware/__pycache__/http.cpython-37.pyc,, +django/middleware/__pycache__/__init__.cpython-37.pyc,, +django/forms/__pycache__/renderers.cpython-37.pyc,, +django/forms/__pycache__/boundfield.cpython-37.pyc,, +django/forms/__pycache__/widgets.cpython-37.pyc,, +django/forms/__pycache__/forms.cpython-37.pyc,, +django/forms/__pycache__/models.cpython-37.pyc,, +django/forms/__pycache__/formsets.cpython-37.pyc,, +django/forms/__pycache__/utils.cpython-37.pyc,, +django/forms/__pycache__/fields.cpython-37.pyc,, +django/forms/__pycache__/__init__.cpython-37.pyc,, +django/core/cache/backends/__pycache__/locmem.cpython-37.pyc,, +django/core/cache/backends/__pycache__/db.cpython-37.pyc,, +django/core/cache/backends/__pycache__/base.cpython-37.pyc,, +django/core/cache/backends/__pycache__/dummy.cpython-37.pyc,, +django/core/cache/backends/__pycache__/memcached.cpython-37.pyc,, +django/core/cache/backends/__pycache__/filebased.cpython-37.pyc,, +django/core/cache/backends/__pycache__/__init__.cpython-37.pyc,, +django/core/cache/__pycache__/utils.cpython-37.pyc,, +django/core/cache/__pycache__/__init__.cpython-37.pyc,, +django/core/mail/backends/__pycache__/smtp.cpython-37.pyc,, +django/core/mail/backends/__pycache__/console.cpython-37.pyc,, +django/core/mail/backends/__pycache__/locmem.cpython-37.pyc,, +django/core/mail/backends/__pycache__/base.cpython-37.pyc,, +django/core/mail/backends/__pycache__/dummy.cpython-37.pyc,, +django/core/mail/backends/__pycache__/filebased.cpython-37.pyc,, +django/core/mail/backends/__pycache__/__init__.cpython-37.pyc,, +django/core/mail/__pycache__/message.cpython-37.pyc,, +django/core/mail/__pycache__/utils.cpython-37.pyc,, +django/core/mail/__pycache__/__init__.cpython-37.pyc,, +django/core/checks/compatibility/__pycache__/__init__.cpython-37.pyc,, +django/core/checks/security/__pycache__/csrf.cpython-37.pyc,, +django/core/checks/security/__pycache__/sessions.cpython-37.pyc,, +django/core/checks/security/__pycache__/base.cpython-37.pyc,, +django/core/checks/security/__pycache__/__init__.cpython-37.pyc,, +django/core/checks/__pycache__/model_checks.cpython-37.pyc,, +django/core/checks/__pycache__/database.cpython-37.pyc,, +django/core/checks/__pycache__/translation.cpython-37.pyc,, +django/core/checks/__pycache__/messages.cpython-37.pyc,, +django/core/checks/__pycache__/templates.cpython-37.pyc,, +django/core/checks/__pycache__/caches.cpython-37.pyc,, +django/core/checks/__pycache__/registry.cpython-37.pyc,, +django/core/checks/__pycache__/urls.cpython-37.pyc,, +django/core/checks/__pycache__/__init__.cpython-37.pyc,, +django/core/management/__pycache__/sql.cpython-37.pyc,, +django/core/management/__pycache__/templates.cpython-37.pyc,, +django/core/management/__pycache__/base.cpython-37.pyc,, +django/core/management/__pycache__/color.cpython-37.pyc,, +django/core/management/__pycache__/utils.cpython-37.pyc,, +django/core/management/__pycache__/__init__.cpython-37.pyc,, +django/core/management/commands/__pycache__/dumpdata.cpython-37.pyc,, +django/core/management/commands/__pycache__/startproject.cpython-37.pyc,, +django/core/management/commands/__pycache__/sqlmigrate.cpython-37.pyc,, +django/core/management/commands/__pycache__/sqlflush.cpython-37.pyc,, +django/core/management/commands/__pycache__/showmigrations.cpython-37.pyc,, +django/core/management/commands/__pycache__/dbshell.cpython-37.pyc,, +django/core/management/commands/__pycache__/startapp.cpython-37.pyc,, +django/core/management/commands/__pycache__/compilemessages.cpython-37.pyc,, +django/core/management/commands/__pycache__/squashmigrations.cpython-37.pyc,, +django/core/management/commands/__pycache__/loaddata.cpython-37.pyc,, +django/core/management/commands/__pycache__/sqlsequencereset.cpython-37.pyc,, +django/core/management/commands/__pycache__/makemessages.cpython-37.pyc,, +django/core/management/commands/__pycache__/makemigrations.cpython-37.pyc,, +django/core/management/commands/__pycache__/check.cpython-37.pyc,, +django/core/management/commands/__pycache__/migrate.cpython-37.pyc,, +django/core/management/commands/__pycache__/inspectdb.cpython-37.pyc,, +django/core/management/commands/__pycache__/sendtestemail.cpython-37.pyc,, +django/core/management/commands/__pycache__/testserver.cpython-37.pyc,, +django/core/management/commands/__pycache__/diffsettings.cpython-37.pyc,, +django/core/management/commands/__pycache__/flush.cpython-37.pyc,, +django/core/management/commands/__pycache__/runserver.cpython-37.pyc,, +django/core/management/commands/__pycache__/shell.cpython-37.pyc,, +django/core/management/commands/__pycache__/test.cpython-37.pyc,, +django/core/management/commands/__pycache__/createcachetable.cpython-37.pyc,, +django/core/__pycache__/exceptions.cpython-37.pyc,, +django/core/__pycache__/signals.cpython-37.pyc,, +django/core/__pycache__/paginator.cpython-37.pyc,, +django/core/__pycache__/validators.cpython-37.pyc,, +django/core/__pycache__/wsgi.cpython-37.pyc,, +django/core/__pycache__/signing.cpython-37.pyc,, +django/core/__pycache__/__init__.cpython-37.pyc,, +django/core/serializers/__pycache__/xml_serializer.cpython-37.pyc,, +django/core/serializers/__pycache__/pyyaml.cpython-37.pyc,, +django/core/serializers/__pycache__/python.cpython-37.pyc,, +django/core/serializers/__pycache__/base.cpython-37.pyc,, +django/core/serializers/__pycache__/json.cpython-37.pyc,, +django/core/serializers/__pycache__/__init__.cpython-37.pyc,, +django/core/files/__pycache__/uploadedfile.cpython-37.pyc,, +django/core/files/__pycache__/storage.cpython-37.pyc,, +django/core/files/__pycache__/temp.cpython-37.pyc,, +django/core/files/__pycache__/uploadhandler.cpython-37.pyc,, +django/core/files/__pycache__/images.cpython-37.pyc,, +django/core/files/__pycache__/move.cpython-37.pyc,, +django/core/files/__pycache__/base.cpython-37.pyc,, +django/core/files/__pycache__/utils.cpython-37.pyc,, +django/core/files/__pycache__/__init__.cpython-37.pyc,, +django/core/files/__pycache__/locks.cpython-37.pyc,, +django/core/handlers/__pycache__/base.cpython-37.pyc,, +django/core/handlers/__pycache__/wsgi.cpython-37.pyc,, +django/core/handlers/__pycache__/exception.cpython-37.pyc,, +django/core/handlers/__pycache__/__init__.cpython-37.pyc,, +django/core/servers/__pycache__/basehttp.cpython-37.pyc,, +django/core/servers/__pycache__/__init__.cpython-37.pyc,, +django/test/__pycache__/client.cpython-37.pyc,, +django/test/__pycache__/signals.cpython-37.pyc,, +django/test/__pycache__/testcases.cpython-37.pyc,, +django/test/__pycache__/selenium.cpython-37.pyc,, +django/test/__pycache__/utils.cpython-37.pyc,, +django/test/__pycache__/__init__.cpython-37.pyc,, +django/test/__pycache__/runner.cpython-37.pyc,, +django/test/__pycache__/html.cpython-37.pyc,, +django/bin/__pycache__/django-admin.cpython-37.pyc,, +django/dispatch/__pycache__/dispatcher.cpython-37.pyc,, +django/dispatch/__pycache__/__init__.cpython-37.pyc,, +django/template/backends/__pycache__/django.cpython-37.pyc,, +django/template/backends/__pycache__/jinja2.cpython-37.pyc,, +django/template/backends/__pycache__/base.cpython-37.pyc,, +django/template/backends/__pycache__/utils.cpython-37.pyc,, +django/template/backends/__pycache__/dummy.cpython-37.pyc,, +django/template/backends/__pycache__/__init__.cpython-37.pyc,, +django/template/__pycache__/response.cpython-37.pyc,, +django/template/__pycache__/defaulttags.cpython-37.pyc,, +django/template/__pycache__/engine.cpython-37.pyc,, +django/template/__pycache__/context_processors.cpython-37.pyc,, +django/template/__pycache__/smartif.cpython-37.pyc,, +django/template/__pycache__/exceptions.cpython-37.pyc,, +django/template/__pycache__/defaultfilters.cpython-37.pyc,, +django/template/__pycache__/loader.cpython-37.pyc,, +django/template/__pycache__/base.cpython-37.pyc,, +django/template/__pycache__/utils.cpython-37.pyc,, +django/template/__pycache__/loader_tags.cpython-37.pyc,, +django/template/__pycache__/context.cpython-37.pyc,, +django/template/__pycache__/library.cpython-37.pyc,, +django/template/__pycache__/__init__.cpython-37.pyc,, +django/template/loaders/__pycache__/cached.cpython-37.pyc,, +django/template/loaders/__pycache__/locmem.cpython-37.pyc,, +django/template/loaders/__pycache__/app_directories.cpython-37.pyc,, +django/template/loaders/__pycache__/filesystem.cpython-37.pyc,, +django/template/loaders/__pycache__/base.cpython-37.pyc,, +django/template/loaders/__pycache__/__init__.cpython-37.pyc,, +django/utils/translation/__pycache__/trans_real.cpython-37.pyc,, +django/utils/translation/__pycache__/template.cpython-37.pyc,, +django/utils/translation/__pycache__/reloader.cpython-37.pyc,, +django/utils/translation/__pycache__/__init__.cpython-37.pyc,, +django/utils/translation/__pycache__/trans_null.cpython-37.pyc,, +django/utils/__pycache__/tree.cpython-37.pyc,, +django/utils/__pycache__/dateformat.cpython-37.pyc,, +django/utils/__pycache__/duration.cpython-37.pyc,, +django/utils/__pycache__/feedgenerator.cpython-37.pyc,, +django/utils/__pycache__/inspect.cpython-37.pyc,, +django/utils/__pycache__/datastructures.cpython-37.pyc,, +django/utils/__pycache__/version.cpython-37.pyc,, +django/utils/__pycache__/timesince.cpython-37.pyc,, +django/utils/__pycache__/xmlutils.cpython-37.pyc,, +django/utils/__pycache__/deprecation.cpython-37.pyc,, +django/utils/__pycache__/_os.cpython-37.pyc,, +django/utils/__pycache__/itercompat.cpython-37.pyc,, +django/utils/__pycache__/ipv6.cpython-37.pyc,, +django/utils/__pycache__/functional.cpython-37.pyc,, +django/utils/__pycache__/archive.cpython-37.pyc,, +django/utils/__pycache__/safestring.cpython-37.pyc,, +django/utils/__pycache__/formats.cpython-37.pyc,, +django/utils/__pycache__/six.cpython-37.pyc,, +django/utils/__pycache__/datetime_safe.cpython-37.pyc,, +django/utils/__pycache__/text.cpython-37.pyc,, +django/utils/__pycache__/baseconv.cpython-37.pyc,, +django/utils/__pycache__/encoding.cpython-37.pyc,, +django/utils/__pycache__/lru_cache.cpython-37.pyc,, +django/utils/__pycache__/log.cpython-37.pyc,, +django/utils/__pycache__/crypto.cpython-37.pyc,, +django/utils/__pycache__/hashable.cpython-37.pyc,, +django/utils/__pycache__/topological_sort.cpython-37.pyc,, +django/utils/__pycache__/deconstruct.cpython-37.pyc,, +django/utils/__pycache__/cache.cpython-37.pyc,, +django/utils/__pycache__/autoreload.cpython-37.pyc,, +django/utils/__pycache__/termcolors.cpython-37.pyc,, +django/utils/__pycache__/numberformat.cpython-37.pyc,, +django/utils/__pycache__/http.cpython-37.pyc,, +django/utils/__pycache__/dates.cpython-37.pyc,, +django/utils/__pycache__/lorem_ipsum.cpython-37.pyc,, +django/utils/__pycache__/jslex.cpython-37.pyc,, +django/utils/__pycache__/dateparse.cpython-37.pyc,, +django/utils/__pycache__/decorators.cpython-37.pyc,, +django/utils/__pycache__/__init__.cpython-37.pyc,, +django/utils/__pycache__/timezone.cpython-37.pyc,, +django/utils/__pycache__/module_loading.cpython-37.pyc,, +django/utils/__pycache__/regex_helper.cpython-37.pyc,, +django/utils/__pycache__/html.cpython-37.pyc,, +django/__pycache__/shortcuts.cpython-37.pyc,, +django/__pycache__/__main__.cpython-37.pyc,, +django/__pycache__/__init__.cpython-37.pyc,, +django/contrib/syndication/__pycache__/views.cpython-37.pyc,, +django/contrib/syndication/__pycache__/apps.cpython-37.pyc,, +django/contrib/syndication/__pycache__/__init__.cpython-37.pyc,, +django/contrib/messages/__pycache__/context_processors.cpython-37.pyc,, +django/contrib/messages/__pycache__/constants.cpython-37.pyc,, +django/contrib/messages/__pycache__/views.cpython-37.pyc,, +django/contrib/messages/__pycache__/middleware.cpython-37.pyc,, +django/contrib/messages/__pycache__/apps.cpython-37.pyc,, +django/contrib/messages/__pycache__/utils.cpython-37.pyc,, +django/contrib/messages/__pycache__/api.cpython-37.pyc,, +django/contrib/messages/__pycache__/__init__.cpython-37.pyc,, +django/contrib/messages/storage/__pycache__/base.cpython-37.pyc,, +django/contrib/messages/storage/__pycache__/cookie.cpython-37.pyc,, +django/contrib/messages/storage/__pycache__/fallback.cpython-37.pyc,, +django/contrib/messages/storage/__pycache__/session.cpython-37.pyc,, +django/contrib/messages/storage/__pycache__/__init__.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-37.pyc,, +django/contrib/auth/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/auth/management/__pycache__/__init__.cpython-37.pyc,, +django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-37.pyc,, +django/contrib/auth/management/commands/__pycache__/changepassword.cpython-37.pyc,, +django/contrib/auth/__pycache__/context_processors.cpython-37.pyc,, +django/contrib/auth/__pycache__/admin.cpython-37.pyc,, +django/contrib/auth/__pycache__/checks.cpython-37.pyc,, +django/contrib/auth/__pycache__/signals.cpython-37.pyc,, +django/contrib/auth/__pycache__/forms.cpython-37.pyc,, +django/contrib/auth/__pycache__/password_validation.cpython-37.pyc,, +django/contrib/auth/__pycache__/views.cpython-37.pyc,, +django/contrib/auth/__pycache__/mixins.cpython-37.pyc,, +django/contrib/auth/__pycache__/models.cpython-37.pyc,, +django/contrib/auth/__pycache__/tokens.cpython-37.pyc,, +django/contrib/auth/__pycache__/middleware.cpython-37.pyc,, +django/contrib/auth/__pycache__/validators.cpython-37.pyc,, +django/contrib/auth/__pycache__/apps.cpython-37.pyc,, +django/contrib/auth/__pycache__/base_user.cpython-37.pyc,, +django/contrib/auth/__pycache__/hashers.cpython-37.pyc,, +django/contrib/auth/__pycache__/urls.cpython-37.pyc,, +django/contrib/auth/__pycache__/decorators.cpython-37.pyc,, +django/contrib/auth/__pycache__/__init__.cpython-37.pyc,, +django/contrib/auth/__pycache__/backends.cpython-37.pyc,, +django/contrib/auth/handlers/__pycache__/modwsgi.cpython-37.pyc,, +django/contrib/auth/handlers/__pycache__/__init__.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_list.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_static.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/log.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/base.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-37.pyc,, +django/contrib/admin/templatetags/__pycache__/__init__.cpython-37.pyc,, +django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-37.pyc,, +django/contrib/admin/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-37.pyc,, +django/contrib/admin/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/admin/__pycache__/checks.cpython-37.pyc,, +django/contrib/admin/__pycache__/exceptions.cpython-37.pyc,, +django/contrib/admin/__pycache__/widgets.cpython-37.pyc,, +django/contrib/admin/__pycache__/forms.cpython-37.pyc,, +django/contrib/admin/__pycache__/tests.cpython-37.pyc,, +django/contrib/admin/__pycache__/sites.cpython-37.pyc,, +django/contrib/admin/__pycache__/models.cpython-37.pyc,, +django/contrib/admin/__pycache__/actions.cpython-37.pyc,, +django/contrib/admin/__pycache__/apps.cpython-37.pyc,, +django/contrib/admin/__pycache__/utils.cpython-37.pyc,, +django/contrib/admin/__pycache__/filters.cpython-37.pyc,, +django/contrib/admin/__pycache__/helpers.cpython-37.pyc,, +django/contrib/admin/__pycache__/options.cpython-37.pyc,, +django/contrib/admin/__pycache__/decorators.cpython-37.pyc,, +django/contrib/admin/__pycache__/__init__.cpython-37.pyc,, +django/contrib/admin/views/__pycache__/autocomplete.cpython-37.pyc,, +django/contrib/admin/views/__pycache__/main.cpython-37.pyc,, +django/contrib/admin/views/__pycache__/decorators.cpython-37.pyc,, +django/contrib/admin/views/__pycache__/__init__.cpython-37.pyc,, +django/contrib/staticfiles/templatetags/__pycache__/staticfiles.cpython-37.pyc,, +django/contrib/staticfiles/templatetags/__pycache__/__init__.cpython-37.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-37.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-37.pyc,, +django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/checks.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/handlers.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/storage.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/views.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/testing.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/apps.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/utils.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/finders.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/urls.cpython-37.pyc,, +django/contrib/staticfiles/__pycache__/__init__.cpython-37.pyc,, +django/contrib/__pycache__/__init__.cpython-37.pyc,, +django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-37.pyc,, +django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-37.pyc,, +django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/flatpages/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/admin.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/forms.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/views.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/models.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/middleware.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/apps.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/sitemaps.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/urls.cpython-37.pyc,, +django/contrib/flatpages/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sites/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-37.pyc,, +django/contrib/sites/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sites/__pycache__/managers.cpython-37.pyc,, +django/contrib/sites/__pycache__/admin.cpython-37.pyc,, +django/contrib/sites/__pycache__/shortcuts.cpython-37.pyc,, +django/contrib/sites/__pycache__/management.cpython-37.pyc,, +django/contrib/sites/__pycache__/models.cpython-37.pyc,, +django/contrib/sites/__pycache__/middleware.cpython-37.pyc,, +django/contrib/sites/__pycache__/apps.cpython-37.pyc,, +django/contrib/sites/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sites/__pycache__/requests.cpython-37.pyc,, +django/contrib/postgres/forms/__pycache__/jsonb.cpython-37.pyc,, +django/contrib/postgres/forms/__pycache__/ranges.cpython-37.pyc,, +django/contrib/postgres/forms/__pycache__/array.cpython-37.pyc,, +django/contrib/postgres/forms/__pycache__/hstore.cpython-37.pyc,, +django/contrib/postgres/forms/__pycache__/__init__.cpython-37.pyc,, +django/contrib/postgres/aggregates/__pycache__/mixins.cpython-37.pyc,, +django/contrib/postgres/aggregates/__pycache__/general.cpython-37.pyc,, +django/contrib/postgres/aggregates/__pycache__/statistics.cpython-37.pyc,, +django/contrib/postgres/aggregates/__pycache__/__init__.cpython-37.pyc,, +django/contrib/postgres/__pycache__/lookups.cpython-37.pyc,, +django/contrib/postgres/__pycache__/serializers.cpython-37.pyc,, +django/contrib/postgres/__pycache__/signals.cpython-37.pyc,, +django/contrib/postgres/__pycache__/operations.cpython-37.pyc,, +django/contrib/postgres/__pycache__/indexes.cpython-37.pyc,, +django/contrib/postgres/__pycache__/functions.cpython-37.pyc,, +django/contrib/postgres/__pycache__/validators.cpython-37.pyc,, +django/contrib/postgres/__pycache__/search.cpython-37.pyc,, +django/contrib/postgres/__pycache__/apps.cpython-37.pyc,, +django/contrib/postgres/__pycache__/utils.cpython-37.pyc,, +django/contrib/postgres/__pycache__/__init__.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/jsonb.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/mixins.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/ranges.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/array.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/citext.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/utils.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/hstore.cpython-37.pyc,, +django/contrib/postgres/fields/__pycache__/__init__.cpython-37.pyc,, +django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/redirects/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/redirects/__pycache__/admin.cpython-37.pyc,, +django/contrib/redirects/__pycache__/models.cpython-37.pyc,, +django/contrib/redirects/__pycache__/middleware.cpython-37.pyc,, +django/contrib/redirects/__pycache__/apps.cpython-37.pyc,, +django/contrib/redirects/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/sessions/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/cached_db.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/db.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/file.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/base.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/cache.cpython-37.pyc,, +django/contrib/sessions/backends/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-37.pyc,, +django/contrib/sessions/__pycache__/serializers.cpython-37.pyc,, +django/contrib/sessions/__pycache__/base_session.cpython-37.pyc,, +django/contrib/sessions/__pycache__/exceptions.cpython-37.pyc,, +django/contrib/sessions/__pycache__/models.cpython-37.pyc,, +django/contrib/sessions/__pycache__/middleware.cpython-37.pyc,, +django/contrib/sessions/__pycache__/apps.cpython-37.pyc,, +django/contrib/sessions/__pycache__/__init__.cpython-37.pyc,, +django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-37.pyc,, +django/contrib/sitemaps/__pycache__/views.cpython-37.pyc,, +django/contrib/sitemaps/__pycache__/apps.cpython-37.pyc,, +django/contrib/sitemaps/__pycache__/__init__.cpython-37.pyc,, +django/contrib/humanize/templatetags/__pycache__/humanize.cpython-37.pyc,, +django/contrib/humanize/templatetags/__pycache__/__init__.cpython-37.pyc,, +django/contrib/humanize/__pycache__/apps.cpython-37.pyc,, +django/contrib/humanize/__pycache__/__init__.cpython-37.pyc,, +django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-37.pyc,, +django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-37.pyc,, +django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-37.pyc,, +django/contrib/contenttypes/management/__pycache__/__init__.cpython-37.pyc,, +django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/admin.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/checks.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/forms.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/views.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/models.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/apps.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/fields.cpython-37.pyc,, +django/contrib/contenttypes/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/libgeos.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/point.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/prepared.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/factory.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/collections.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/linestring.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/mutable_list.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/polygon.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/io.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/coordseq.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/geometry.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/error.cpython-37.pyc,, +django/contrib/gis/geos/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/io.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-37.pyc,, +django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-37.pyc,, +django/contrib/gis/forms/__pycache__/widgets.cpython-37.pyc,, +django/contrib/gis/forms/__pycache__/fields.cpython-37.pyc,, +django/contrib/gis/forms/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/feature.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/field.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/envelope.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/srs.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/datasource.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/layer.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/geometries.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/libgdal.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/geomtype.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/error.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/gdal/__pycache__/driver.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-37.pyc,, +django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-37.pyc,, +django/contrib/gis/gdal/raster/__pycache__/const.cpython-37.pyc,, +django/contrib/gis/gdal/raster/__pycache__/band.cpython-37.pyc,, +django/contrib/gis/gdal/raster/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/gdal/raster/__pycache__/source.cpython-37.pyc,, +django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/admin/__pycache__/widgets.cpython-37.pyc,, +django/contrib/gis/admin/__pycache__/options.cpython-37.pyc,, +django/contrib/gis/admin/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-37.pyc,, +django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-37.pyc,, +django/contrib/gis/utils/__pycache__/ogrinfo.cpython-37.pyc,, +django/contrib/gis/utils/__pycache__/srs.cpython-37.pyc,, +django/contrib/gis/utils/__pycache__/ogrinspect.cpython-37.pyc,, +django/contrib/gis/utils/__pycache__/layermapping.cpython-37.pyc,, +django/contrib/gis/utils/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/__pycache__/measure.cpython-37.pyc,, +django/contrib/gis/__pycache__/feeds.cpython-37.pyc,, +django/contrib/gis/__pycache__/shortcuts.cpython-37.pyc,, +django/contrib/gis/__pycache__/views.cpython-37.pyc,, +django/contrib/gis/__pycache__/apps.cpython-37.pyc,, +django/contrib/gis/__pycache__/geometry.cpython-37.pyc,, +django/contrib/gis/__pycache__/ptr.cpython-37.pyc,, +django/contrib/gis/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/serializers/__pycache__/geojson.cpython-37.pyc,, +django/contrib/gis/serializers/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/sitemaps/__pycache__/views.cpython-37.pyc,, +django/contrib/gis/sitemaps/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/sitemaps/__pycache__/kml.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-37.pyc,, +django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/backends/__pycache__/utils.cpython-37.pyc,, +django/contrib/gis/db/backends/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-37.pyc,, +django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-37.pyc,, +django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-37.pyc,, +django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/backends/base/__pycache__/operations.cpython-37.pyc,, +django/contrib/gis/db/backends/base/__pycache__/models.cpython-37.pyc,, +django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-37.pyc,, +django/contrib/gis/db/backends/base/__pycache__/features.cpython-37.pyc,, +django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/lookups.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/proxy.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/functions.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/aggregates.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/fields.cpython-37.pyc,, +django/contrib/gis/db/models/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-37.pyc,, +django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/db/__pycache__/__init__.cpython-37.pyc,, +django/contrib/gis/geoip2/__pycache__/resources.cpython-37.pyc,, +django/contrib/gis/geoip2/__pycache__/base.cpython-37.pyc,, +django/contrib/gis/geoip2/__pycache__/__init__.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/views.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/middleware.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/apps.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/utils.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/urls.cpython-37.pyc,, +django/contrib/admindocs/__pycache__/__init__.cpython-37.pyc,, +django/http/__pycache__/response.cpython-37.pyc,, +django/http/__pycache__/request.cpython-37.pyc,, +django/http/__pycache__/multipartparser.cpython-37.pyc,, +django/http/__pycache__/cookie.cpython-37.pyc,, +django/http/__pycache__/__init__.cpython-37.pyc,, +django/urls/__pycache__/resolvers.cpython-37.pyc,, +django/urls/__pycache__/exceptions.cpython-37.pyc,, +django/urls/__pycache__/converters.cpython-37.pyc,, +django/urls/__pycache__/base.cpython-37.pyc,, +django/urls/__pycache__/conf.cpython-37.pyc,, +django/urls/__pycache__/utils.cpython-37.pyc,, +django/urls/__pycache__/__init__.cpython-37.pyc,, +django/db/migrations/__pycache__/serializer.cpython-37.pyc,, +django/db/migrations/__pycache__/exceptions.cpython-37.pyc,, +django/db/migrations/__pycache__/loader.cpython-37.pyc,, +django/db/migrations/__pycache__/state.cpython-37.pyc,, +django/db/migrations/__pycache__/recorder.cpython-37.pyc,, +django/db/migrations/__pycache__/autodetector.cpython-37.pyc,, +django/db/migrations/__pycache__/writer.cpython-37.pyc,, +django/db/migrations/__pycache__/optimizer.cpython-37.pyc,, +django/db/migrations/__pycache__/questioner.cpython-37.pyc,, +django/db/migrations/__pycache__/executor.cpython-37.pyc,, +django/db/migrations/__pycache__/migration.cpython-37.pyc,, +django/db/migrations/__pycache__/utils.cpython-37.pyc,, +django/db/migrations/__pycache__/graph.cpython-37.pyc,, +django/db/migrations/__pycache__/__init__.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/models.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/base.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/special.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/utils.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/fields.cpython-37.pyc,, +django/db/migrations/operations/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/client.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/operations.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/creation.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/base.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/features.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/utils.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/schema.cpython-37.pyc,, +django/db/backends/postgresql/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/dummy/__pycache__/base.cpython-37.pyc,, +django/db/backends/dummy/__pycache__/features.cpython-37.pyc,, +django/db/backends/dummy/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/client.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/operations.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/functions.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/creation.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/compiler.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/base.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/features.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/utils.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/schema.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/validation.cpython-37.pyc,, +django/db/backends/oracle/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/__pycache__/ddl_references.cpython-37.pyc,, +django/db/backends/__pycache__/signals.cpython-37.pyc,, +django/db/backends/__pycache__/utils.cpython-37.pyc,, +django/db/backends/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/client.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/operations.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/creation.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/base.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/features.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/utils.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/schema.cpython-37.pyc,, +django/db/backends/postgresql_psycopg2/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/client.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/operations.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/creation.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/base.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/features.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/schema.cpython-37.pyc,, +django/db/backends/sqlite3/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/client.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/operations.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/creation.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/compiler.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/base.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/features.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/schema.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/validation.cpython-37.pyc,, +django/db/backends/mysql/__pycache__/__init__.cpython-37.pyc,, +django/db/backends/base/__pycache__/client.cpython-37.pyc,, +django/db/backends/base/__pycache__/introspection.cpython-37.pyc,, +django/db/backends/base/__pycache__/operations.cpython-37.pyc,, +django/db/backends/base/__pycache__/creation.cpython-37.pyc,, +django/db/backends/base/__pycache__/base.cpython-37.pyc,, +django/db/backends/base/__pycache__/features.cpython-37.pyc,, +django/db/backends/base/__pycache__/schema.cpython-37.pyc,, +django/db/backends/base/__pycache__/validation.cpython-37.pyc,, +django/db/backends/base/__pycache__/__init__.cpython-37.pyc,, +django/db/models/__pycache__/lookups.cpython-37.pyc,, +django/db/models/__pycache__/query_utils.cpython-37.pyc,, +django/db/models/__pycache__/constants.cpython-37.pyc,, +django/db/models/__pycache__/expressions.cpython-37.pyc,, +django/db/models/__pycache__/constraints.cpython-37.pyc,, +django/db/models/__pycache__/query.cpython-37.pyc,, +django/db/models/__pycache__/signals.cpython-37.pyc,, +django/db/models/__pycache__/indexes.cpython-37.pyc,, +django/db/models/__pycache__/base.cpython-37.pyc,, +django/db/models/__pycache__/deletion.cpython-37.pyc,, +django/db/models/__pycache__/aggregates.cpython-37.pyc,, +django/db/models/__pycache__/utils.cpython-37.pyc,, +django/db/models/__pycache__/options.cpython-37.pyc,, +django/db/models/__pycache__/manager.cpython-37.pyc,, +django/db/models/__pycache__/__init__.cpython-37.pyc,, +django/db/models/functions/__pycache__/datetime.cpython-37.pyc,, +django/db/models/functions/__pycache__/math.cpython-37.pyc,, +django/db/models/functions/__pycache__/comparison.cpython-37.pyc,, +django/db/models/functions/__pycache__/mixins.cpython-37.pyc,, +django/db/models/functions/__pycache__/text.cpython-37.pyc,, +django/db/models/functions/__pycache__/window.cpython-37.pyc,, +django/db/models/functions/__pycache__/__init__.cpython-37.pyc,, +django/db/models/fields/__pycache__/related.cpython-37.pyc,, +django/db/models/fields/__pycache__/proxy.cpython-37.pyc,, +django/db/models/fields/__pycache__/files.cpython-37.pyc,, +django/db/models/fields/__pycache__/mixins.cpython-37.pyc,, +django/db/models/fields/__pycache__/related_descriptors.cpython-37.pyc,, +django/db/models/fields/__pycache__/related_lookups.cpython-37.pyc,, +django/db/models/fields/__pycache__/reverse_related.cpython-37.pyc,, +django/db/models/fields/__pycache__/__init__.cpython-37.pyc,, +django/db/models/sql/__pycache__/constants.cpython-37.pyc,, +django/db/models/sql/__pycache__/datastructures.cpython-37.pyc,, +django/db/models/sql/__pycache__/query.cpython-37.pyc,, +django/db/models/sql/__pycache__/compiler.cpython-37.pyc,, +django/db/models/sql/__pycache__/subqueries.cpython-37.pyc,, +django/db/models/sql/__pycache__/where.cpython-37.pyc,, +django/db/models/sql/__pycache__/__init__.cpython-37.pyc,, +django/db/__pycache__/transaction.cpython-37.pyc,, +django/db/__pycache__/utils.cpython-37.pyc,, +django/db/__pycache__/__init__.cpython-37.pyc,, +django/views/decorators/__pycache__/debug.cpython-37.pyc,, +django/views/decorators/__pycache__/clickjacking.cpython-37.pyc,, +django/views/decorators/__pycache__/csrf.cpython-37.pyc,, +django/views/decorators/__pycache__/gzip.cpython-37.pyc,, +django/views/decorators/__pycache__/vary.cpython-37.pyc,, +django/views/decorators/__pycache__/cache.cpython-37.pyc,, +django/views/decorators/__pycache__/http.cpython-37.pyc,, +django/views/decorators/__pycache__/__init__.cpython-37.pyc,, +django/views/__pycache__/debug.cpython-37.pyc,, +django/views/__pycache__/csrf.cpython-37.pyc,, +django/views/__pycache__/i18n.cpython-37.pyc,, +django/views/__pycache__/defaults.cpython-37.pyc,, +django/views/__pycache__/static.cpython-37.pyc,, +django/views/__pycache__/__init__.cpython-37.pyc,, +django/views/generic/__pycache__/edit.cpython-37.pyc,, +django/views/generic/__pycache__/list.cpython-37.pyc,, +django/views/generic/__pycache__/detail.cpython-37.pyc,, +django/views/generic/__pycache__/base.cpython-37.pyc,, +django/views/generic/__pycache__/dates.cpython-37.pyc,, +django/views/generic/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sl/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sl/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sk/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sk/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/pl/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/pl/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/vi/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/vi/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sq/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sq/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/de_CH/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/de_CH/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sv/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sv/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ga/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ga/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/he/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/he/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/km/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/km/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/nn/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/nn/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/da/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/da/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es_NI/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es_NI/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/mn/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/mn/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/pt_BR/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/pt_BR/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es_CO/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es_CO/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ja/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ja/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/el/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/el/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/lv/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/lv/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/fy/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/fy/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/it/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/it/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ca/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ca/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/is/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/is/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/cs/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/cs/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/te/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/te/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/zh_Hans/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/zh_Hans/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ru/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ru/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/zh_Hant/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/zh_Hant/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ro/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ro/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/pt/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/pt/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/uk/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/uk/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sr/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sr/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/en_AU/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/en_AU/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/en_GB/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/en_GB/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es_PR/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es_PR/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ml/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ml/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es_MX/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es_MX/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/mk/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/mk/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/kn/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/kn/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/bs/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/bs/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ar/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ar/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/gl/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/gl/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/hr/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/hr/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/hu/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/hu/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/nl/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/nl/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/bg/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/bg/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/bn/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/bn/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es_AR/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es_AR/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/nb/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/nb/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/hi/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/hi/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ka/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ka/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/de/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/de/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/az/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/az/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/gd/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/gd/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ko/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ko/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/fi/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/fi/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/sr_Latn/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/sr_Latn/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/eo/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/eo/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/id/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/id/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/fr/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/fr/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/es/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/es/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/et/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/et/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/en/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/en/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/fa/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/fa/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/lt/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/lt/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/cy/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/cy/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/eu/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/eu/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/ta/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/ta/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/th/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/th/__pycache__/__init__.cpython-37.pyc,, +django/conf/locale/tr/__pycache__/formats.cpython-37.pyc,, +django/conf/locale/tr/__pycache__/__init__.cpython-37.pyc,, +django/conf/__pycache__/global_settings.cpython-37.pyc,, +django/conf/__pycache__/__init__.cpython-37.pyc,, +django/conf/urls/__pycache__/i18n.cpython-37.pyc,, +django/conf/urls/__pycache__/static.cpython-37.pyc,, +django/conf/urls/__pycache__/__init__.cpython-37.pyc,, +django/apps/__pycache__/config.cpython-37.pyc,, +django/apps/__pycache__/registry.cpython-37.pyc,, +django/apps/__pycache__/__init__.cpython-37.pyc,, +../../../bin/__pycache__/django-admin.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/entry_points.txt new file mode 100644 index 0000000..22df67e --- /dev/null +++ b/venv/lib/python3.7/site-packages/Django-2.2.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +django-admin = django.core.management:execute_from_command_line + diff --git a/venv/lib/python3.7/site-packages/OpenSSL/__init__.py b/venv/lib/python3.7/site-packages/OpenSSL/__init__.py new file mode 100644 index 0000000..810d00d --- /dev/null +++ b/venv/lib/python3.7/site-packages/OpenSSL/__init__.py @@ -0,0 +1,20 @@ +# Copyright (C) AB Strakt +# See LICENSE for details. + +""" +pyOpenSSL - A simple wrapper around the OpenSSL library +""" + +from OpenSSL import crypto, SSL +from OpenSSL.version import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__, +) + + +__all__ = [ + "SSL", "crypto", + + "__author__", "__copyright__", "__email__", "__license__", "__summary__", + "__title__", "__uri__", "__version__", +] diff --git a/venv/lib/python3.7/site-packages/OpenSSL/debug.py b/venv/lib/python3.7/site-packages/OpenSSL/debug.py new file mode 100644 index 0000000..0d37bf5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/OpenSSL/debug.py @@ -0,0 +1,42 @@ +from __future__ import print_function + +import ssl +import sys + +import OpenSSL.SSL +import cffi +import cryptography + +from . import version + + +_env_info = u"""\ +pyOpenSSL: {pyopenssl} +cryptography: {cryptography} +cffi: {cffi} +cryptography's compiled against OpenSSL: {crypto_openssl_compile} +cryptography's linked OpenSSL: {crypto_openssl_link} +Pythons's OpenSSL: {python_openssl} +Python executable: {python} +Python version: {python_version} +Platform: {platform} +sys.path: {sys_path}""".format( + pyopenssl=version.__version__, + crypto_openssl_compile=OpenSSL._util.ffi.string( + OpenSSL._util.lib.OPENSSL_VERSION_TEXT, + ).decode("ascii"), + crypto_openssl_link=OpenSSL.SSL.SSLeay_version( + OpenSSL.SSL.SSLEAY_VERSION + ).decode("ascii"), + python_openssl=getattr(ssl, "OPENSSL_VERSION", "n/a"), + cryptography=cryptography.__version__, + cffi=cffi.__version__, + python=sys.executable, + python_version=sys.version, + platform=sys.platform, + sys_path=sys.path, +) + + +if __name__ == "__main__": + print(_env_info) diff --git a/venv/lib/python3.7/site-packages/OpenSSL/version.py b/venv/lib/python3.7/site-packages/OpenSSL/version.py new file mode 100644 index 0000000..1e9696b --- /dev/null +++ b/venv/lib/python3.7/site-packages/OpenSSL/version.py @@ -0,0 +1,22 @@ +# Copyright (C) AB Strakt +# Copyright (C) Jean-Paul Calderone +# See LICENSE for details. + +""" +pyOpenSSL - A simple wrapper around the OpenSSL library +""" + +__all__ = [ + "__author__", "__copyright__", "__email__", "__license__", "__summary__", + "__title__", "__uri__", "__version__", +] + +__version__ = "19.1.0" + +__title__ = "pyOpenSSL" +__uri__ = "https://pyopenssl.org/" +__summary__ = "Python wrapper module around the OpenSSL library" +__author__ = "The pyOpenSSL developers" +__email__ = "cryptography-dev@python.org" +__license__ = "Apache License, Version 2.0" +__copyright__ = "Copyright 2001-2017 {0}".format(__author__) diff --git a/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/DESCRIPTION.rst b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..f9838c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,322 @@ +PyHamcrest +========== + +| |docs| |travis| |coveralls| |landscape| |scrutinizer| |codeclimate| +| |version| |downloads| |wheel| |supported-versions| |supported-implementations| + +.. |docs| image:: https://readthedocs.org/projects/pyhamcrest/badge/?style=flat + :target: https://pyhamcrest.readthedocs.org/ + :alt: Documentation Status + +.. |travis| image:: http://img.shields.io/travis/hamcrest/PyHamcrest/master.png?style=flat + :alt: Travis-CI Build Status + :target: https://travis-ci.org/hamcrest/PyHamcrest + +.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/github/hamcrest/PyHamcrest?branch=master + :alt: AppVeyor Build Status + :target: https://ci.appveyor.com/project/hamcrest/PyHamcrest + +.. |coveralls| image:: http://img.shields.io/coveralls/hamcrest/PyHamcrest/master.png?style=flat + :alt: Coverage Status + :target: https://coveralls.io/r/hamcrest/PyHamcrest + +.. |landscape| image:: https://landscape.io/github/hamcrest/PyHamcrest/master/landscape.svg?style=flat + :target: https://landscape.io/github/hamcrest/PyHamcrest/master + :alt: Code Quality Status + +.. |codeclimate| image:: https://codeclimate.com/github/hamcrest/PyHamcrest/badges/gpa.svg + :target: https://codeclimate.com/github/hamcrest/PyHamcrest + :alt: Code Climate + +.. |version| image:: http://img.shields.io/pypi/v/PyHamcrest.png?style=flat + :alt: PyPI Package latest release + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |downloads| image:: http://img.shields.io/pypi/dm/PyHamcrest.png?style=flat + :alt: PyPI Package monthly downloads + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |wheel| image:: https://pypip.in/wheel/PyHamcrest/badge.png?style=flat + :alt: PyPI Wheel + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |supported-versions| image:: https://pypip.in/py_versions/PyHamcrest/badge.png?style=flat + :alt: Supported versions + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |supported-implementations| image:: https://pypip.in/implementation/PyHamcrest/badge.png?style=flat + :alt: Supported imlementations + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |scrutinizer| image:: https://img.shields.io/scrutinizer/g/hamcrest/PyHamcrest/master.png?style=flat + :alt: Scrtinizer Status + :target: https://scrutinizer-ci.com/g/hamcrest/PyHamcrest/ + + +Introduction +============ + +PyHamcrest is a framework for writing matcher objects, allowing you to +declaratively define "match" rules. There are a number of situations where +matchers are invaluable, such as UI validation, or data filtering, but it is in +the area of writing flexible tests that matchers are most commonly used. This +tutorial shows you how to use PyHamcrest for unit testing. + +When writing tests it is sometimes difficult to get the balance right between +overspecifying the test (and making it brittle to changes), and not specifying +enough (making the test less valuable since it continues to pass even when the +thing being tested is broken). Having a tool that allows you to pick out +precisely the aspect under test and describe the values it should have, to a +controlled level of precision, helps greatly in writing tests that are "just +right." Such tests fail when the behavior of the aspect under test deviates +from the expected behavior, yet continue to pass when minor, unrelated changes +to the behaviour are made. + +Installation +============ + +Hamcrest can be installed using the usual Python packaging tools. It depends on +distribute, but as long as you have a network connection when you install, the +installation process will take care of that for you. + +My first PyHamcrest test +======================== + +We'll start by writing a very simple PyUnit test, but instead of using PyUnit's +``assertEqual`` method, we'll use PyHamcrest's ``assert_that`` construct and +the standard set of matchers: + +.. code:: python + + from hamcrest import * + import unittest + + class BiscuitTest(unittest.TestCase): + def testEquals(self): + theBiscuit = Biscuit('Ginger') + myBiscuit = Biscuit('Ginger') + assert_that(theBiscuit, equal_to(myBiscuit)) + + if __name__ == '__main__': + unittest.main() + +The ``assert_that`` function is a stylized sentence for making a test +assertion. In this example, the subject of the assertion is the object +``theBiscuit``, which is the first method parameter. The second method +parameter is a matcher for ``Biscuit`` objects, here a matcher that checks one +object is equal to another using the Python ``==`` operator. The test passes +since the ``Biscuit`` class defines an ``__eq__`` method. + +If you have more than one assertion in your test you can include an identifier +for the tested value in the assertion: + +.. code:: python + + assert_that(theBiscuit.getChocolateChipCount(), equal_to(10), 'chocolate chips') + assert_that(theBiscuit.getHazelnutCount(), equal_to(3), 'hazelnuts') + +As a convenience, assert_that can also be used to verify a boolean condition: + +.. code:: python + + assert_that(theBiscuit.isCooked(), 'cooked') + +This is equivalent to the ``assert_`` method of unittest.TestCase, but because +it's a standalone function, it offers greater flexibility in test writing. + + +Predefined matchers +=================== + +PyHamcrest comes with a library of useful matchers: + +* Object + + * ``equal_to`` - match equal object + * ``has_length`` - match ``len()`` + * ``has_property`` - match value of property with given name + * ``has_properties`` - match an object that has all of the given properties. + * ``has_string`` - match ``str()`` + * ``instance_of`` - match object type + * ``none``, ``not_none`` - match ``None``, or not ``None`` + * ``same_instance`` - match same object + * ``calling, raises`` - wrap a method call and assert that it raises an exception + +* Number + + * ``close_to`` - match number close to a given value + * ``greater_than``, ``greater_than_or_equal_to``, ``less_than``, + ``less_than_or_equal_to`` - match numeric ordering + +* Text + + * ``contains_string`` - match part of a string + * ``ends_with`` - match the end of a string + * ``equal_to_ignoring_case`` - match the complete string but ignore case + * ``equal_to_ignoring_whitespace`` - match the complete string but ignore extra whitespace + * ``matches_regexp`` - match a regular expression in a string + * ``starts_with`` - match the beginning of a string + * ``string_contains_in_order`` - match parts of a string, in relative order + +* Logical + + * ``all_of`` - ``and`` together all matchers + * ``any_of`` - ``or`` together all matchers + * ``anything`` - match anything, useful in composite matchers when you don't care about a particular value + * ``is_not`` - negate the matcher + +* Sequence + + * ``contains`` - exactly match the entire sequence + * ``contains_inanyorder`` - match the entire sequence, but in any order + * ``has_item`` - match if given item appears in the sequence + * ``has_items`` - match if all given items appear in the sequence, in any order + * ``is_in`` - match if item appears in the given sequence + * ``only_contains`` - match if sequence's items appear in given list + * ``empty`` - match if the sequence is empty + +* Dictionary + + * ``has_entries`` - match dictionary with list of key-value pairs + * ``has_entry`` - match dictionary containing a key-value pair + * ``has_key`` - match dictionary with a key + * ``has_value`` - match dictionary with a value + +* Decorator + + * ``calling`` - wrap a callable in a deffered object, for subsequent matching on calling behaviour + * ``raises`` - Ensure that a deferred callable raises as expected + * ``described_as`` - give the matcher a custom failure description + * ``is_`` - decorator to improve readability - see `Syntactic sugar` below + +The arguments for many of these matchers accept not just a matching value, but +another matcher, so matchers can be composed for greater flexibility. For +example, ``only_contains(less_than(5))`` will match any sequence where every +item is less than 5. + + +Syntactic sugar +=============== + +PyHamcrest strives to make your tests as readable as possible. For example, the +``is_`` matcher is a wrapper that doesn't add any extra behavior to the +underlying matcher. The following assertions are all equivalent: + +.. code:: python + + assert_that(theBiscuit, equal_to(myBiscuit)) + assert_that(theBiscuit, is_(equal_to(myBiscuit))) + assert_that(theBiscuit, is_(myBiscuit)) + +The last form is allowed since ``is_(value)`` wraps most non-matcher arguments +with ``equal_to``. But if the argument is a type, it is wrapped with +``instance_of``, so the following are also equivalent: + +.. code:: python + + assert_that(theBiscuit, instance_of(Biscuit)) + assert_that(theBiscuit, is_(instance_of(Biscuit))) + assert_that(theBiscuit, is_(Biscuit)) + +*Note that PyHamcrest's ``is_`` matcher is unrelated to Python's ``is`` +operator. The matcher for object identity is ``same_instance``.* + + +Writing custom matchers +======================= + +PyHamcrest comes bundled with lots of useful matchers, but you'll probably find +that you need to create your own from time to time to fit your testing needs. +This commonly occurs when you find a fragment of code that tests the same set +of properties over and over again (and in different tests), and you want to +bundle the fragment into a single assertion. By writing your own matcher you'll +eliminate code duplication and make your tests more readable! + +Let's write our own matcher for testing if a calendar date falls on a Saturday. +This is the test we want to write: + +.. code:: python + + def testDateIsOnASaturday(self): + d = datetime.date(2008, 04, 26) + assert_that(d, is_(on_a_saturday())) + +And here's the implementation: + +.. code:: python + + from hamcrest.core.base_matcher import BaseMatcher + from hamcrest.core.helpers.hasmethod import hasmethod + + class IsGivenDayOfWeek(BaseMatcher): + + def __init__(self, day): + self.day = day # Monday is 0, Sunday is 6 + + def _matches(self, item): + if not hasmethod(item, 'weekday'): + return False + return item.weekday() == self.day + + def describe_to(self, description): + day_as_string = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', + 'Friday', 'Saturday', 'Sunday'] + description.append_text('calendar date falling on ') \ + .append_text(day_as_string[self.day]) + + def on_a_saturday(): + return IsGivenDayOfWeek(5) + +For our Matcher implementation we implement the ``_matches`` method - which +calls the ``weekday`` method after confirming that the argument (which may not +be a date) has such a method - and the ``describe_to`` method - which is used +to produce a failure message when a test fails. Here's an example of how the +failure message looks: + +.. code:: python + + assert_that(datetime.date(2008, 04, 06), is_(on_a_saturday())) + +fails with the message:: + + AssertionError: + Expected: is calendar date falling on Saturday + got: <2008-04-06> + +Let's say this matcher is saved in a module named ``isgivendayofweek``. We +could use it in our test by importing the factory function ``on_a_saturday``: + +.. code:: python + + from hamcrest import * + import unittest + from isgivendayofweek import on_a_saturday + + class DateTest(unittest.TestCase): + def testDateIsOnASaturday(self): + d = datetime.date(2008, 04, 26) + assert_that(d, is_(on_a_saturday())) + + if __name__ == '__main__': + unittest.main() + +Even though the ``on_a_saturday`` function creates a new matcher each time it +is called, you should not assume this is the only usage pattern for your +matcher. Therefore you should make sure your matcher is stateless, so a single +instance can be reused between matches. + + +More resources +============== + +* Documentation_ +* Package_ +* Sources_ +* Hamcrest_ + +.. _Documentation: http://readthedocs.org/docs/pyhamcrest/en/V1.8.2/ +.. _Package: http://pypi.python.org/pypi/PyHamcrest +.. _Sources: https://github.com/hamcrest/PyHamcrest +.. _Hamcrest: http://hamcrest.org + + diff --git a/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/METADATA new file mode 100644 index 0000000..e8ca1e0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/METADATA @@ -0,0 +1,353 @@ +Metadata-Version: 2.0 +Name: PyHamcrest +Version: 1.9.0 +Summary: Hamcrest framework for matcher objects +Home-page: https://github.com/hamcrest/PyHamcrest +Author: Chris Rose +Author-email: offline@offby1.net +License: New BSD +Download-URL: http://pypi.python.org/packages/source/P/PyHamcrest/PyHamcrest-1.9.0.tar.gz +Keywords: hamcrest matchers pyunit unit test testing unittest unittesting +Platform: All +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: Jython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: Quality Assurance +Classifier: Topic :: Software Development :: Testing +Provides: hamcrest +Requires-Dist: setuptools +Requires-Dist: six + +PyHamcrest +========== + +| |docs| |travis| |coveralls| |landscape| |scrutinizer| |codeclimate| +| |version| |downloads| |wheel| |supported-versions| |supported-implementations| + +.. |docs| image:: https://readthedocs.org/projects/pyhamcrest/badge/?style=flat + :target: https://pyhamcrest.readthedocs.org/ + :alt: Documentation Status + +.. |travis| image:: http://img.shields.io/travis/hamcrest/PyHamcrest/master.png?style=flat + :alt: Travis-CI Build Status + :target: https://travis-ci.org/hamcrest/PyHamcrest + +.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/github/hamcrest/PyHamcrest?branch=master + :alt: AppVeyor Build Status + :target: https://ci.appveyor.com/project/hamcrest/PyHamcrest + +.. |coveralls| image:: http://img.shields.io/coveralls/hamcrest/PyHamcrest/master.png?style=flat + :alt: Coverage Status + :target: https://coveralls.io/r/hamcrest/PyHamcrest + +.. |landscape| image:: https://landscape.io/github/hamcrest/PyHamcrest/master/landscape.svg?style=flat + :target: https://landscape.io/github/hamcrest/PyHamcrest/master + :alt: Code Quality Status + +.. |codeclimate| image:: https://codeclimate.com/github/hamcrest/PyHamcrest/badges/gpa.svg + :target: https://codeclimate.com/github/hamcrest/PyHamcrest + :alt: Code Climate + +.. |version| image:: http://img.shields.io/pypi/v/PyHamcrest.png?style=flat + :alt: PyPI Package latest release + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |downloads| image:: http://img.shields.io/pypi/dm/PyHamcrest.png?style=flat + :alt: PyPI Package monthly downloads + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |wheel| image:: https://pypip.in/wheel/PyHamcrest/badge.png?style=flat + :alt: PyPI Wheel + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |supported-versions| image:: https://pypip.in/py_versions/PyHamcrest/badge.png?style=flat + :alt: Supported versions + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |supported-implementations| image:: https://pypip.in/implementation/PyHamcrest/badge.png?style=flat + :alt: Supported imlementations + :target: https://pypi.python.org/pypi/PyHamcrest + +.. |scrutinizer| image:: https://img.shields.io/scrutinizer/g/hamcrest/PyHamcrest/master.png?style=flat + :alt: Scrtinizer Status + :target: https://scrutinizer-ci.com/g/hamcrest/PyHamcrest/ + + +Introduction +============ + +PyHamcrest is a framework for writing matcher objects, allowing you to +declaratively define "match" rules. There are a number of situations where +matchers are invaluable, such as UI validation, or data filtering, but it is in +the area of writing flexible tests that matchers are most commonly used. This +tutorial shows you how to use PyHamcrest for unit testing. + +When writing tests it is sometimes difficult to get the balance right between +overspecifying the test (and making it brittle to changes), and not specifying +enough (making the test less valuable since it continues to pass even when the +thing being tested is broken). Having a tool that allows you to pick out +precisely the aspect under test and describe the values it should have, to a +controlled level of precision, helps greatly in writing tests that are "just +right." Such tests fail when the behavior of the aspect under test deviates +from the expected behavior, yet continue to pass when minor, unrelated changes +to the behaviour are made. + +Installation +============ + +Hamcrest can be installed using the usual Python packaging tools. It depends on +distribute, but as long as you have a network connection when you install, the +installation process will take care of that for you. + +My first PyHamcrest test +======================== + +We'll start by writing a very simple PyUnit test, but instead of using PyUnit's +``assertEqual`` method, we'll use PyHamcrest's ``assert_that`` construct and +the standard set of matchers: + +.. code:: python + + from hamcrest import * + import unittest + + class BiscuitTest(unittest.TestCase): + def testEquals(self): + theBiscuit = Biscuit('Ginger') + myBiscuit = Biscuit('Ginger') + assert_that(theBiscuit, equal_to(myBiscuit)) + + if __name__ == '__main__': + unittest.main() + +The ``assert_that`` function is a stylized sentence for making a test +assertion. In this example, the subject of the assertion is the object +``theBiscuit``, which is the first method parameter. The second method +parameter is a matcher for ``Biscuit`` objects, here a matcher that checks one +object is equal to another using the Python ``==`` operator. The test passes +since the ``Biscuit`` class defines an ``__eq__`` method. + +If you have more than one assertion in your test you can include an identifier +for the tested value in the assertion: + +.. code:: python + + assert_that(theBiscuit.getChocolateChipCount(), equal_to(10), 'chocolate chips') + assert_that(theBiscuit.getHazelnutCount(), equal_to(3), 'hazelnuts') + +As a convenience, assert_that can also be used to verify a boolean condition: + +.. code:: python + + assert_that(theBiscuit.isCooked(), 'cooked') + +This is equivalent to the ``assert_`` method of unittest.TestCase, but because +it's a standalone function, it offers greater flexibility in test writing. + + +Predefined matchers +=================== + +PyHamcrest comes with a library of useful matchers: + +* Object + + * ``equal_to`` - match equal object + * ``has_length`` - match ``len()`` + * ``has_property`` - match value of property with given name + * ``has_properties`` - match an object that has all of the given properties. + * ``has_string`` - match ``str()`` + * ``instance_of`` - match object type + * ``none``, ``not_none`` - match ``None``, or not ``None`` + * ``same_instance`` - match same object + * ``calling, raises`` - wrap a method call and assert that it raises an exception + +* Number + + * ``close_to`` - match number close to a given value + * ``greater_than``, ``greater_than_or_equal_to``, ``less_than``, + ``less_than_or_equal_to`` - match numeric ordering + +* Text + + * ``contains_string`` - match part of a string + * ``ends_with`` - match the end of a string + * ``equal_to_ignoring_case`` - match the complete string but ignore case + * ``equal_to_ignoring_whitespace`` - match the complete string but ignore extra whitespace + * ``matches_regexp`` - match a regular expression in a string + * ``starts_with`` - match the beginning of a string + * ``string_contains_in_order`` - match parts of a string, in relative order + +* Logical + + * ``all_of`` - ``and`` together all matchers + * ``any_of`` - ``or`` together all matchers + * ``anything`` - match anything, useful in composite matchers when you don't care about a particular value + * ``is_not`` - negate the matcher + +* Sequence + + * ``contains`` - exactly match the entire sequence + * ``contains_inanyorder`` - match the entire sequence, but in any order + * ``has_item`` - match if given item appears in the sequence + * ``has_items`` - match if all given items appear in the sequence, in any order + * ``is_in`` - match if item appears in the given sequence + * ``only_contains`` - match if sequence's items appear in given list + * ``empty`` - match if the sequence is empty + +* Dictionary + + * ``has_entries`` - match dictionary with list of key-value pairs + * ``has_entry`` - match dictionary containing a key-value pair + * ``has_key`` - match dictionary with a key + * ``has_value`` - match dictionary with a value + +* Decorator + + * ``calling`` - wrap a callable in a deffered object, for subsequent matching on calling behaviour + * ``raises`` - Ensure that a deferred callable raises as expected + * ``described_as`` - give the matcher a custom failure description + * ``is_`` - decorator to improve readability - see `Syntactic sugar` below + +The arguments for many of these matchers accept not just a matching value, but +another matcher, so matchers can be composed for greater flexibility. For +example, ``only_contains(less_than(5))`` will match any sequence where every +item is less than 5. + + +Syntactic sugar +=============== + +PyHamcrest strives to make your tests as readable as possible. For example, the +``is_`` matcher is a wrapper that doesn't add any extra behavior to the +underlying matcher. The following assertions are all equivalent: + +.. code:: python + + assert_that(theBiscuit, equal_to(myBiscuit)) + assert_that(theBiscuit, is_(equal_to(myBiscuit))) + assert_that(theBiscuit, is_(myBiscuit)) + +The last form is allowed since ``is_(value)`` wraps most non-matcher arguments +with ``equal_to``. But if the argument is a type, it is wrapped with +``instance_of``, so the following are also equivalent: + +.. code:: python + + assert_that(theBiscuit, instance_of(Biscuit)) + assert_that(theBiscuit, is_(instance_of(Biscuit))) + assert_that(theBiscuit, is_(Biscuit)) + +*Note that PyHamcrest's ``is_`` matcher is unrelated to Python's ``is`` +operator. The matcher for object identity is ``same_instance``.* + + +Writing custom matchers +======================= + +PyHamcrest comes bundled with lots of useful matchers, but you'll probably find +that you need to create your own from time to time to fit your testing needs. +This commonly occurs when you find a fragment of code that tests the same set +of properties over and over again (and in different tests), and you want to +bundle the fragment into a single assertion. By writing your own matcher you'll +eliminate code duplication and make your tests more readable! + +Let's write our own matcher for testing if a calendar date falls on a Saturday. +This is the test we want to write: + +.. code:: python + + def testDateIsOnASaturday(self): + d = datetime.date(2008, 04, 26) + assert_that(d, is_(on_a_saturday())) + +And here's the implementation: + +.. code:: python + + from hamcrest.core.base_matcher import BaseMatcher + from hamcrest.core.helpers.hasmethod import hasmethod + + class IsGivenDayOfWeek(BaseMatcher): + + def __init__(self, day): + self.day = day # Monday is 0, Sunday is 6 + + def _matches(self, item): + if not hasmethod(item, 'weekday'): + return False + return item.weekday() == self.day + + def describe_to(self, description): + day_as_string = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', + 'Friday', 'Saturday', 'Sunday'] + description.append_text('calendar date falling on ') \ + .append_text(day_as_string[self.day]) + + def on_a_saturday(): + return IsGivenDayOfWeek(5) + +For our Matcher implementation we implement the ``_matches`` method - which +calls the ``weekday`` method after confirming that the argument (which may not +be a date) has such a method - and the ``describe_to`` method - which is used +to produce a failure message when a test fails. Here's an example of how the +failure message looks: + +.. code:: python + + assert_that(datetime.date(2008, 04, 06), is_(on_a_saturday())) + +fails with the message:: + + AssertionError: + Expected: is calendar date falling on Saturday + got: <2008-04-06> + +Let's say this matcher is saved in a module named ``isgivendayofweek``. We +could use it in our test by importing the factory function ``on_a_saturday``: + +.. code:: python + + from hamcrest import * + import unittest + from isgivendayofweek import on_a_saturday + + class DateTest(unittest.TestCase): + def testDateIsOnASaturday(self): + d = datetime.date(2008, 04, 26) + assert_that(d, is_(on_a_saturday())) + + if __name__ == '__main__': + unittest.main() + +Even though the ``on_a_saturday`` function creates a new matcher each time it +is called, you should not assume this is the only usage pattern for your +matcher. Therefore you should make sure your matcher is stateless, so a single +instance can be reused between matches. + + +More resources +============== + +* Documentation_ +* Package_ +* Sources_ +* Hamcrest_ + +.. _Documentation: http://readthedocs.org/docs/pyhamcrest/en/V1.8.2/ +.. _Package: http://pypi.python.org/pypi/PyHamcrest +.. _Sources: https://github.com/hamcrest/PyHamcrest +.. _Hamcrest: http://hamcrest.org + + diff --git a/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/RECORD b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/RECORD new file mode 100644 index 0000000..e9bb3e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/RECORD @@ -0,0 +1,120 @@ +hamcrest/__init__.py,sha256=Uo0mxeePyXP9_yIzBBvKqIL6tzEHqBwBO1eSHfAKies,230 +hamcrest/core/__init__.py,sha256=nDkYm1E1P7XpHmR8EHu17eahlmC6uYix4HurTyJjhlE,230 +hamcrest/core/assert_that.py,sha256=mPdTQQVsjUliK3xp8l_Vn3YmMzg_h5rYhWJk2mstMc0,2428 +hamcrest/core/base_description.py,sha256=auvrelro2vGh_A05TQxwbaBJStvfHiFqm0TL56luxEU,2841 +hamcrest/core/base_matcher.py,sha256=eRhLv7zFBJGaz68vEsDlvKbrWwU8GRDfZc7pWBNcxwI,1193 +hamcrest/core/compat.py,sha256=wUi1u_nIhgUA3kFGJDZLQ2D_cRw79E1SxPDMaI4mzG0,642 +hamcrest/core/description.py,sha256=gbVS-ejZJ783o-WEA66bXnXc9DH5cOlQXg0FlzoVGro,1729 +hamcrest/core/matcher.py,sha256=BG6e8bIJvwFI0qkaSkt_SOuuLI0VidvoX8GQLadYssU,1851 +hamcrest/core/selfdescribing.py,sha256=RzwqHRGg00AJYweGiP8JzSxoHFdBo0Q7m5axYfutfG8,574 +hamcrest/core/selfdescribingvalue.py,sha256=OpGLOjdPA9FSgmLZzmkfYrDvpG261TDDiM56muROFqQ,834 +hamcrest/core/string_description.py,sha256=Jp-SbuY8LAwPucL4NMrwWqRhkg6CMwYE-pH0ZDMUq8A,908 +hamcrest/core/core/__init__.py,sha256=7q_pNO9cmtV3BEixiGcueNdbxRxlKEFZ1RSO-5GP58E,770 +hamcrest/core/core/allof.py,sha256=x2ea18Z5cioRybs1heTd3E8zYtpFbuBJg3vIU3vl9k0,1487 +hamcrest/core/core/anyof.py,sha256=8j2KAsaToXbv8CA5hed4bqPR3hscODIiaFhAlAyJ2Vs,1097 +hamcrest/core/core/described_as.py,sha256=kyy_qRpoebWB1bS2ReAkNDt-79iXu6HqHxOG0GT7PtQ,1623 +hamcrest/core/core/is_.py,sha256=C7UCASfr4AIlaaMZnT5d34OthAZQ3rYv8OhszQjz-Eg,2547 +hamcrest/core/core/isanything.py,sha256=D2QO5dbDhwlVRGLFrnxOSijTyeKN2iWLRwjpvnumkvg,798 +hamcrest/core/core/isequal.py,sha256=TAwF_lWIjVokPruXN8IGS6ajzPGlThanTLPdhktKwRQ,893 +hamcrest/core/core/isinstanceof.py,sha256=dnt8YKLhYwGZvDkJ0OTdLd1PN9cB9ZWCg5k8kdnEuqI,1352 +hamcrest/core/core/isnone.py,sha256=51ueQKBgg0RzWVLzjFOyt6K0ejk2EbXUlUX90ORPm80,557 +hamcrest/core/core/isnot.py,sha256=_z_ynAVUXEUGWoiRlynFa_yaCVh9cK9LIOznDfKVZeo,1533 +hamcrest/core/core/issame.py,sha256=8FvAjud4HTuyz7O-XoJbzLtKhChCr1_5JmzMYMeQt1s,1261 +hamcrest/core/core/raises.py,sha256=BZXtMlQiEqEjQMYT76HUiuQNRjTECIUmL82_FKYhAvs,3610 +hamcrest/core/helpers/__init__.py,sha256=mPsycYI18LoGawOo9BfETa7yKtnM-fDjFOr43BIevUg,146 +hamcrest/core/helpers/hasmethod.py,sha256=LPh_WDRuyKYII3G3fX_x2Ql-ECuPJn4tK5eWMLbetLg,325 +hamcrest/core/helpers/wrap_matcher.py,sha256=IQTtw98Pp1NXcVTy9boaNh6jayvawKHhX62R3ZwnVwQ,880 +hamcrest/library/__init__.py,sha256=2atNiBCC2g3c-7jw53CltNgU4wEao1uRcheUPl1ML50,1014 +hamcrest/library/collection/__init__.py,sha256=iJU6WCsf0R22m11fqMA9Ztb161AZAdrsKG-4Cj38lZ0,635 +hamcrest/library/collection/is_empty.py,sha256=p3-B7DCmdbVzqiW3D1h3krdeqmu9B0mfYOaa6HehODg,913 +hamcrest/library/collection/isdict_containing.py,sha256=6QxDtDp_Z2TK-6om8cHnJDh45YdmaNHAEy5n97rzf00,2056 +hamcrest/library/collection/isdict_containingentries.py,sha256=xKtdFjrwLN32rUdRR4PBUSYa3yACa6jXsmlZv0D9YAU,5168 +hamcrest/library/collection/isdict_containingkey.py,sha256=aiBpusjpZmkUEMZ_rUFZBB1GxIfsqluMjhXoWNScqZY,1535 +hamcrest/library/collection/isdict_containingvalue.py,sha256=N7mHKgMnd7q6HsQekHH6DShNYbLiSXN9cpQgcdMIjlw,1565 +hamcrest/library/collection/isin.py,sha256=bcVslW0fUq0pM_SrT9gdltTlNfeJkrVPZAlg6riV2Ys,774 +hamcrest/library/collection/issequence_containing.py,sha256=ZwYMm2-Ul_JtvjcgdMjipYdz82yUbGmRNsdPAjO9RX0,3001 +hamcrest/library/collection/issequence_containinginanyorder.py,sha256=Px_W2-_0XDOXiL2NTTMp16ZTZvBl4m5rXjlMoR4Ulmw,3613 +hamcrest/library/collection/issequence_containinginorder.py,sha256=x7AT_kOCaPY0LmZw28ln8xLLHBtT-I3NneoCWzMJoYA,3219 +hamcrest/library/collection/issequence_onlycontaining.py,sha256=Ia17P1HVgb43lZfdUEhmPyUUUWtGLix__fqXIQJTUiI,1626 +hamcrest/library/integration/__init__.py,sha256=3aiupojVacPksKTXVhqRs9OwUDoUlUw-bjWItJnRg8Q,254 +hamcrest/library/integration/match_equality.py,sha256=0BMth20YLTqjqTLT4qMVldAe2dQV3CJ2j3zLXDIGl9c,1192 +hamcrest/library/number/__init__.py,sha256=J3UoFdR9UPq9zXSKe1a9qAlpjaVst8-pnaxsvbCPj78,335 +hamcrest/library/number/iscloseto.py,sha256=2lQTw3Xvo5MW-aePxpWVUOwyV_ydXtH6cCAIAxeopk8,2259 +hamcrest/library/number/ordering_comparison.py,sha256=8XxVSOzPK29D14h4wtBZYVYKZf6IcABaQEKihEuzlhI,1700 +hamcrest/library/object/__init__.py,sha256=pxzCpybBHRaIg7RJUAw7R1Po0llw8QBbVv_R1TXNBhc,319 +hamcrest/library/object/haslength.py,sha256=mpYVvrBZV548FwEeqlHWYofv9LPgChvnypZ4RhZDMp0,1681 +hamcrest/library/object/hasproperty.py,sha256=9t8upZxjqSQp6IvGyTm4ftGvcpBeyk0dy36HgvlXZBg,5740 +hamcrest/library/object/hasstring.py,sha256=_Ht1x-DwV4hk2fRuGo_KoayoLOIoWObKoA30u7HnABU,1250 +hamcrest/library/text/__init__.py,sha256=3Uuy1lY2p0VEUy1SAIO6IZgDDgyx8ZsB98k-J2FA_R0,548 +hamcrest/library/text/isequal_ignoring_case.py,sha256=VGkR3PNDOVE1MJT9H4a3SjR2SIYNzT80VoV6NEq3aqw,1257 +hamcrest/library/text/isequal_ignoring_whitespace.py,sha256=NQzswc7fk5rOhcoHO4zbYSWqn-WQdQ7Hwf0FoDHAwBM,1667 +hamcrest/library/text/stringcontains.py,sha256=JbkSxdFkpRrNYJfSUghboxe1jRLfHAJvOn6PYvMx7fQ,953 +hamcrest/library/text/stringcontainsinorder.py,sha256=B3qG7TG24_WyVPGJER2iqi7fzOMZN0UsBRJPtWutBkc,1705 +hamcrest/library/text/stringendswith.py,sha256=JjukJWSVWgURvTstrbCGCQdQzY0PMWLul__UlDh2NGA,980 +hamcrest/library/text/stringmatches.py,sha256=AEBn8NI3q-YzRUdXiAfnw1Kmse-LLxJUluDAuy_D9nU,1151 +hamcrest/library/text/stringstartswith.py,sha256=oOro8G3z8nAOUyOjHHkHhUvY-lt7XRTJzDr9dYxxons,1007 +hamcrest/library/text/substringmatcher.py,sha256=lSPxE7pTpTJlUkMtd28WgsM1FFm56JVZixSvAldSZXk,695 +PyHamcrest-1.9.0.dist-info/DESCRIPTION.rst,sha256=13XTDh2baR2aJ91v_lAOjEXD7Ydush_RHhk0Z3azfs8,11973 +PyHamcrest-1.9.0.dist-info/METADATA,sha256=s0naXZHUZhft0MWcUeZVaZYlREKPOqHp3mUQrhUoC6s,13276 +PyHamcrest-1.9.0.dist-info/metadata.json,sha256=Jqs-ZSW5kWSnfvxDsRMwSQH6TxEqSJjBJWiQk1G-c_A,1545 +PyHamcrest-1.9.0.dist-info/pbr.json,sha256=jdAcCmfO0nnMs9-YKXuwDyKnxc4qGwyUxyGulF9Pam4,47 +PyHamcrest-1.9.0.dist-info/RECORD,, +PyHamcrest-1.9.0.dist-info/top_level.txt,sha256=mRc0yPsPQSqFgWBmZBY33u-05Xtm5M4GEve4NjYdloQ,9 +PyHamcrest-1.9.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +PyHamcrest-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +hamcrest/core/core/__pycache__/issame.cpython-37.pyc,, +hamcrest/core/core/__pycache__/isinstanceof.cpython-37.pyc,, +hamcrest/core/core/__pycache__/raises.cpython-37.pyc,, +hamcrest/core/core/__pycache__/is_.cpython-37.pyc,, +hamcrest/core/core/__pycache__/isanything.cpython-37.pyc,, +hamcrest/core/core/__pycache__/isnone.cpython-37.pyc,, +hamcrest/core/core/__pycache__/isnot.cpython-37.pyc,, +hamcrest/core/core/__pycache__/anyof.cpython-37.pyc,, +hamcrest/core/core/__pycache__/allof.cpython-37.pyc,, +hamcrest/core/core/__pycache__/__init__.cpython-37.pyc,, +hamcrest/core/core/__pycache__/described_as.cpython-37.pyc,, +hamcrest/core/core/__pycache__/isequal.cpython-37.pyc,, +hamcrest/core/__pycache__/string_description.cpython-37.pyc,, +hamcrest/core/__pycache__/base_matcher.cpython-37.pyc,, +hamcrest/core/__pycache__/compat.cpython-37.pyc,, +hamcrest/core/__pycache__/assert_that.cpython-37.pyc,, +hamcrest/core/__pycache__/selfdescribing.cpython-37.pyc,, +hamcrest/core/__pycache__/selfdescribingvalue.cpython-37.pyc,, +hamcrest/core/__pycache__/matcher.cpython-37.pyc,, +hamcrest/core/__pycache__/base_description.cpython-37.pyc,, +hamcrest/core/__pycache__/description.cpython-37.pyc,, +hamcrest/core/__pycache__/__init__.cpython-37.pyc,, +hamcrest/core/helpers/__pycache__/hasmethod.cpython-37.pyc,, +hamcrest/core/helpers/__pycache__/wrap_matcher.cpython-37.pyc,, +hamcrest/core/helpers/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/issequence_containinginanyorder.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/issequence_containing.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/issequence_containinginorder.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/isdict_containingentries.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/isdict_containing.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/isdict_containingkey.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/is_empty.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/issequence_onlycontaining.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/isin.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/isdict_containingvalue.cpython-37.pyc,, +hamcrest/library/collection/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/integration/__pycache__/match_equality.cpython-37.pyc,, +hamcrest/library/integration/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/number/__pycache__/ordering_comparison.cpython-37.pyc,, +hamcrest/library/number/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/number/__pycache__/iscloseto.cpython-37.pyc,, +hamcrest/library/object/__pycache__/hasstring.cpython-37.pyc,, +hamcrest/library/object/__pycache__/haslength.cpython-37.pyc,, +hamcrest/library/object/__pycache__/hasproperty.cpython-37.pyc,, +hamcrest/library/object/__pycache__/__init__.cpython-37.pyc,, +hamcrest/library/text/__pycache__/stringendswith.cpython-37.pyc,, +hamcrest/library/text/__pycache__/stringmatches.cpython-37.pyc,, +hamcrest/library/text/__pycache__/stringstartswith.cpython-37.pyc,, +hamcrest/library/text/__pycache__/substringmatcher.cpython-37.pyc,, +hamcrest/library/text/__pycache__/stringcontainsinorder.cpython-37.pyc,, +hamcrest/library/text/__pycache__/isequal_ignoring_whitespace.cpython-37.pyc,, +hamcrest/library/text/__pycache__/stringcontains.cpython-37.pyc,, +hamcrest/library/text/__pycache__/isequal_ignoring_case.cpython-37.pyc,, +hamcrest/library/text/__pycache__/__init__.cpython-37.pyc,, +hamcrest/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/WHEEL b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/WHEEL new file mode 100644 index 0000000..9dff69d --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/metadata.json b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/metadata.json new file mode 100644 index 0000000..9fffe4b --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyHamcrest-1.9.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "New BSD", "download_url": "http://pypi.python.org/packages/source/P/PyHamcrest/PyHamcrest-1.9.0.tar.gz", "name": "PyHamcrest", "provides": "hamcrest", "test_requires": [{"requires": ["hypothesis (>=1.11)", "pytest (>=2.8)", "mock", "pytest-cov"]}], "extensions": {"python.details": {"project_urls": {"Home": "https://github.com/hamcrest/PyHamcrest"}, "contacts": [{"name": "Chris Rose", "role": "author", "email": "offline@offby1.net"}], "document_names": {"description": "DESCRIPTION.rst"}}}, "run_requires": [{"requires": ["setuptools", "six"]}], "generator": "bdist_wheel (0.24.0)", "summary": "Hamcrest framework for matcher objects", "extras": [], "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing"], "version": "1.9.0", "metadata_version": "2.0", "keywords": ["hamcrest", "matchers", "pyunit", "unit", "test", "testing", "unittest", "unittesting"], "platform": "All"} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/RECORD new file mode 100644 index 0000000..99c3c0b --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/RECORD @@ -0,0 +1,35 @@ +jwt/__init__.py,sha256=zzpUkNjnVRNWZKLBgn-t3fR3IWVdCWekrAKtsZWkCoQ,810 +jwt/__main__.py,sha256=_rMsGakpyw1N023P8QOjCgbCxhXSCNIg92YpmUhQGMk,4162 +jwt/algorithms.py,sha256=kL1ARjxNL8JeuxEpWS8On14qJWomMX_A_ncIrnZhBrA,13336 +jwt/api_jws.py,sha256=wQxbg_cYR4hAJl4-9Ijf29B46NrOKhruXS7ANPFqkZ8,8095 +jwt/api_jwt.py,sha256=NKRiCsTcMd0B5N-74zvqBYpQuxBxC4f6TCLM6P0jxVU,7905 +jwt/compat.py,sha256=VG2zhmZFQ5spP0AThSVumRogymUXORz6fxA1jTew-cA,1624 +jwt/exceptions.py,sha256=kGq96NMkyPBmx7-RXvLXq9ddTo2_SJPKPTpPscvGUuA,986 +jwt/help.py,sha256=w9sYBatZK8-DIAxLPsdxQBVHXnqjOTETJ4dFY5hhEHs,1609 +jwt/utils.py,sha256=RraFiloy_xsB8NA1CrlHxS9lR73If8amInQ3P1mKXeM,2629 +jwt/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jwt/contrib/algorithms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jwt/contrib/algorithms/py_ecdsa.py,sha256=tSTUrwx-u14DJcqAChRzJG-wf7bEY2Gv2hI5xSZZNjk,1771 +jwt/contrib/algorithms/pycrypto.py,sha256=mU3vRfk9QKj06ky3XXKXNkxv8-R4mBHbFR3EvbOgJ6k,1249 +PyJWT-1.7.1.dist-info/AUTHORS,sha256=rahh5ZJ3f4RSF4X1_K1DvxTRm4Hy45QiMP7dDG_-yrE,595 +PyJWT-1.7.1.dist-info/LICENSE,sha256=7IKvgVtfnahoWvswDMW-t5SeHCK3m2wcBUeWzv32ysY,1080 +PyJWT-1.7.1.dist-info/METADATA,sha256=wIohFuzbkeGUiMkkD5U98z520aUoY6UnmsfDl4vVHRI,3878 +PyJWT-1.7.1.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 +PyJWT-1.7.1.dist-info/entry_points.txt,sha256=Xl_tLkGbTgywYa7PwaEY2xSiCtVtM2PdHTL4CW_n9dM,45 +PyJWT-1.7.1.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4 +PyJWT-1.7.1.dist-info/RECORD,, +../../../bin/pyjwt,sha256=_ql8FxEP66OfxPNUZ3I2dUPYQkrWDYSMH2EWsj-symU,265 +PyJWT-1.7.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jwt/__pycache__/help.cpython-37.pyc,, +jwt/__pycache__/exceptions.cpython-37.pyc,, +jwt/__pycache__/algorithms.cpython-37.pyc,, +jwt/__pycache__/compat.cpython-37.pyc,, +jwt/__pycache__/__main__.cpython-37.pyc,, +jwt/__pycache__/utils.cpython-37.pyc,, +jwt/__pycache__/api_jwt.cpython-37.pyc,, +jwt/__pycache__/__init__.cpython-37.pyc,, +jwt/__pycache__/api_jws.cpython-37.pyc,, +jwt/contrib/algorithms/__pycache__/py_ecdsa.cpython-37.pyc,, +jwt/contrib/algorithms/__pycache__/pycrypto.cpython-37.pyc,, +jwt/contrib/algorithms/__pycache__/__init__.cpython-37.pyc,, +jwt/contrib/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/WHEEL b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/WHEEL new file mode 100644 index 0000000..c4bde30 --- /dev/null +++ b/venv/lib/python3.7/site-packages/PyJWT-1.7.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.3) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/PKG-INFO b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/PKG-INFO new file mode 100644 index 0000000..bbca08d --- /dev/null +++ b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/PKG-INFO @@ -0,0 +1,135 @@ +Metadata-Version: 2.1 +Name: Twisted +Version: 19.10.0 +Summary: An asynchronous networking framework written in Python +Home-page: https://twistedmatrix.com/ +Author: Twisted Matrix Laboratories +Author-email: twisted-python@twistedmatrix.com +Maintainer: Glyph Lefkowitz +Maintainer-email: glyph@twistedmatrix.com +License: MIT +Project-URL: Documentation, https://twistedmatrix.com/documents/current/ +Project-URL: Source, https://github.com/twisted/twisted +Project-URL: Issues, https://twistedmatrix.com/trac/report +Description: Twisted + ======= + + |pypi|_ + |travis|_ + |circleci|_ + + For information on changes in this release, see the `NEWS `_ file. + + + What is this? + ------------- + + Twisted is an event-based framework for internet applications, supporting Python 2.7 and Python 3.5+. + It includes modules for many different purposes, including the following: + + - ``twisted.web``: HTTP clients and servers, HTML templating, and a WSGI server + - ``twisted.conch``: SSHv2 and Telnet clients and servers and terminal emulators + - ``twisted.words``: Clients and servers for IRC, XMPP, and other IM protocols + - ``twisted.mail``: IMAPv4, POP3, SMTP clients and servers + - ``twisted.positioning``: Tools for communicating with NMEA-compatible GPS receivers + - ``twisted.names``: DNS client and tools for making your own DNS servers + - ``twisted.trial``: A unit testing framework that integrates well with Twisted-based code. + + Twisted supports all major system event loops -- ``select`` (all platforms), ``poll`` (most POSIX platforms), ``epoll`` (Linux), ``kqueue`` (FreeBSD, macOS), IOCP (Windows), and various GUI event loops (GTK+2/3, Qt, wxWidgets). + Third-party reactors can plug into Twisted, and provide support for additional event loops. + + + Installing + ---------- + + To install the latest version of Twisted using pip:: + + $ pip install twisted + + Additional instructions for installing this software are in `the installation instructions `_. + + + Documentation and Support + ------------------------- + + Twisted's documentation is available from the `Twisted Matrix website `_. + This documentation contains how-tos, code examples, and an API reference. + + Help is also available on the `Twisted mailing list `_. + + There is also a pair of very lively IRC channels, ``#twisted`` (for general Twisted questions) and ``#twisted.web`` (for Twisted Web), on ``chat.freenode.net``. + + + Unit Tests + ---------- + + Twisted has a comprehensive test suite, which can be run by ``tox``:: + + $ tox -l # to view all test environments + $ tox -e py27-tests # to run the tests for Python 2.7 + $ tox -e py35-tests # to run the tests for Python 3.5 + + + You can test running the test suite under the different reactors with the ``TWISTED_REACTOR`` environment variable:: + + $ env TWISTED_REACTOR=epoll tox -e py27-tests + + + Some of these tests may fail if you: + + * don't have the dependencies required for a particular subsystem installed, + * have a firewall blocking some ports (or things like Multicast, which Linux NAT has shown itself to do), or + * run them as root. + + + Copyright + --------- + + All of the code in this distribution is Copyright (c) 2001-2019 Twisted Matrix Laboratories. + + Twisted is made available under the MIT license. + The included `LICENSE `_ file describes this in detail. + + + Warranty + -------- + + THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE USE OF THIS SOFTWARE IS WITH YOU. + + IN NO EVENT WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY + AND/OR REDISTRIBUTE THE LIBRARY, BE LIABLE TO YOU FOR ANY DAMAGES, EVEN IF + SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + Again, see the included `LICENSE `_ file for specific legal details. + + + .. |pypi| image:: http://img.shields.io/pypi/v/twisted.svg + .. _pypi: https://pypi.python.org/pypi/twisted + + .. |travis| image:: https://travis-ci.org/twisted/twisted.svg?branch=trunk + .. _travis: https://travis-ci.org/twisted/twisted + + .. |circleci| image:: https://circleci.com/gh/twisted/twisted.svg?style=svg + .. _circleci: https://circleci.com/gh/twisted/twisted + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Description-Content-Type: text/x-rst +Provides-Extra: soap +Provides-Extra: conch +Provides-Extra: windows_platform +Provides-Extra: tls +Provides-Extra: dev +Provides-Extra: all_non_platform +Provides-Extra: macos_platform +Provides-Extra: serial +Provides-Extra: osx_platform +Provides-Extra: http2 diff --git a/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/SOURCES.txt b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/SOURCES.txt new file mode 100644 index 0000000..130a2fc --- /dev/null +++ b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/SOURCES.txt @@ -0,0 +1,1479 @@ +.coveragerc +CONTRIBUTING +INSTALL.rst +LICENSE +MANIFEST.in +NEWS.rst +README.rst +code_of_conduct.md +setup.cfg +setup.py +tox.ini +docs/Makefile +docs/conf.py +docs/index.rst +docs/make.bat +docs/stylesheet.css +docs/_extensions/apilinks.py +docs/_extensions/traclinks.py +docs/_static/.placeholder +docs/_templates/.placeholder +docs/_themes/twisteddefault/theme.conf +docs/_themes/twistedtrac/layout.html +docs/_themes/twistedtrac/theme.conf +docs/_themes/twistedtrac/static/ctxt_grad.png +docs/_themes/twistedtrac/static/extlink.gif +docs/_themes/twistedtrac/static/footer_grad.png +docs/_themes/twistedtrac/static/main_grad.png +docs/_themes/twistedtrac/static/menu_grad.png +docs/_themes/twistedtrac/static/tab.png +docs/_themes/twistedtrac/static/top_grad.png +docs/_themes/twistedtrac/static/trac_banner.png +docs/_themes/twistedtrac/static/twisted-icon.ico +docs/_themes/twistedtrac/static/twistedtrac.css +docs/_themes/twistedtrac/static/css/trac.css +docs/_themes/twistedtrac/static/css/wiki.css +docs/conch/index.rst +docs/conch/benchmarks/README +docs/conch/benchmarks/buffering_mixin.py +docs/conch/examples/demo.tac +docs/conch/examples/demo_draw.tac +docs/conch/examples/demo_insults.tac +docs/conch/examples/demo_manhole.tac +docs/conch/examples/demo_recvline.tac +docs/conch/examples/demo_scroll.tac +docs/conch/examples/index.rst +docs/conch/examples/sshsimpleclient.py +docs/conch/examples/sshsimpleserver.py +docs/conch/examples/telnet_echo.tac +docs/conch/examples/window.tac +docs/conch/howto/conch_client.rst +docs/conch/howto/index.rst +docs/conch/howto/listings/echoclient_shared_ssh.py +docs/conch/howto/listings/echoclient_ssh.py +docs/conch/man/cftp.1 +docs/conch/man/ckeygen.1 +docs/conch/man/conch.1 +docs/conch/man/tkconch.1 +docs/core/index.rst +docs/core/benchmarks/banana.py +docs/core/benchmarks/deferreds.py +docs/core/benchmarks/failure.py +docs/core/benchmarks/linereceiver.py +docs/core/benchmarks/netstringreceiver.py +docs/core/benchmarks/task.py +docs/core/benchmarks/timer.py +docs/core/benchmarks/tpclient.py +docs/core/benchmarks/tpclient_nt.py +docs/core/benchmarks/tpserver.py +docs/core/benchmarks/tpserver_nt.py +docs/core/development/index.rst +docs/core/development/naming.rst +docs/core/development/philosophy.rst +docs/core/development/security.rst +docs/core/development/listings/new_module_template.py +docs/core/development/policy/code-dev.rst +docs/core/development/policy/coding-standard.rst +docs/core/development/policy/compatibility-policy.rst +docs/core/development/policy/index.rst +docs/core/development/policy/release-process.rst +docs/core/development/policy/test-standard.rst +docs/core/development/policy/writing-standard.rst +docs/core/examples/ampclient.py +docs/core/examples/ampserver.py +docs/core/examples/bananabench.py +docs/core/examples/chatserver.py +docs/core/examples/courier.py +docs/core/examples/cred.py +docs/core/examples/dbcred.py +docs/core/examples/echoclient.py +docs/core/examples/echoclient_ssl.py +docs/core/examples/echoclient_udp.py +docs/core/examples/echoserv.py +docs/core/examples/echoserv_ssl.py +docs/core/examples/echoserv_udp.py +docs/core/examples/filewatch.py +docs/core/examples/ftpclient.py +docs/core/examples/ftpserver.py +docs/core/examples/index.rst +docs/core/examples/longex.py +docs/core/examples/longex2.py +docs/core/examples/pb_exceptions.py +docs/core/examples/pbbenchclient.py +docs/core/examples/pbbenchserver.py +docs/core/examples/pbecho.py +docs/core/examples/pbechoclient.py +docs/core/examples/pbgtk2.py +docs/core/examples/pbgtk2login.glade +docs/core/examples/pbinterop.py +docs/core/examples/pbsimple.py +docs/core/examples/pbsimpleclient.py +docs/core/examples/postfix.py +docs/core/examples/ptyserv.py +docs/core/examples/public.pem +docs/core/examples/pyui_bg.png +docs/core/examples/pyuidemo.py +docs/core/examples/recvfd.py +docs/core/examples/rotatinglog.py +docs/core/examples/sendfd.py +docs/core/examples/server.pem +docs/core/examples/shaper.py +docs/core/examples/shoutcast.py +docs/core/examples/simple.tac +docs/core/examples/simpleclient.py +docs/core/examples/simpleserv.py +docs/core/examples/ssl_clientauth_client.py +docs/core/examples/ssl_clientauth_server.py +docs/core/examples/starttls_client.py +docs/core/examples/starttls_server.py +docs/core/examples/stdin.py +docs/core/examples/stdiodemo.py +docs/core/examples/streaming.py +docs/core/examples/testlogging.py +docs/core/examples/tkinterdemo.py +docs/core/examples/tls_alpn_npn_client.py +docs/core/examples/tls_alpn_npn_server.py +docs/core/examples/twistd-logging.tac +docs/core/examples/udpbroadcast.py +docs/core/examples/wxacceptance.py +docs/core/examples/wxdemo.py +docs/core/examples/threadedselect/README +docs/core/examples/threadedselect/blockingdemo.py +docs/core/examples/threadedselect/pygamedemo.py +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/README.txt +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/Twistzilla.py +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/setup.py +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/English.lproj/MainMenu.nib/classes.nib +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/English.lproj/MainMenu.nib/info.nib +docs/core/examples/threadedselect/Cocoa/SimpleWebClient/English.lproj/MainMenu.nib/keyedobjects.nib +docs/core/howto/amp.rst +docs/core/howto/application.rst +docs/core/howto/basics.rst +docs/core/howto/choosing-reactor.rst +docs/core/howto/clients.rst +docs/core/howto/components.rst +docs/core/howto/constants.rst +docs/core/howto/cred.rst +docs/core/howto/debug-with-emacs.rst +docs/core/howto/defer-intro.rst +docs/core/howto/defer.rst +docs/core/howto/design.rst +docs/core/howto/dirdbm.rst +docs/core/howto/endpoints.rst +docs/core/howto/gendefer.rst +docs/core/howto/glossary.rst +docs/core/howto/howto.tidyrc +docs/core/howto/index.rst +docs/core/howto/internet-overview.rst +docs/core/howto/logger.rst +docs/core/howto/logging.rst +docs/core/howto/options.rst +docs/core/howto/pb-clients.rst +docs/core/howto/pb-copyable.rst +docs/core/howto/pb-cred.rst +docs/core/howto/pb-intro.rst +docs/core/howto/pb-limits.rst +docs/core/howto/pb-usage.rst +docs/core/howto/pb.rst +docs/core/howto/plugin.rst +docs/core/howto/positioning.rst +docs/core/howto/process.rst +docs/core/howto/producers.rst +docs/core/howto/python3.rst +docs/core/howto/quotes.rst +docs/core/howto/rdbms.rst +docs/core/howto/reactor-basics.rst +docs/core/howto/sendmsg.rst +docs/core/howto/servers.rst +docs/core/howto/ssl.rst +docs/core/howto/stylesheet-unprocessed.css +docs/core/howto/stylesheet.css +docs/core/howto/systemd.rst +docs/core/howto/tap.rst +docs/core/howto/template.tpl +docs/core/howto/testing.rst +docs/core/howto/threading.rst +docs/core/howto/time.rst +docs/core/howto/trial.rst +docs/core/howto/udp.rst +docs/core/howto/vision.rst +docs/core/howto/listings/TwistedQuotes/__init__.py +docs/core/howto/listings/TwistedQuotes/pbquote.py +docs/core/howto/listings/TwistedQuotes/pbquoteclient.py +docs/core/howto/listings/TwistedQuotes/quoteproto.py +docs/core/howto/listings/TwistedQuotes/quoters.py +docs/core/howto/listings/TwistedQuotes/quotes.txt +docs/core/howto/listings/TwistedQuotes/quotetap.py +docs/core/howto/listings/TwistedQuotes/quotetap2.py +docs/core/howto/listings/TwistedQuotes/webquote.rpy +docs/core/howto/listings/amp/basic_client.py +docs/core/howto/listings/amp/basic_server.tac +docs/core/howto/listings/amp/command_client.py +docs/core/howto/listings/application/service.tac +docs/core/howto/listings/cred/pop3_server.py +docs/core/howto/listings/deferred/synch-validation.py +docs/core/howto/listings/logger/ad_hoc.py +docs/core/howto/listings/logger/ad_hoc_save.py +docs/core/howto/listings/logger/analyze.py +docs/core/howto/listings/logger/loader-math.py +docs/core/howto/listings/logger/loader.py +docs/core/howto/listings/logger/logsource.py +docs/core/howto/listings/logger/offline_analyze.py +docs/core/howto/listings/logger/online_analyze.py +docs/core/howto/listings/logger/saver.py +docs/core/howto/listings/pb/cache_classes.py +docs/core/howto/listings/pb/cache_receiver.py +docs/core/howto/listings/pb/cache_sender.py +docs/core/howto/listings/pb/chatclient.py +docs/core/howto/listings/pb/chatserver.py +docs/core/howto/listings/pb/copy2_classes.py +docs/core/howto/listings/pb/copy2_receiver.py +docs/core/howto/listings/pb/copy2_sender.py +docs/core/howto/listings/pb/copy_receiver.tac +docs/core/howto/listings/pb/copy_sender.py +docs/core/howto/listings/pb/exc_client.py +docs/core/howto/listings/pb/exc_server.py +docs/core/howto/listings/pb/pb1client.py +docs/core/howto/listings/pb/pb1server.py +docs/core/howto/listings/pb/pb2client.py +docs/core/howto/listings/pb/pb2server.py +docs/core/howto/listings/pb/pb3client.py +docs/core/howto/listings/pb/pb3server.py +docs/core/howto/listings/pb/pb4client.py +docs/core/howto/listings/pb/pb5client.py +docs/core/howto/listings/pb/pb5server.py +docs/core/howto/listings/pb/pb6client1.py +docs/core/howto/listings/pb/pb6client2.py +docs/core/howto/listings/pb/pb6server.py +docs/core/howto/listings/pb/pb7client.py +docs/core/howto/listings/pb/pbAnonClient.py +docs/core/howto/listings/pb/pbAnonServer.py +docs/core/howto/listings/pb/trap_client.py +docs/core/howto/listings/pb/trap_server.py +docs/core/howto/listings/positioning/nmealogger.py +docs/core/howto/listings/process/process.py +docs/core/howto/listings/process/quotes.py +docs/core/howto/listings/process/trueandfalse.py +docs/core/howto/listings/sendmsg/copy_descriptor.py +docs/core/howto/listings/sendmsg/send_replacement.py +docs/core/howto/listings/servers/chat.py +docs/core/howto/listings/ssl/check_echo_certificate.py +docs/core/howto/listings/ssl/check_server_certificate.py +docs/core/howto/listings/systemd/www.example.com.socket +docs/core/howto/listings/systemd/www.example.com.socketactivated.service +docs/core/howto/listings/systemd/www.example.com.static.service +docs/core/howto/listings/trial/calculus/__init__.py +docs/core/howto/listings/trial/calculus/base_1.py +docs/core/howto/listings/trial/calculus/base_2.py +docs/core/howto/listings/trial/calculus/base_3.py +docs/core/howto/listings/trial/calculus/client_1.py +docs/core/howto/listings/trial/calculus/client_2.py +docs/core/howto/listings/trial/calculus/client_3.py +docs/core/howto/listings/trial/calculus/remote_1.py +docs/core/howto/listings/trial/calculus/remote_2.py +docs/core/howto/listings/trial/calculus/test/__init__.py +docs/core/howto/listings/trial/calculus/test/test_base_1.py +docs/core/howto/listings/trial/calculus/test/test_base_2.py +docs/core/howto/listings/trial/calculus/test/test_base_2b.py +docs/core/howto/listings/trial/calculus/test/test_base_3.py +docs/core/howto/listings/trial/calculus/test/test_client_1.py +docs/core/howto/listings/trial/calculus/test/test_client_2.py +docs/core/howto/listings/trial/calculus/test/test_client_3.py +docs/core/howto/listings/trial/calculus/test/test_client_4.py +docs/core/howto/listings/trial/calculus/test/test_remote_1.py +docs/core/howto/listings/trial/calculus/test/test_remote_2.py +docs/core/howto/listings/trial/calculus/test/test_remote_3.py +docs/core/howto/listings/udp/MulticastClient.py +docs/core/howto/listings/udp/MulticastServer.py +docs/core/howto/listings/udp/adopt_datagram_port.py +docs/core/howto/listings/udp/basic_example.py +docs/core/howto/listings/udp/connected_udp.py +docs/core/howto/listings/udp/getting_ip.py +docs/core/howto/listings/udp/ipv6_listen.py +docs/core/howto/tutorial/backends.rst +docs/core/howto/tutorial/client.rst +docs/core/howto/tutorial/components.rst +docs/core/howto/tutorial/configuration.rst +docs/core/howto/tutorial/factory.rst +docs/core/howto/tutorial/index.rst +docs/core/howto/tutorial/intro.rst +docs/core/howto/tutorial/library.rst +docs/core/howto/tutorial/pb.rst +docs/core/howto/tutorial/protocol.rst +docs/core/howto/tutorial/style.rst +docs/core/howto/tutorial/web.rst +docs/core/howto/tutorial/listings/finger/etc.users +docs/core/howto/tutorial/listings/finger/finger01.py +docs/core/howto/tutorial/listings/finger/finger02.py +docs/core/howto/tutorial/listings/finger/finger03.py +docs/core/howto/tutorial/listings/finger/finger04.py +docs/core/howto/tutorial/listings/finger/finger05.py +docs/core/howto/tutorial/listings/finger/finger06.py +docs/core/howto/tutorial/listings/finger/finger07.py +docs/core/howto/tutorial/listings/finger/finger08.py +docs/core/howto/tutorial/listings/finger/finger09.py +docs/core/howto/tutorial/listings/finger/finger10.py +docs/core/howto/tutorial/listings/finger/finger11.tac +docs/core/howto/tutorial/listings/finger/finger12.tac +docs/core/howto/tutorial/listings/finger/finger13.tac +docs/core/howto/tutorial/listings/finger/finger14.tac +docs/core/howto/tutorial/listings/finger/finger15.tac +docs/core/howto/tutorial/listings/finger/finger16.tac +docs/core/howto/tutorial/listings/finger/finger17.tac +docs/core/howto/tutorial/listings/finger/finger18.tac +docs/core/howto/tutorial/listings/finger/finger19.tac +docs/core/howto/tutorial/listings/finger/finger19a.tac +docs/core/howto/tutorial/listings/finger/finger19a_changes.py +docs/core/howto/tutorial/listings/finger/finger19b.tac +docs/core/howto/tutorial/listings/finger/finger19b_changes.py +docs/core/howto/tutorial/listings/finger/finger19c.tac +docs/core/howto/tutorial/listings/finger/finger19c_changes.py +docs/core/howto/tutorial/listings/finger/finger20.tac +docs/core/howto/tutorial/listings/finger/finger21.tac +docs/core/howto/tutorial/listings/finger/finger22.py +docs/core/howto/tutorial/listings/finger/fingerPBclient.py +docs/core/howto/tutorial/listings/finger/fingerXRclient.py +docs/core/howto/tutorial/listings/finger/finger_config.py +docs/core/howto/tutorial/listings/finger/fingerproxy.tac +docs/core/howto/tutorial/listings/finger/organized-finger.tac +docs/core/howto/tutorial/listings/finger/simple-finger.tac +docs/core/howto/tutorial/listings/finger/finger/__init__.py +docs/core/howto/tutorial/listings/finger/finger/finger.py +docs/core/howto/tutorial/listings/finger/finger/tap.py +docs/core/howto/tutorial/listings/finger/twisted/plugins/finger_tutorial.py +docs/core/img/TwistedLogo.bmp +docs/core/img/cred-login.dia +docs/core/img/cred-login.png +docs/core/img/deferred-attach.dia +docs/core/img/deferred-attach.png +docs/core/img/deferred-process.dia +docs/core/img/deferred-process.png +docs/core/img/deferred-states.svg +docs/core/img/deferred.dia +docs/core/img/deferred.png +docs/core/man/pyhtmlizer.1 +docs/core/man/trial.1 +docs/core/man/twistd.1 +docs/core/specifications/banana.rst +docs/core/specifications/index.rst +docs/fun/Twisted.Quotes +docs/fun/lightbulb +docs/fun/register.html +docs/historic/NEWS.rst +docs/historic/index.rst +docs/historic/ipc10errata.html +docs/historic/ipc10paper.html +docs/historic/stylesheet.css +docs/historic/template-notoc.tpl +docs/historic/template.tpl +docs/historic/twisted-debian.html +docs/historic/2002/ipc10/twisted-network-framework/errata.html +docs/historic/2002/ipc10/twisted-network-framework/index.html +docs/historic/2004/ibm/talk.html +docs/historic/Quotes/README.First +docs/historic/Quotes/Twisted-1.0 +docs/historic/Quotes/Twisted-1.1 +docs/historic/Quotes/Twisted-1.2 +docs/historic/Quotes/Twisted-1.3 +docs/historic/Quotes/Twisted-10.0 +docs/historic/Quotes/Twisted-10.1 +docs/historic/Quotes/Twisted-10.2 +docs/historic/Quotes/Twisted-11.0 +docs/historic/Quotes/Twisted-11.1 +docs/historic/Quotes/Twisted-12.0 +docs/historic/Quotes/Twisted-12.1 +docs/historic/Quotes/Twisted-12.2 +docs/historic/Quotes/Twisted-12.3 +docs/historic/Quotes/Twisted-13.0 +docs/historic/Quotes/Twisted-13.1 +docs/historic/Quotes/Twisted-13.2 +docs/historic/Quotes/Twisted-14.0 +docs/historic/Quotes/Twisted-15.0 +docs/historic/Quotes/Twisted-15.1 +docs/historic/Quotes/Twisted-15.2 +docs/historic/Quotes/Twisted-15.3 +docs/historic/Quotes/Twisted-15.4 +docs/historic/Quotes/Twisted-15.5 +docs/historic/Quotes/Twisted-16.0 +docs/historic/Quotes/Twisted-16.1 +docs/historic/Quotes/Twisted-16.2 +docs/historic/Quotes/Twisted-16.3 +docs/historic/Quotes/Twisted-16.4 +docs/historic/Quotes/Twisted-16.5 +docs/historic/Quotes/Twisted-16.6 +docs/historic/Quotes/Twisted-17.1 +docs/historic/Quotes/Twisted-17.5 +docs/historic/Quotes/Twisted-17.9 +docs/historic/Quotes/Twisted-2.0 +docs/historic/Quotes/Twisted-2.1 +docs/historic/Quotes/Twisted-2.2 +docs/historic/Quotes/Twisted-2.3 +docs/historic/Quotes/Twisted-2.5 +docs/historic/Quotes/Twisted-8.0 +docs/historic/Quotes/Twisted-8.1 +docs/historic/Quotes/Twisted-8.2 +docs/historic/Quotes/Twisted-9.0 +docs/installation/index.rst +docs/installation/howto/optional.rst +docs/mail/index.rst +docs/mail/examples/emailserver.tac +docs/mail/examples/imap4client.py +docs/mail/examples/index.rst +docs/mail/examples/sendmail_gmail.py +docs/mail/examples/sendmail_message.py +docs/mail/examples/sendmail_smtp.py +docs/mail/examples/smtpclient_simple.py +docs/mail/examples/smtpclient_tls.py +docs/mail/howto/index.rst +docs/mail/howto/sending-mail.rst +docs/mail/man/mailmail.1 +docs/mail/tutorial/smtpclient/smtpclient-1.tac +docs/mail/tutorial/smtpclient/smtpclient-10.tac +docs/mail/tutorial/smtpclient/smtpclient-11.tac +docs/mail/tutorial/smtpclient/smtpclient-2.tac +docs/mail/tutorial/smtpclient/smtpclient-3.tac +docs/mail/tutorial/smtpclient/smtpclient-4.tac +docs/mail/tutorial/smtpclient/smtpclient-5.tac +docs/mail/tutorial/smtpclient/smtpclient-6.tac +docs/mail/tutorial/smtpclient/smtpclient-7.tac +docs/mail/tutorial/smtpclient/smtpclient-8.tac +docs/mail/tutorial/smtpclient/smtpclient-9.tac +docs/mail/tutorial/smtpclient/smtpclient.rst +docs/mail/tutorial/smtpserver/smtpserver-1.tac +docs/mail/tutorial/smtpserver/smtpserver-2.tac +docs/mail/tutorial/smtpserver/smtpserver-3.tac +docs/mail/tutorial/smtpserver/smtpserver-4.tac +docs/mail/tutorial/smtpserver/smtpserver-5.tac +docs/mail/tutorial/smtpserver/smtpserver-6.tac +docs/mail/tutorial/smtpserver/smtpserver-7.tac +docs/mail/tutorial/smtpserver/smtpserver-8.tac +docs/names/index.rst +docs/names/examples/dns-service.py +docs/names/examples/gethostbyname.py +docs/names/examples/index.rst +docs/names/examples/multi_reverse_lookup.py +docs/names/examples/testdns.py +docs/names/howto/client-tour.rst +docs/names/howto/custom-server.rst +docs/names/howto/index.rst +docs/names/howto/names.rst +docs/names/howto/listings/names/example-domain.com +docs/names/howto/listings/names/override_server.py +docs/names/howto/listings/names/reverse_lookup.py +docs/names/howto/listings/names/simple_server.py +docs/pair/index.rst +docs/pair/examples/index.rst +docs/pair/examples/pairudp.py +docs/pair/howto/configuration.rst +docs/pair/howto/index.rst +docs/pair/howto/tunnels.rst +docs/web/index.rst +docs/web/examples/advogato.py +docs/web/examples/dlpage.py +docs/web/examples/fortune.rpy.py +docs/web/examples/getpage.py +docs/web/examples/hello.rpy.py +docs/web/examples/httpclient.py +docs/web/examples/index.rst +docs/web/examples/logging-proxy.py +docs/web/examples/proxy.py +docs/web/examples/report.rpy.py +docs/web/examples/reverse-proxy.py +docs/web/examples/rootscript.py +docs/web/examples/silly-web.py +docs/web/examples/simple.rtl +docs/web/examples/soap.py +docs/web/examples/users.rpy.py +docs/web/examples/web.py +docs/web/examples/webguard.py +docs/web/examples/xmlrpc.py +docs/web/examples/xmlrpcclient.py +docs/web/howto/client.rst +docs/web/howto/glossary.rst +docs/web/howto/index.rst +docs/web/howto/resource-templates.rst +docs/web/howto/twisted-templates.rst +docs/web/howto/using-twistedweb.rst +docs/web/howto/web-development.rst +docs/web/howto/web-overview.rst +docs/web/howto/xmlrpc.rst +docs/web/howto/listings/element_1.py +docs/web/howto/listings/element_2.py +docs/web/howto/listings/element_3.py +docs/web/howto/listings/iteration-1.py +docs/web/howto/listings/iteration-1.xml +docs/web/howto/listings/iteration-output-1.xml +docs/web/howto/listings/output-1.html +docs/web/howto/listings/output-2.html +docs/web/howto/listings/output-3.html +docs/web/howto/listings/quoting-output.html +docs/web/howto/listings/quoting_element.py +docs/web/howto/listings/render_1.py +docs/web/howto/listings/render_2.py +docs/web/howto/listings/render_3.py +docs/web/howto/listings/render_quoting.py +docs/web/howto/listings/render_slots_attrs.py +docs/web/howto/listings/render_transparent.py +docs/web/howto/listings/slots-attributes-1.xml +docs/web/howto/listings/slots-attributes-output.html +docs/web/howto/listings/slots_attributes_1.py +docs/web/howto/listings/soap.rpy +docs/web/howto/listings/subviews-1.py +docs/web/howto/listings/subviews-1.xml +docs/web/howto/listings/subviews-output-1.xml +docs/web/howto/listings/template-1.xml +docs/web/howto/listings/transparent-1.xml +docs/web/howto/listings/transparent-output.html +docs/web/howto/listings/transparent_element.py +docs/web/howto/listings/wait_for_it.py +docs/web/howto/listings/waited-for-it.html +docs/web/howto/listings/waited-for-it.txt +docs/web/howto/listings/webquote.rtl +docs/web/howto/listings/xmlAndSoapQuote.py +docs/web/howto/listings/xmlquote.rpy +docs/web/howto/listings/xmlrpc-customized.py +docs/web/howto/listings/client/bytesprod.py +docs/web/howto/listings/client/cookies.py +docs/web/howto/listings/client/endpointconstructor.py +docs/web/howto/listings/client/filesendbody.py +docs/web/howto/listings/client/gzipdecoder.py +docs/web/howto/listings/client/request.py +docs/web/howto/listings/client/response.py +docs/web/howto/listings/client/responseBody.py +docs/web/howto/listings/client/sendbody.py +docs/web/howto/web-in-60/access-logging.rst +docs/web/howto/web-in-60/asynchronous-deferred.rst +docs/web/howto/web-in-60/asynchronous.rst +docs/web/howto/web-in-60/custom-codes.rst +docs/web/howto/web-in-60/dynamic-content.rst +docs/web/howto/web-in-60/dynamic-dispatch.rst +docs/web/howto/web-in-60/error-handling.rst +docs/web/howto/web-in-60/handling-posts.rst +docs/web/howto/web-in-60/http-auth.rst +docs/web/howto/web-in-60/index.rst +docs/web/howto/web-in-60/interrupted.rst +docs/web/howto/web-in-60/logging-errors.rst +docs/web/howto/web-in-60/other-request-bodies.rst +docs/web/howto/web-in-60/rpy-scripts.rst +docs/web/howto/web-in-60/session-basics.rst +docs/web/howto/web-in-60/session-endings.rst +docs/web/howto/web-in-60/session-store.rst +docs/web/howto/web-in-60/static-content.rst +docs/web/howto/web-in-60/static-dispatch.rst +docs/web/howto/web-in-60/wsgi.rst +docs/web/img/controller.png +docs/web/img/livepage.png +docs/web/img/model.png +docs/web/img/plone_root_model.png +docs/web/img/view.png +docs/web/img/web-overview.dia +docs/web/img/web-overview.png +docs/web/img/web-process.png +docs/web/img/web-process.svg +docs/web/img/web-session.png +docs/web/img/web-widgets.dia +docs/web/img/web-widgets.png +docs/words/index.rst +docs/words/examples/cursesclient.py +docs/words/examples/index.rst +docs/words/examples/ircLogBot.py +docs/words/examples/minchat.py +docs/words/examples/pb_client.py +docs/words/examples/xmpp_client.py +docs/words/howto/im.rst +docs/words/howto/index.rst +docs/words/howto/ircclient.rst +docs/words/howto/ircserverclientcomm.rst +src/Twisted.egg-info/PKG-INFO +src/Twisted.egg-info/SOURCES.txt +src/Twisted.egg-info/dependency_links.txt +src/Twisted.egg-info/entry_points.txt +src/Twisted.egg-info/not-zip-safe +src/Twisted.egg-info/requires.txt +src/Twisted.egg-info/top_level.txt +src/twisted/__init__.py +src/twisted/__main__.py +src/twisted/_version.py +src/twisted/copyright.py +src/twisted/plugin.py +src/twisted/_threads/__init__.py +src/twisted/_threads/_convenience.py +src/twisted/_threads/_ithreads.py +src/twisted/_threads/_memory.py +src/twisted/_threads/_pool.py +src/twisted/_threads/_team.py +src/twisted/_threads/_threadworker.py +src/twisted/_threads/test/__init__.py +src/twisted/_threads/test/test_convenience.py +src/twisted/_threads/test/test_memory.py +src/twisted/_threads/test/test_team.py +src/twisted/_threads/test/test_threadworker.py +src/twisted/application/__init__.py +src/twisted/application/app.py +src/twisted/application/internet.py +src/twisted/application/reactors.py +src/twisted/application/service.py +src/twisted/application/strports.py +src/twisted/application/runner/__init__.py +src/twisted/application/runner/_exit.py +src/twisted/application/runner/_pidfile.py +src/twisted/application/runner/_runner.py +src/twisted/application/runner/test/__init__.py +src/twisted/application/runner/test/test_exit.py +src/twisted/application/runner/test/test_pidfile.py +src/twisted/application/runner/test/test_runner.py +src/twisted/application/test/__init__.py +src/twisted/application/test/test_internet.py +src/twisted/application/test/test_service.py +src/twisted/application/twist/__init__.py +src/twisted/application/twist/_options.py +src/twisted/application/twist/_twist.py +src/twisted/application/twist/test/__init__.py +src/twisted/application/twist/test/test_options.py +src/twisted/application/twist/test/test_twist.py +src/twisted/conch/__init__.py +src/twisted/conch/avatar.py +src/twisted/conch/checkers.py +src/twisted/conch/endpoints.py +src/twisted/conch/error.py +src/twisted/conch/interfaces.py +src/twisted/conch/ls.py +src/twisted/conch/manhole.py +src/twisted/conch/manhole_ssh.py +src/twisted/conch/manhole_tap.py +src/twisted/conch/mixin.py +src/twisted/conch/recvline.py +src/twisted/conch/stdio.py +src/twisted/conch/tap.py +src/twisted/conch/telnet.py +src/twisted/conch/ttymodes.py +src/twisted/conch/unix.py +src/twisted/conch/client/__init__.py +src/twisted/conch/client/agent.py +src/twisted/conch/client/connect.py +src/twisted/conch/client/default.py +src/twisted/conch/client/direct.py +src/twisted/conch/client/knownhosts.py +src/twisted/conch/client/options.py +src/twisted/conch/insults/__init__.py +src/twisted/conch/insults/helper.py +src/twisted/conch/insults/insults.py +src/twisted/conch/insults/text.py +src/twisted/conch/insults/window.py +src/twisted/conch/openssh_compat/__init__.py +src/twisted/conch/openssh_compat/factory.py +src/twisted/conch/openssh_compat/primes.py +src/twisted/conch/scripts/__init__.py +src/twisted/conch/scripts/cftp.py +src/twisted/conch/scripts/ckeygen.py +src/twisted/conch/scripts/conch.py +src/twisted/conch/scripts/tkconch.py +src/twisted/conch/ssh/__init__.py +src/twisted/conch/ssh/_kex.py +src/twisted/conch/ssh/address.py +src/twisted/conch/ssh/agent.py +src/twisted/conch/ssh/channel.py +src/twisted/conch/ssh/common.py +src/twisted/conch/ssh/connection.py +src/twisted/conch/ssh/factory.py +src/twisted/conch/ssh/filetransfer.py +src/twisted/conch/ssh/forwarding.py +src/twisted/conch/ssh/keys.py +src/twisted/conch/ssh/service.py +src/twisted/conch/ssh/session.py +src/twisted/conch/ssh/sexpy.py +src/twisted/conch/ssh/transport.py +src/twisted/conch/ssh/userauth.py +src/twisted/conch/test/__init__.py +src/twisted/conch/test/keydata.py +src/twisted/conch/test/loopback.py +src/twisted/conch/test/test_address.py +src/twisted/conch/test/test_agent.py +src/twisted/conch/test/test_cftp.py +src/twisted/conch/test/test_channel.py +src/twisted/conch/test/test_checkers.py +src/twisted/conch/test/test_ckeygen.py +src/twisted/conch/test/test_conch.py +src/twisted/conch/test/test_connection.py +src/twisted/conch/test/test_default.py +src/twisted/conch/test/test_endpoints.py +src/twisted/conch/test/test_filetransfer.py +src/twisted/conch/test/test_forwarding.py +src/twisted/conch/test/test_helper.py +src/twisted/conch/test/test_insults.py +src/twisted/conch/test/test_keys.py +src/twisted/conch/test/test_knownhosts.py +src/twisted/conch/test/test_manhole.py +src/twisted/conch/test/test_manhole_tap.py +src/twisted/conch/test/test_mixin.py +src/twisted/conch/test/test_openssh_compat.py +src/twisted/conch/test/test_recvline.py +src/twisted/conch/test/test_scripts.py +src/twisted/conch/test/test_session.py +src/twisted/conch/test/test_ssh.py +src/twisted/conch/test/test_tap.py +src/twisted/conch/test/test_telnet.py +src/twisted/conch/test/test_text.py +src/twisted/conch/test/test_transport.py +src/twisted/conch/test/test_unix.py +src/twisted/conch/test/test_userauth.py +src/twisted/conch/test/test_window.py +src/twisted/conch/ui/__init__.py +src/twisted/conch/ui/ansi.py +src/twisted/conch/ui/tkvt100.py +src/twisted/cred/__init__.py +src/twisted/cred/_digest.py +src/twisted/cred/checkers.py +src/twisted/cred/credentials.py +src/twisted/cred/error.py +src/twisted/cred/portal.py +src/twisted/cred/strcred.py +src/twisted/cred/test/__init__.py +src/twisted/cred/test/test_cramauth.py +src/twisted/cred/test/test_cred.py +src/twisted/cred/test/test_digestauth.py +src/twisted/cred/test/test_simpleauth.py +src/twisted/cred/test/test_strcred.py +src/twisted/enterprise/__init__.py +src/twisted/enterprise/adbapi.py +src/twisted/internet/__init__.py +src/twisted/internet/_baseprocess.py +src/twisted/internet/_dumbwin32proc.py +src/twisted/internet/_glibbase.py +src/twisted/internet/_idna.py +src/twisted/internet/_newtls.py +src/twisted/internet/_pollingfile.py +src/twisted/internet/_posixserialport.py +src/twisted/internet/_posixstdio.py +src/twisted/internet/_producer_helpers.py +src/twisted/internet/_resolver.py +src/twisted/internet/_signals.py +src/twisted/internet/_sslverify.py +src/twisted/internet/_threadedselect.py +src/twisted/internet/_win32serialport.py +src/twisted/internet/_win32stdio.py +src/twisted/internet/abstract.py +src/twisted/internet/address.py +src/twisted/internet/asyncioreactor.py +src/twisted/internet/base.py +src/twisted/internet/cfreactor.py +src/twisted/internet/default.py +src/twisted/internet/defer.py +src/twisted/internet/endpoints.py +src/twisted/internet/epollreactor.py +src/twisted/internet/error.py +src/twisted/internet/fdesc.py +src/twisted/internet/gireactor.py +src/twisted/internet/glib2reactor.py +src/twisted/internet/gtk2reactor.py +src/twisted/internet/gtk3reactor.py +src/twisted/internet/inotify.py +src/twisted/internet/interfaces.py +src/twisted/internet/kqreactor.py +src/twisted/internet/main.py +src/twisted/internet/pollreactor.py +src/twisted/internet/posixbase.py +src/twisted/internet/process.py +src/twisted/internet/protocol.py +src/twisted/internet/pyuisupport.py +src/twisted/internet/reactor.py +src/twisted/internet/selectreactor.py +src/twisted/internet/serialport.py +src/twisted/internet/ssl.py +src/twisted/internet/stdio.py +src/twisted/internet/task.py +src/twisted/internet/tcp.py +src/twisted/internet/testing.py +src/twisted/internet/threads.py +src/twisted/internet/tksupport.py +src/twisted/internet/udp.py +src/twisted/internet/unix.py +src/twisted/internet/utils.py +src/twisted/internet/win32eventreactor.py +src/twisted/internet/wxreactor.py +src/twisted/internet/wxsupport.py +src/twisted/internet/iocpreactor/__init__.py +src/twisted/internet/iocpreactor/abstract.py +src/twisted/internet/iocpreactor/build.bat +src/twisted/internet/iocpreactor/const.py +src/twisted/internet/iocpreactor/interfaces.py +src/twisted/internet/iocpreactor/notes.txt +src/twisted/internet/iocpreactor/reactor.py +src/twisted/internet/iocpreactor/setup.py +src/twisted/internet/iocpreactor/tcp.py +src/twisted/internet/iocpreactor/udp.py +src/twisted/internet/iocpreactor/iocpsupport/acceptex.pxi +src/twisted/internet/iocpreactor/iocpsupport/connectex.pxi +src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.c +src/twisted/internet/iocpreactor/iocpsupport/iocpsupport.pyx +src/twisted/internet/iocpreactor/iocpsupport/winsock_pointers.c +src/twisted/internet/iocpreactor/iocpsupport/winsock_pointers.h +src/twisted/internet/iocpreactor/iocpsupport/wsarecv.pxi +src/twisted/internet/iocpreactor/iocpsupport/wsasend.pxi +src/twisted/internet/test/__init__.py +src/twisted/internet/test/_awaittests.py.3only +src/twisted/internet/test/_posixifaces.py +src/twisted/internet/test/_win32ifaces.py +src/twisted/internet/test/_yieldfromtests.py.3only +src/twisted/internet/test/connectionmixins.py +src/twisted/internet/test/fakeendpoint.py +src/twisted/internet/test/modulehelpers.py +src/twisted/internet/test/process_cli.py +src/twisted/internet/test/process_connectionlost.py +src/twisted/internet/test/process_gireactornocompat.py +src/twisted/internet/test/process_helper.py +src/twisted/internet/test/reactormixins.py +src/twisted/internet/test/test_abstract.py +src/twisted/internet/test/test_address.py +src/twisted/internet/test/test_asyncioreactor.py +src/twisted/internet/test/test_base.py +src/twisted/internet/test/test_baseprocess.py +src/twisted/internet/test/test_core.py +src/twisted/internet/test/test_coroutines.py +src/twisted/internet/test/test_default.py +src/twisted/internet/test/test_endpoints.py +src/twisted/internet/test/test_epollreactor.py +src/twisted/internet/test/test_error.py +src/twisted/internet/test/test_fdset.py +src/twisted/internet/test/test_filedescriptor.py +src/twisted/internet/test/test_gireactor.py +src/twisted/internet/test/test_glibbase.py +src/twisted/internet/test/test_inlinecb.py +src/twisted/internet/test/test_inotify.py +src/twisted/internet/test/test_iocp.py +src/twisted/internet/test/test_kqueuereactor.py +src/twisted/internet/test/test_main.py +src/twisted/internet/test/test_newtls.py +src/twisted/internet/test/test_pollingfile.py +src/twisted/internet/test/test_posixbase.py +src/twisted/internet/test/test_posixprocess.py +src/twisted/internet/test/test_process.py +src/twisted/internet/test/test_protocol.py +src/twisted/internet/test/test_resolver.py +src/twisted/internet/test/test_serialport.py +src/twisted/internet/test/test_sigchld.py +src/twisted/internet/test/test_socket.py +src/twisted/internet/test/test_stdio.py +src/twisted/internet/test/test_tcp.py +src/twisted/internet/test/test_testing.py +src/twisted/internet/test/test_threads.py +src/twisted/internet/test/test_time.py +src/twisted/internet/test/test_tls.py +src/twisted/internet/test/test_udp.py +src/twisted/internet/test/test_udp_internals.py +src/twisted/internet/test/test_unix.py +src/twisted/internet/test/test_win32events.py +src/twisted/internet/test/test_win32serialport.py +src/twisted/internet/test/fake_CAs/chain.pem +src/twisted/internet/test/fake_CAs/not-a-certificate +src/twisted/internet/test/fake_CAs/thing1.pem +src/twisted/internet/test/fake_CAs/thing2-duplicate.pem +src/twisted/internet/test/fake_CAs/thing2.pem +src/twisted/logger/__init__.py +src/twisted/logger/_buffer.py +src/twisted/logger/_capture.py +src/twisted/logger/_file.py +src/twisted/logger/_filter.py +src/twisted/logger/_flatten.py +src/twisted/logger/_format.py +src/twisted/logger/_global.py +src/twisted/logger/_io.py +src/twisted/logger/_json.py +src/twisted/logger/_legacy.py +src/twisted/logger/_levels.py +src/twisted/logger/_logger.py +src/twisted/logger/_observer.py +src/twisted/logger/_stdlib.py +src/twisted/logger/_util.py +src/twisted/logger/test/__init__.py +src/twisted/logger/test/test_buffer.py +src/twisted/logger/test/test_capture.py +src/twisted/logger/test/test_file.py +src/twisted/logger/test/test_filter.py +src/twisted/logger/test/test_flatten.py +src/twisted/logger/test/test_format.py +src/twisted/logger/test/test_global.py +src/twisted/logger/test/test_io.py +src/twisted/logger/test/test_json.py +src/twisted/logger/test/test_legacy.py +src/twisted/logger/test/test_levels.py +src/twisted/logger/test/test_logger.py +src/twisted/logger/test/test_observer.py +src/twisted/logger/test/test_stdlib.py +src/twisted/logger/test/test_util.py +src/twisted/mail/__init__.py +src/twisted/mail/_cred.py +src/twisted/mail/_except.py +src/twisted/mail/alias.py +src/twisted/mail/bounce.py +src/twisted/mail/imap4.py +src/twisted/mail/interfaces.py +src/twisted/mail/mail.py +src/twisted/mail/maildir.py +src/twisted/mail/pb.py +src/twisted/mail/pop3.py +src/twisted/mail/pop3client.py +src/twisted/mail/protocols.py +src/twisted/mail/relay.py +src/twisted/mail/relaymanager.py +src/twisted/mail/smtp.py +src/twisted/mail/tap.py +src/twisted/mail/scripts/__init__.py +src/twisted/mail/scripts/mailmail.py +src/twisted/mail/test/__init__.py +src/twisted/mail/test/pop3testserver.py +src/twisted/mail/test/rfc822.message +src/twisted/mail/test/test_bounce.py +src/twisted/mail/test/test_imap.py +src/twisted/mail/test/test_mail.py +src/twisted/mail/test/test_mailmail.py +src/twisted/mail/test/test_options.py +src/twisted/mail/test/test_pop3.py +src/twisted/mail/test/test_pop3client.py +src/twisted/mail/test/test_scripts.py +src/twisted/mail/test/test_smtp.py +src/twisted/names/__init__.py +src/twisted/names/_rfc1982.py +src/twisted/names/authority.py +src/twisted/names/cache.py +src/twisted/names/client.py +src/twisted/names/common.py +src/twisted/names/dns.py +src/twisted/names/error.py +src/twisted/names/hosts.py +src/twisted/names/resolve.py +src/twisted/names/root.py +src/twisted/names/secondary.py +src/twisted/names/server.py +src/twisted/names/srvconnect.py +src/twisted/names/tap.py +src/twisted/names/test/__init__.py +src/twisted/names/test/test_cache.py +src/twisted/names/test/test_client.py +src/twisted/names/test/test_common.py +src/twisted/names/test/test_dns.py +src/twisted/names/test/test_examples.py +src/twisted/names/test/test_hosts.py +src/twisted/names/test/test_names.py +src/twisted/names/test/test_resolve.py +src/twisted/names/test/test_rfc1982.py +src/twisted/names/test/test_rootresolve.py +src/twisted/names/test/test_server.py +src/twisted/names/test/test_srvconnect.py +src/twisted/names/test/test_tap.py +src/twisted/names/test/test_util.py +src/twisted/news/__init__.py +src/twisted/news/database.py +src/twisted/news/news.py +src/twisted/news/nntp.py +src/twisted/news/tap.py +src/twisted/news/test/__init__.py +src/twisted/news/test/test_database.py +src/twisted/news/test/test_news.py +src/twisted/news/test/test_nntp.py +src/twisted/pair/__init__.py +src/twisted/pair/ethernet.py +src/twisted/pair/ip.py +src/twisted/pair/raw.py +src/twisted/pair/rawudp.py +src/twisted/pair/testing.py +src/twisted/pair/tuntap.py +src/twisted/pair/test/__init__.py +src/twisted/pair/test/test_ethernet.py +src/twisted/pair/test/test_ip.py +src/twisted/pair/test/test_rawudp.py +src/twisted/pair/test/test_tuntap.py +src/twisted/persisted/__init__.py +src/twisted/persisted/aot.py +src/twisted/persisted/crefutil.py +src/twisted/persisted/dirdbm.py +src/twisted/persisted/sob.py +src/twisted/persisted/styles.py +src/twisted/persisted/test/__init__.py +src/twisted/persisted/test/test_styles.py +src/twisted/plugins/__init__.py +src/twisted/plugins/cred_anonymous.py +src/twisted/plugins/cred_file.py +src/twisted/plugins/cred_memory.py +src/twisted/plugins/cred_sshkeys.py +src/twisted/plugins/cred_unix.py +src/twisted/plugins/twisted_conch.py +src/twisted/plugins/twisted_core.py +src/twisted/plugins/twisted_ftp.py +src/twisted/plugins/twisted_inet.py +src/twisted/plugins/twisted_mail.py +src/twisted/plugins/twisted_names.py +src/twisted/plugins/twisted_news.py +src/twisted/plugins/twisted_portforward.py +src/twisted/plugins/twisted_reactors.py +src/twisted/plugins/twisted_runner.py +src/twisted/plugins/twisted_socks.py +src/twisted/plugins/twisted_trial.py +src/twisted/plugins/twisted_web.py +src/twisted/plugins/twisted_words.py +src/twisted/positioning/__init__.py +src/twisted/positioning/_sentence.py +src/twisted/positioning/base.py +src/twisted/positioning/ipositioning.py +src/twisted/positioning/nmea.py +src/twisted/positioning/test/__init__.py +src/twisted/positioning/test/receiver.py +src/twisted/positioning/test/test_base.py +src/twisted/positioning/test/test_nmea.py +src/twisted/positioning/test/test_sentence.py +src/twisted/protocols/__init__.py +src/twisted/protocols/amp.py +src/twisted/protocols/basic.py +src/twisted/protocols/dict.py +src/twisted/protocols/finger.py +src/twisted/protocols/ftp.py +src/twisted/protocols/htb.py +src/twisted/protocols/ident.py +src/twisted/protocols/loopback.py +src/twisted/protocols/memcache.py +src/twisted/protocols/pcp.py +src/twisted/protocols/policies.py +src/twisted/protocols/portforward.py +src/twisted/protocols/postfix.py +src/twisted/protocols/shoutcast.py +src/twisted/protocols/sip.py +src/twisted/protocols/socks.py +src/twisted/protocols/stateful.py +src/twisted/protocols/tls.py +src/twisted/protocols/wire.py +src/twisted/protocols/haproxy/__init__.py +src/twisted/protocols/haproxy/_exceptions.py +src/twisted/protocols/haproxy/_info.py +src/twisted/protocols/haproxy/_interfaces.py +src/twisted/protocols/haproxy/_parser.py +src/twisted/protocols/haproxy/_v1parser.py +src/twisted/protocols/haproxy/_v2parser.py +src/twisted/protocols/haproxy/_wrapper.py +src/twisted/protocols/haproxy/test/__init__.py +src/twisted/protocols/haproxy/test/test_parser.py +src/twisted/protocols/haproxy/test/test_v1parser.py +src/twisted/protocols/haproxy/test/test_v2parser.py +src/twisted/protocols/haproxy/test/test_wrapper.py +src/twisted/protocols/test/__init__.py +src/twisted/protocols/test/test_basic.py +src/twisted/protocols/test/test_tls.py +src/twisted/python/__init__.py +src/twisted/python/_appdirs.py +src/twisted/python/_inotify.py +src/twisted/python/_oldstyle.py +src/twisted/python/_pydoctor.py +src/twisted/python/_release.py +src/twisted/python/_sendmsg.c +src/twisted/python/_setup.py +src/twisted/python/_shellcomp.py +src/twisted/python/_textattributes.py +src/twisted/python/_tzhelper.py +src/twisted/python/_url.py +src/twisted/python/compat.py +src/twisted/python/components.py +src/twisted/python/constants.py +src/twisted/python/context.py +src/twisted/python/deprecate.py +src/twisted/python/failure.py +src/twisted/python/fakepwd.py +src/twisted/python/filepath.py +src/twisted/python/finalize.py +src/twisted/python/formmethod.py +src/twisted/python/hook.py +src/twisted/python/htmlizer.py +src/twisted/python/lockfile.py +src/twisted/python/log.py +src/twisted/python/logfile.py +src/twisted/python/modules.py +src/twisted/python/monkey.py +src/twisted/python/procutils.py +src/twisted/python/randbytes.py +src/twisted/python/rebuild.py +src/twisted/python/reflect.py +src/twisted/python/release.py +src/twisted/python/roots.py +src/twisted/python/runtime.py +src/twisted/python/sendmsg.py +src/twisted/python/shortcut.py +src/twisted/python/syslog.py +src/twisted/python/systemd.py +src/twisted/python/text.py +src/twisted/python/threadable.py +src/twisted/python/threadpool.py +src/twisted/python/twisted-completion.zsh +src/twisted/python/url.py +src/twisted/python/urlpath.py +src/twisted/python/usage.py +src/twisted/python/util.py +src/twisted/python/versions.py +src/twisted/python/win32.py +src/twisted/python/zippath.py +src/twisted/python/zipstream.py +src/twisted/python/_pydoctortemplates/common.html +src/twisted/python/_pydoctortemplates/index.html +src/twisted/python/_pydoctortemplates/summary.html +src/twisted/python/test/__init__.py +src/twisted/python/test/_deprecatetests.py.3only +src/twisted/python/test/cmodulepullpipe.py +src/twisted/python/test/deprecatedattributes.py +src/twisted/python/test/modules_helpers.py +src/twisted/python/test/pullpipe.py +src/twisted/python/test/test_appdirs.py +src/twisted/python/test/test_components.py +src/twisted/python/test/test_constants.py +src/twisted/python/test/test_deprecate.py +src/twisted/python/test/test_dist3.py +src/twisted/python/test/test_fakepwd.py +src/twisted/python/test/test_htmlizer.py +src/twisted/python/test/test_inotify.py +src/twisted/python/test/test_pydoctor.py +src/twisted/python/test/test_release.py +src/twisted/python/test/test_runtime.py +src/twisted/python/test/test_sendmsg.py +src/twisted/python/test/test_setup.py +src/twisted/python/test/test_shellcomp.py +src/twisted/python/test/test_syslog.py +src/twisted/python/test/test_systemd.py +src/twisted/python/test/test_textattributes.py +src/twisted/python/test/test_tzhelper.py +src/twisted/python/test/test_url.py +src/twisted/python/test/test_urlpath.py +src/twisted/python/test/test_util.py +src/twisted/python/test/test_versions.py +src/twisted/python/test/test_win32.py +src/twisted/python/test/test_zippath.py +src/twisted/python/test/test_zipstream.py +src/twisted/runner/__init__.py +src/twisted/runner/inetd.py +src/twisted/runner/inetdconf.py +src/twisted/runner/inetdtap.py +src/twisted/runner/procmon.py +src/twisted/runner/procmontap.py +src/twisted/runner/test/__init__.py +src/twisted/runner/test/test_inetdconf.py +src/twisted/runner/test/test_procmon.py +src/twisted/runner/test/test_procmontap.py +src/twisted/scripts/__init__.py +src/twisted/scripts/_twistd_unix.py +src/twisted/scripts/_twistw.py +src/twisted/scripts/htmlizer.py +src/twisted/scripts/trial.py +src/twisted/scripts/twistd.py +src/twisted/scripts/test/__init__.py +src/twisted/scripts/test/test_scripts.py +src/twisted/spread/__init__.py +src/twisted/spread/banana.py +src/twisted/spread/flavors.py +src/twisted/spread/interfaces.py +src/twisted/spread/jelly.py +src/twisted/spread/pb.py +src/twisted/spread/publish.py +src/twisted/spread/util.py +src/twisted/spread/test/__init__.py +src/twisted/spread/test/test_banana.py +src/twisted/spread/test/test_jelly.py +src/twisted/spread/test/test_pb.py +src/twisted/spread/test/test_pbfailure.py +src/twisted/tap/__init__.py +src/twisted/tap/ftp.py +src/twisted/tap/portforward.py +src/twisted/tap/socks.py +src/twisted/test/__init__.py +src/twisted/test/cert.pem.no_trailing_newline +src/twisted/test/crash_test_dummy.py +src/twisted/test/iosim.py +src/twisted/test/key.pem.no_trailing_newline +src/twisted/test/mock_win32process.py +src/twisted/test/myrebuilder1.py +src/twisted/test/myrebuilder2.py +src/twisted/test/plugin_basic.py +src/twisted/test/plugin_extra1.py +src/twisted/test/plugin_extra2.py +src/twisted/test/process_cmdline.py +src/twisted/test/process_echoer.py +src/twisted/test/process_fds.py +src/twisted/test/process_getargv.py +src/twisted/test/process_getenv.py +src/twisted/test/process_linger.py +src/twisted/test/process_reader.py +src/twisted/test/process_signal.py +src/twisted/test/process_stdinreader.py +src/twisted/test/process_tester.py +src/twisted/test/process_tty.py +src/twisted/test/process_twisted.py +src/twisted/test/proto_helpers.py +src/twisted/test/raiser.c +src/twisted/test/raiser.pyx +src/twisted/test/reflect_helper_IE.py +src/twisted/test/reflect_helper_VE.py +src/twisted/test/reflect_helper_ZDE.py +src/twisted/test/server.pem +src/twisted/test/ssl_helpers.py +src/twisted/test/stdio_test_consumer.py +src/twisted/test/stdio_test_halfclose.py +src/twisted/test/stdio_test_hostpeer.py +src/twisted/test/stdio_test_lastwrite.py +src/twisted/test/stdio_test_loseconn.py +src/twisted/test/stdio_test_producer.py +src/twisted/test/stdio_test_write.py +src/twisted/test/stdio_test_writeseq.py +src/twisted/test/test_abstract.py +src/twisted/test/test_adbapi.py +src/twisted/test/test_amp.py +src/twisted/test/test_application.py +src/twisted/test/test_compat.py +src/twisted/test/test_context.py +src/twisted/test/test_cooperator.py +src/twisted/test/test_defer.py +src/twisted/test/test_defer.py.3only +src/twisted/test/test_defgen.py +src/twisted/test/test_dict.py +src/twisted/test/test_dirdbm.py +src/twisted/test/test_error.py +src/twisted/test/test_factories.py +src/twisted/test/test_failure.py +src/twisted/test/test_fdesc.py +src/twisted/test/test_finger.py +src/twisted/test/test_formmethod.py +src/twisted/test/test_ftp.py +src/twisted/test/test_ftp_options.py +src/twisted/test/test_hook.py +src/twisted/test/test_htb.py +src/twisted/test/test_ident.py +src/twisted/test/test_internet.py +src/twisted/test/test_iosim.py +src/twisted/test/test_iutils.py +src/twisted/test/test_lockfile.py +src/twisted/test/test_log.py +src/twisted/test/test_logfile.py +src/twisted/test/test_loopback.py +src/twisted/test/test_main.py +src/twisted/test/test_memcache.py +src/twisted/test/test_modules.py +src/twisted/test/test_monkey.py +src/twisted/test/test_nooldstyle.py +src/twisted/test/test_paths.py +src/twisted/test/test_pcp.py +src/twisted/test/test_persisted.py +src/twisted/test/test_plugin.py +src/twisted/test/test_policies.py +src/twisted/test/test_postfix.py +src/twisted/test/test_process.py +src/twisted/test/test_protocols.py +src/twisted/test/test_randbytes.py +src/twisted/test/test_rebuild.py +src/twisted/test/test_reflect.py +src/twisted/test/test_roots.py +src/twisted/test/test_shortcut.py +src/twisted/test/test_sip.py +src/twisted/test/test_sob.py +src/twisted/test/test_socks.py +src/twisted/test/test_ssl.py +src/twisted/test/test_sslverify.py +src/twisted/test/test_stateful.py +src/twisted/test/test_stdio.py +src/twisted/test/test_strerror.py +src/twisted/test/test_strports.py +src/twisted/test/test_task.py +src/twisted/test/test_tcp.py +src/twisted/test/test_tcp_internals.py +src/twisted/test/test_text.py +src/twisted/test/test_threadable.py +src/twisted/test/test_threadpool.py +src/twisted/test/test_threads.py +src/twisted/test/test_tpfile.py +src/twisted/test/test_twistd.py +src/twisted/test/test_twisted.py +src/twisted/test/test_udp.py +src/twisted/test/test_unix.py +src/twisted/test/test_usage.py +src/twisted/test/testutils.py +src/twisted/trial/__init__.py +src/twisted/trial/__main__.py +src/twisted/trial/_asyncrunner.py +src/twisted/trial/_asynctest.py +src/twisted/trial/_synctest.py +src/twisted/trial/itrial.py +src/twisted/trial/reporter.py +src/twisted/trial/runner.py +src/twisted/trial/unittest.py +src/twisted/trial/util.py +src/twisted/trial/_dist/__init__.py +src/twisted/trial/_dist/distreporter.py +src/twisted/trial/_dist/disttrial.py +src/twisted/trial/_dist/managercommands.py +src/twisted/trial/_dist/options.py +src/twisted/trial/_dist/worker.py +src/twisted/trial/_dist/workercommands.py +src/twisted/trial/_dist/workerreporter.py +src/twisted/trial/_dist/workertrial.py +src/twisted/trial/_dist/test/__init__.py +src/twisted/trial/_dist/test/test_distreporter.py +src/twisted/trial/_dist/test/test_disttrial.py +src/twisted/trial/_dist/test/test_options.py +src/twisted/trial/_dist/test/test_worker.py +src/twisted/trial/_dist/test/test_workerreporter.py +src/twisted/trial/_dist/test/test_workertrial.py +src/twisted/trial/test/__init__.py +src/twisted/trial/test/_assertiontests.py.3only +src/twisted/trial/test/detests.py +src/twisted/trial/test/erroneous.py +src/twisted/trial/test/mockcustomsuite.py +src/twisted/trial/test/mockcustomsuite2.py +src/twisted/trial/test/mockcustomsuite3.py +src/twisted/trial/test/mockdoctest.py +src/twisted/trial/test/moduleself.py +src/twisted/trial/test/moduletest.py +src/twisted/trial/test/novars.py +src/twisted/trial/test/ordertests.py +src/twisted/trial/test/packages.py +src/twisted/trial/test/sample.py +src/twisted/trial/test/scripttest.py +src/twisted/trial/test/skipping.py +src/twisted/trial/test/suppression.py +src/twisted/trial/test/test_assertions.py +src/twisted/trial/test/test_asyncassertions.py +src/twisted/trial/test/test_deferred.py +src/twisted/trial/test/test_doctest.py +src/twisted/trial/test/test_keyboard.py +src/twisted/trial/test/test_loader.py +src/twisted/trial/test/test_log.py +src/twisted/trial/test/test_output.py +src/twisted/trial/test/test_plugins.py +src/twisted/trial/test/test_pyunitcompat.py +src/twisted/trial/test/test_reporter.py +src/twisted/trial/test/test_runner.py +src/twisted/trial/test/test_script.py +src/twisted/trial/test/test_suppression.py +src/twisted/trial/test/test_testcase.py +src/twisted/trial/test/test_tests.py +src/twisted/trial/test/test_util.py +src/twisted/trial/test/test_warning.py +src/twisted/trial/test/weird.py +src/twisted/web/__init__.py +src/twisted/web/_element.py +src/twisted/web/_flatten.py +src/twisted/web/_http2.py +src/twisted/web/_newclient.py +src/twisted/web/_responses.py +src/twisted/web/_stan.py +src/twisted/web/client.py +src/twisted/web/demo.py +src/twisted/web/distrib.py +src/twisted/web/domhelpers.py +src/twisted/web/error.py +src/twisted/web/guard.py +src/twisted/web/html.py +src/twisted/web/http.py +src/twisted/web/http_headers.py +src/twisted/web/iweb.py +src/twisted/web/microdom.py +src/twisted/web/proxy.py +src/twisted/web/resource.py +src/twisted/web/rewrite.py +src/twisted/web/script.py +src/twisted/web/server.py +src/twisted/web/soap.py +src/twisted/web/static.py +src/twisted/web/sux.py +src/twisted/web/tap.py +src/twisted/web/template.py +src/twisted/web/twcgi.py +src/twisted/web/util.py +src/twisted/web/vhost.py +src/twisted/web/wsgi.py +src/twisted/web/xmlrpc.py +src/twisted/web/_auth/__init__.py +src/twisted/web/_auth/basic.py +src/twisted/web/_auth/digest.py +src/twisted/web/_auth/wrapper.py +src/twisted/web/test/__init__.py +src/twisted/web/test/_util.py +src/twisted/web/test/injectionhelpers.py +src/twisted/web/test/requesthelper.py +src/twisted/web/test/test_agent.py +src/twisted/web/test/test_cgi.py +src/twisted/web/test/test_client.py +src/twisted/web/test/test_distrib.py +src/twisted/web/test/test_domhelpers.py +src/twisted/web/test/test_error.py +src/twisted/web/test/test_flatten.py +src/twisted/web/test/test_html.py +src/twisted/web/test/test_http.py +src/twisted/web/test/test_http2.py +src/twisted/web/test/test_http_headers.py +src/twisted/web/test/test_httpauth.py +src/twisted/web/test/test_newclient.py +src/twisted/web/test/test_proxy.py +src/twisted/web/test/test_resource.py +src/twisted/web/test/test_script.py +src/twisted/web/test/test_soap.py +src/twisted/web/test/test_stan.py +src/twisted/web/test/test_static.py +src/twisted/web/test/test_tap.py +src/twisted/web/test/test_template.py +src/twisted/web/test/test_util.py +src/twisted/web/test/test_vhost.py +src/twisted/web/test/test_web.py +src/twisted/web/test/test_web__responses.py +src/twisted/web/test/test_webclient.py +src/twisted/web/test/test_wsgi.py +src/twisted/web/test/test_xml.py +src/twisted/web/test/test_xmlrpc.py +src/twisted/words/__init__.py +src/twisted/words/ewords.py +src/twisted/words/iwords.py +src/twisted/words/service.py +src/twisted/words/tap.py +src/twisted/words/xmpproutertap.py +src/twisted/words/im/__init__.py +src/twisted/words/im/baseaccount.py +src/twisted/words/im/basechat.py +src/twisted/words/im/basesupport.py +src/twisted/words/im/instancemessenger.glade +src/twisted/words/im/interfaces.py +src/twisted/words/im/ircsupport.py +src/twisted/words/im/locals.py +src/twisted/words/im/pbsupport.py +src/twisted/words/protocols/__init__.py +src/twisted/words/protocols/irc.py +src/twisted/words/protocols/jabber/__init__.py +src/twisted/words/protocols/jabber/client.py +src/twisted/words/protocols/jabber/component.py +src/twisted/words/protocols/jabber/error.py +src/twisted/words/protocols/jabber/ijabber.py +src/twisted/words/protocols/jabber/jid.py +src/twisted/words/protocols/jabber/jstrports.py +src/twisted/words/protocols/jabber/sasl.py +src/twisted/words/protocols/jabber/sasl_mechanisms.py +src/twisted/words/protocols/jabber/xmlstream.py +src/twisted/words/protocols/jabber/xmpp_stringprep.py +src/twisted/words/test/__init__.py +src/twisted/words/test/test_basechat.py +src/twisted/words/test/test_basesupport.py +src/twisted/words/test/test_domish.py +src/twisted/words/test/test_irc.py +src/twisted/words/test/test_irc_service.py +src/twisted/words/test/test_ircsupport.py +src/twisted/words/test/test_jabberclient.py +src/twisted/words/test/test_jabbercomponent.py +src/twisted/words/test/test_jabbererror.py +src/twisted/words/test/test_jabberjid.py +src/twisted/words/test/test_jabberjstrports.py +src/twisted/words/test/test_jabbersasl.py +src/twisted/words/test/test_jabbersaslmechanisms.py +src/twisted/words/test/test_jabberxmlstream.py +src/twisted/words/test/test_jabberxmppstringprep.py +src/twisted/words/test/test_service.py +src/twisted/words/test/test_tap.py +src/twisted/words/test/test_xishutil.py +src/twisted/words/test/test_xmlstream.py +src/twisted/words/test/test_xmpproutertap.py +src/twisted/words/test/test_xpath.py +src/twisted/words/xish/__init__.py +src/twisted/words/xish/domish.py +src/twisted/words/xish/utility.py +src/twisted/words/xish/xmlstream.py +src/twisted/words/xish/xpath.py +src/twisted/words/xish/xpathparser.g +src/twisted/words/xish/xpathparser.py \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/dependency_links.txt b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/not-zip-safe b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/top_level.txt b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/top_level.txt new file mode 100644 index 0000000..3eb29f0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Twisted-19.10.0-py3.7.egg-info/top_level.txt @@ -0,0 +1 @@ +twisted diff --git a/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/RECORD b/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/RECORD new file mode 100644 index 0000000..cf15483 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/RECORD @@ -0,0 +1,119 @@ +werkzeug/__init__.py,sha256=tTlHx8lI6FpqB_X9x_zICTy3Rgikur6yIUJr8AE2XTs,7141 +werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 +werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 +werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531 +werkzeug/datastructures.py,sha256=yVH4r-XD8CjOo18tDGVJYiAfezng6pK9hWzzLFy5a94,91761 +werkzeug/exceptions.py,sha256=7wl3ufZZU23sASp0ciPe8GJssGND9DX6sDbjxvPuGYU,23437 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 +werkzeug/formparser.py,sha256=Sto0jZid9im9ZVIf56vilCdyX-arK33wSftkYsLCnzo,21788 +werkzeug/http.py,sha256=L6r2ehiorjOtsXITW-01zJsvtVa8Emkpkftu9di_cSk,41628 +werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 +werkzeug/routing.py,sha256=BSgjrYNwj2j5dAHQtK4INEp2TOf4OJP8hBncYSRO2ps,73410 +werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106 +werkzeug/serving.py,sha256=qqdsTMILMt_B8ffBtROWK3RRpZeyTkQ9g-jhtpJodrY,36607 +werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 +werkzeug/testapp.py,sha256=bHekqMsqRfVxwgFbvOMem-DYa_sdB7R47yUXpt1RUTo,9329 +werkzeug/urls.py,sha256=hWZMk4ABiJmQPP_B5rRibWTp9gOyNLQpTqq6cmQAfeE,39322 +werkzeug/useragents.py,sha256=0A_Ip74edPv_hy6CouBTpGumi2uyOci01COuzYFOm3U,5622 +werkzeug/utils.py,sha256=KxCOHhsox7tAVe0m-ZyOGPoCaIbBIy7TxhocaUEHrd4,25050 +werkzeug/wsgi.py,sha256=iXOR9l1fDd2IgqeTRQZPR6LnBBBx7Xsy97_i2n5HPUo,34666 +werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 +werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 +werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 +werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 +werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 +werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 +werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 +werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 +werkzeug/contrib/sessions.py,sha256=CkJ4IWvNqIaZCP83FMKYFszKL7E6Y1m6YEii7RaTYWs,13040 +werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 +werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 +werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 +werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 +werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 +werkzeug/middleware/proxy_fix.py,sha256=1hi6AJH-J2uh2hMm1g0u7XfjRiTOoUeIOOmwWZ2n9t0,8670 +werkzeug/middleware/shared_data.py,sha256=WtSphPrsUdpEk4E-_09CAILhfOBJ1YtcX1LrxcQfIzw,8224 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 +werkzeug/wrappers/base_request.py,sha256=aknREwqVT7WJUxm4weUGdBj90H6rDR3DvsIvmYhaC8A,26943 +werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 +werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 +werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 +werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 +werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 +werkzeug/wrappers/user_agent.py,sha256=YJb-vr12cujG7sQMG9V89VsJa-03SWSenhg1W4cT0EY,435 +Werkzeug-0.16.0.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-0.16.0.dist-info/METADATA,sha256=BH9_q8z1IK2FbYDS7tSWLsd07z7GDReBgRumclV7T08,4712 +Werkzeug-0.16.0.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Werkzeug-0.16.0.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +Werkzeug-0.16.0.dist-info/RECORD,, +Werkzeug-0.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, +werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/WHEEL b/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/Werkzeug-0.16.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/LICENSE b/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/LICENSE new file mode 100644 index 0000000..5f4f225 --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Django Software Foundation and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Django nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/METADATA b/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/METADATA new file mode 100644 index 0000000..1a039bc --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref-3.2.3.dist-info/METADATA @@ -0,0 +1,225 @@ +Metadata-Version: 2.1 +Name: asgiref +Version: 3.2.3 +Summary: ASGI specs, helper code, and adapters +Home-page: http://github.com/django/asgiref/ +Author: Django Software Foundation +Author-email: foundation@djangoproject.com +License: BSD +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Topic :: Internet :: WWW/HTTP +Description-Content-Type: text/x-rst +Provides-Extra: tests +Requires-Dist: pytest (~=4.3.0) ; extra == 'tests' +Requires-Dist: pytest-asyncio (~=0.10.0) ; extra == 'tests' + +asgiref +======= + +.. image:: https://api.travis-ci.org/django/asgiref.svg + :target: https://travis-ci.org/django/asgiref + +.. image:: https://img.shields.io/pypi/v/asgiref.svg + :target: https://pypi.python.org/pypi/asgiref + +ASGI is a standard for Python asynchronous web apps and servers to communicate +with each other, and positioned as an asynchronous successor to WSGI. You can +read more at https://asgi.readthedocs.io/en/latest/ + +This package includes ASGI base libraries, such as: + +* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync`` +* Server base classes, ``asgiref.server`` +* A WSGI-to-ASGI adapter, in ``asgiref.wsgi`` + + +Function wrappers +----------------- + +These allow you to wrap or decorate async or sync functions to call them from +the other style (so you can call async functions from a synchronous thread, +or vice-versa). + +In particular: + +* AsyncToSync lets a synchronous subthread stop and wait while the async + function is called on the main thread's event loop, and then control is + returned to the thread when the async function is finished. + +* SyncToAsync lets async code call a synchronous function, which is run in + a threadpool and control returned to the async coroutine when the synchronous + function completes. + +The idea is to make it easier to call synchronous APIs from async code and +asynchronous APIs from synchronous code so it's easier to transition code from +one style to the other. In the case of Channels, we wrap the (synchronous) +Django view system with SyncToAsync to allow it to run inside the (asynchronous) +ASGI server. + +Note that exactly what threads things run in is very specific, and aimed to +keep maximum compatibility with old synchronous code. See +"Synchronous code & Threads" below for a full explanation. + + +Threadlocal replacement +----------------------- + +This is a drop-in replacement for ``threading.local`` that works with both +threads and asyncio Tasks. Even better, it will proxy values through from a +task-local context to a thread-local context when you use ``sync_to_async`` +to run things in a threadpool, and vice-versa for ``async_to_sync``. + +If you instead want true thread- and task-safety, you can set +``thread_critical`` on the Local object to ensure this instead. + + +Server base classes +------------------- + +Includes a ``StatelessServer`` class which provides all the hard work of +writing a stateless server (as in, does not handle direct incoming sockets +but instead consumes external streams or sockets to work out what is happening). + +An example of such a server would be a chatbot server that connects out to +a central chat server and provides a "connection scope" per user chatting to +it. There's only one actual connection, but the server has to separate things +into several scopes for easier writing of the code. + +You can see an example of this being used in `frequensgi `_. + + +WSGI-to-ASGI adapter +-------------------- + +Allows you to wrap a WSGI application so it appears as a valid ASGI application. + +Simply wrap it around your WSGI application like so:: + + asgi_application = WsgiToAsgi(wsgi_application) + +The WSGI application will be run in a synchronous threadpool, and the wrapped +ASGI application will be one that accepts ``http`` class messages. + +Please note that not all extended features of WSGI may be supported (such as +file handles for incoming POST bodies). + + +Dependencies +------------ + +``asgiref`` requires Python 3.5 or higher. + + +Contributing +------------ + +Please refer to the +`main Channels contributing docs `_. + + +Testing +''''''' + +To run tests, make sure you have installed the ``tests`` extra with the package:: + + cd asgiref/ + pip install -e .[tests] + pytest + + +Building the documentation +'''''''''''''''''''''''''' + +The documentation uses `Sphinx `_:: + + cd asgiref/docs/ + pip install sphinx + +To build the docs, you can use the default tools:: + + sphinx-build -b html . _build/html # or `make html`, if you've got make set up + cd _build/html + python -m http.server + +...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload +your documentation changes automatically:: + + pip install sphinx-autobuild + sphinx-autobuild . _build/html + + +Implementation Details +---------------------- + +Synchronous code & threads +'''''''''''''''''''''''''' + +The ``asgiref.sync`` module provides two wrappers that let you go between +asynchronous and synchronous code at will, while taking care of the rough edges +for you. + +Unfortunately, the rough edges are numerous, and the code has to work especially +hard to keep things in the same thread as much as possible. Notably, the +restrictions we are working with are: + +* All synchronous code called through ``SyncToAsync`` and marked with + ``thread_sensitive`` should run in the same thread as each other (and if the + outer layer of the program is synchronous, the main thread) + +* If a thread already has a running async loop, ``AsyncToSync`` can't run things + on that loop if it's blocked on synchronous code that is above you in the + call stack. + +The first compromise you get to might be that ``thread_sensitive`` code should +just run in the same thread and not spawn in a sub-thread, fulfilling the first +restriction, but that immediately runs you into the second restriction. + +The only real solution is to essentially have a variant of ThreadPoolExecutor +that executes any ``thread_sensitive`` code on the outermost synchronous +thread - either the main thread, or a single spawned subthread. + +This means you now have two basic states: + +* If the outermost layer of your program is synchronous, then all async code + run through ``AsyncToSync`` will run in a per-call event loop in arbitary + sub-threads, while all ``thread_sensitive`` code will run in the main thread. + +* If the outermost layer of your program is asynchronous, then all async code + runs on the main thread's event loop, and all ``thread_sensitive`` synchronous + code will run in a single shared sub-thread. + +Cruicially, this means that in both cases there is a thread which is a shared +resource that all ``thread_sensitive`` code must run on, and there is a chance +that this thread is currently blocked on its own ``AsyncToSync`` call. Thus, +``AsyncToSync`` needs to act as an executor for thread code while it's blocking. + +The ``CurrentThreadExecutor`` class provides this functionality; rather than +simply waiting on a Future, you can call its ``run_until_future`` method and +it will run submitted code until that Future is done. This means that code +inside the call can then run code on your thread. + + +Maintenance and Security +------------------------ + +To report security issues, please contact security@djangoproject.com. For GPG +signatures and more security process information, see +https://docs.djangoproject.com/en/dev/internals/security/. + +To report bugs or request new features, please open a new GitHub issue. + +This repository is part of the Channels project. For the shepherd and maintenance team, please see the +`main Channels readme `_. + + diff --git a/venv/lib/python3.7/site-packages/asgiref/current_thread_executor.py b/venv/lib/python3.7/site-packages/asgiref/current_thread_executor.py new file mode 100644 index 0000000..2955ff0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref/current_thread_executor.py @@ -0,0 +1,86 @@ +import queue +import threading +import time +from concurrent.futures import Executor, Future + + +class _WorkItem(object): + """ + Represents an item needing to be run in the executor. + Copied from ThreadPoolExecutor (but it's private, so we're not going to rely on importing it) + """ + + def __init__(self, future, fn, args, kwargs): + self.future = future + self.fn = fn + self.args = args + self.kwargs = kwargs + + def run(self): + if not self.future.set_running_or_notify_cancel(): + return + try: + result = self.fn(*self.args, **self.kwargs) + except BaseException as exc: + self.future.set_exception(exc) + # Break a reference cycle with the exception 'exc' + self = None + else: + self.future.set_result(result) + + +class CurrentThreadExecutor(Executor): + """ + An Executor that actually runs code in the thread it is instantiated in. + Passed to other threads running async code, so they can run sync code in + the thread they came from. + """ + + def __init__(self): + self._work_thread = threading.current_thread() + self._work_queue = queue.Queue() + self._broken = False + + def run_until_future(self, future): + """ + Runs the code in the work queue until a result is available from the future. + Should be run from the thread the executor is initialised in. + """ + # Check we're in the right thread + if threading.current_thread() != self._work_thread: + raise RuntimeError( + "You cannot run CurrentThreadExecutor from a different thread" + ) + # Keep getting work items and checking the future + try: + while True: + # Get a work item and run it + try: + work_item = self._work_queue.get(block=False) + except queue.Empty: + # See if the future is done (we only exit if the work queue is empty) + if future.done(): + return + # Prevent hot-looping on nothing + time.sleep(0.001) + else: + work_item.run() + del work_item + finally: + self._broken = True + + def submit(self, fn, *args, **kwargs): + # Check they're not submitting from the same thread + if threading.current_thread() == self._work_thread: + raise RuntimeError( + "You cannot submit onto CurrentThreadExecutor from its own thread" + ) + # Check they're not too late or the executor errored + if self._broken: + raise RuntimeError("CurrentThreadExecutor already quit or is broken") + # Add to work queue + f = Future() + work_item = _WorkItem(f, fn, args, kwargs) + self._work_queue.put(work_item) + # Return the future + return f diff --git a/venv/lib/python3.7/site-packages/asgiref/server.py b/venv/lib/python3.7/site-packages/asgiref/server.py new file mode 100644 index 0000000..9fd2e0c --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref/server.py @@ -0,0 +1,154 @@ +import asyncio +import logging +import time +import traceback + +logger = logging.getLogger(__name__) + + +class StatelessServer: + """ + Base server class that handles basic concepts like application instance + creation/pooling, exception handling, and similar, for stateless protocols + (i.e. ones without actual incoming connections to the process) + + Your code should override the handle() method, doing whatever it needs to, + and calling get_or_create_application_instance with a unique `scope_id` + and `scope` for the scope it wants to get. + + If an application instance is found with the same `scope_id`, you are + given its input queue, otherwise one is made for you with the scope provided + and you are given that fresh new input queue. Either way, you should do + something like: + + input_queue = self.get_or_create_application_instance( + "user-123456", + {"type": "testprotocol", "user_id": "123456", "username": "andrew"}, + ) + input_queue.put_nowait(message) + + If you try and create an application instance and there are already + `max_application` instances, the oldest/least recently used one will be + reclaimed and shut down to make space. + + Application coroutines that error will be found periodically (every 100ms + by default) and have their exceptions printed to the console. Override + application_exception() if you want to do more when this happens. + + If you override run(), make sure you handle things like launching the + application checker. + """ + + application_checker_interval = 0.1 + + def __init__(self, application, max_applications=1000): + # Parameters + self.application = application + self.max_applications = max_applications + # Initialisation + self.application_instances = {} + + ### Mainloop and handling + + def run(self): + """ + Runs the asyncio event loop with our handler loop. + """ + event_loop = asyncio.get_event_loop() + asyncio.ensure_future(self.application_checker()) + try: + event_loop.run_until_complete(self.handle()) + except KeyboardInterrupt: + logger.info("Exiting due to Ctrl-C/interrupt") + + async def handle(self): + raise NotImplementedError("You must implement handle()") + + async def application_send(self, scope, message): + """ + Receives outbound sends from applications and handles them. + """ + raise NotImplementedError("You must implement application_send()") + + ### Application instance management + + def get_or_create_application_instance(self, scope_id, scope): + """ + Creates an application instance and returns its queue. + """ + if scope_id in self.application_instances: + self.application_instances[scope_id]["last_used"] = time.time() + return self.application_instances[scope_id]["input_queue"] + # See if we need to delete an old one + while len(self.application_instances) > self.max_applications: + self.delete_oldest_application_instance() + # Make an instance of the application + input_queue = asyncio.Queue() + application_instance = self.application(scope=scope) + # Run it, and stash the future for later checking + future = asyncio.ensure_future( + application_instance( + receive=input_queue.get, + send=lambda message: self.application_send(scope, message), + ) + ) + self.application_instances[scope_id] = { + "input_queue": input_queue, + "future": future, + "scope": scope, + "last_used": time.time(), + } + return input_queue + + def delete_oldest_application_instance(self): + """ + Finds and deletes the oldest application instance + """ + oldest_time = min( + details["last_used"] for details in self.application_instances.values() + ) + for scope_id, details in self.application_instances.items(): + if details["last_used"] == oldest_time: + self.delete_application_instance(scope_id) + # Return to make sure we only delete one in case two have + # the same oldest time + return + + def delete_application_instance(self, scope_id): + """ + Removes an application instance (makes sure its task is stopped, + then removes it from the current set) + """ + details = self.application_instances[scope_id] + del self.application_instances[scope_id] + if not details["future"].done(): + details["future"].cancel() + + async def application_checker(self): + """ + Goes through the set of current application instance Futures and cleans up + any that are done/prints exceptions for any that errored. + """ + while True: + await asyncio.sleep(self.application_checker_interval) + for scope_id, details in list(self.application_instances.items()): + if details["future"].done(): + exception = details["future"].exception() + if exception: + await self.application_exception(exception, details) + try: + del self.application_instances[scope_id] + except KeyError: + # Exception handling might have already got here before us. That's fine. + pass + + async def application_exception(self, exception, application_details): + """ + Called whenever an application coroutine has an exception. + """ + logging.error( + "Exception inside application: %s\n%s%s", + exception, + "".join(traceback.format_tb(exception.__traceback__)), + " {}".format(exception), + ) diff --git a/venv/lib/python3.7/site-packages/asgiref/sync.py b/venv/lib/python3.7/site-packages/asgiref/sync.py new file mode 100644 index 0000000..53f1900 --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref/sync.py @@ -0,0 +1,304 @@ +import asyncio +import asyncio.coroutines +import functools +import os +import sys +import threading +from concurrent.futures import Future, ThreadPoolExecutor + +from .current_thread_executor import CurrentThreadExecutor +from .local import Local + +try: + import contextvars # Python 3.7+ only. +except ImportError: + contextvars = None + + +class AsyncToSync: + """ + Utility class which turns an awaitable that only works on the thread with + the event loop into a synchronous callable that works in a subthread. + + If the call stack contains an async loop, the code runs there. + Otherwise, the code runs in a new loop in a new thread. + + Either way, this thread then pauses and waits to run any thread_sensitive + code called from further down the call stack using SyncToAsync, before + finally exiting once the async task returns. + """ + + # Maps launched Tasks to the threads that launched them (for locals impl) + launch_map = {} + + # Keeps track of which CurrentThreadExecutor to use. This uses an asgiref + # Local, not a threadlocal, so that tasks can work out what their parent used. + executors = Local() + + def __init__(self, awaitable, force_new_loop=False): + self.awaitable = awaitable + if force_new_loop: + # They have asked that we always run in a new sub-loop. + self.main_event_loop = None + else: + try: + self.main_event_loop = asyncio.get_event_loop() + except RuntimeError: + # There's no event loop in this thread. Look for the threadlocal if + # we're inside SyncToAsync + self.main_event_loop = getattr( + SyncToAsync.threadlocal, "main_event_loop", None + ) + + def __call__(self, *args, **kwargs): + # You can't call AsyncToSync from a thread with a running event loop + try: + event_loop = asyncio.get_event_loop() + except RuntimeError: + pass + else: + if event_loop.is_running(): + raise RuntimeError( + "You cannot use AsyncToSync in the same thread as an async event loop - " + "just await the async function directly." + ) + # Make a future for the return information + call_result = Future() + # Get the source thread + source_thread = threading.current_thread() + # Make a CurrentThreadExecutor we'll use to idle in this thread - we + # need one for every sync frame, even if there's one above us in the + # same thread. + if hasattr(self.executors, "current"): + old_current_executor = self.executors.current + else: + old_current_executor = None + current_executor = CurrentThreadExecutor() + self.executors.current = current_executor + # Use call_soon_threadsafe to schedule a synchronous callback on the + # main event loop's thread if it's there, otherwise make a new loop + # in this thread. + try: + if not (self.main_event_loop and self.main_event_loop.is_running()): + # Make our own event loop - in a new thread - and run inside that. + loop = asyncio.new_event_loop() + loop_executor = ThreadPoolExecutor(max_workers=1) + loop_future = loop_executor.submit( + self._run_event_loop, + loop, + self.main_wrap( + args, kwargs, call_result, source_thread, sys.exc_info() + ), + ) + if current_executor: + # Run the CurrentThreadExecutor until the future is done + current_executor.run_until_future(loop_future) + # Wait for future and/or allow for exception propagation + loop_future.result() + else: + # Call it inside the existing loop + self.main_event_loop.call_soon_threadsafe( + self.main_event_loop.create_task, + self.main_wrap( + args, kwargs, call_result, source_thread, sys.exc_info() + ), + ) + if current_executor: + # Run the CurrentThreadExecutor until the future is done + current_executor.run_until_future(call_result) + finally: + # Clean up any executor we were running + if hasattr(self.executors, "current"): + del self.executors.current + if old_current_executor: + self.executors.current = old_current_executor + # Wait for results from the future. + return call_result.result() + + def _run_event_loop(self, loop, coro): + """ + Runs the given event loop (designed to be called in a thread). + """ + asyncio.set_event_loop(loop) + try: + loop.run_until_complete(coro) + finally: + try: + if hasattr(loop, "shutdown_asyncgens"): + loop.run_until_complete(loop.shutdown_asyncgens()) + finally: + loop.close() + asyncio.set_event_loop(self.main_event_loop) + + def __get__(self, parent, objtype): + """ + Include self for methods + """ + func = functools.partial(self.__call__, parent) + return functools.update_wrapper(func, self.awaitable) + + async def main_wrap(self, args, kwargs, call_result, source_thread, exc_info): + """ + Wraps the awaitable with something that puts the result into the + result/exception future. + """ + current_task = SyncToAsync.get_current_task() + self.launch_map[current_task] = source_thread + try: + # If we have an exception, run the function inside the except block + # after raising it so exc_info is correctly populated. + if exc_info[1]: + try: + raise exc_info[1] + except: + result = await self.awaitable(*args, **kwargs) + else: + result = await self.awaitable(*args, **kwargs) + except Exception as e: + call_result.set_exception(e) + else: + call_result.set_result(result) + finally: + del self.launch_map[current_task] + + +class SyncToAsync: + """ + Utility class which turns a synchronous callable into an awaitable that + runs in a threadpool. It also sets a threadlocal inside the thread so + calls to AsyncToSync can escape it. + + If thread_sensitive is passed, the code will run in the same thread as any + outer code. This is needed for underlying Python code that is not + threadsafe (for example, code which handles SQLite database connections). + + If the outermost program is async (i.e. SyncToAsync is outermost), then + this will be a dedicated single sub-thread that all sync code runs in, + one after the other. If the outermost program is sync (i.e. AsyncToSync is + outermost), this will just be the main thread. This is achieved by idling + with a CurrentThreadExecutor while AsyncToSync is blocking its sync parent, + rather than just blocking. + """ + + # If they've set ASGI_THREADS, update the default asyncio executor for now + if "ASGI_THREADS" in os.environ: + loop = asyncio.get_event_loop() + loop.set_default_executor( + ThreadPoolExecutor(max_workers=int(os.environ["ASGI_THREADS"])) + ) + + # Maps launched threads to the coroutines that spawned them + launch_map = {} + + # Storage for main event loop references + threadlocal = threading.local() + + # Single-thread executor for thread-sensitive code + single_thread_executor = ThreadPoolExecutor(max_workers=1) + + def __init__(self, func, thread_sensitive=False): + self.func = func + self._thread_sensitive = thread_sensitive + self._is_coroutine = asyncio.coroutines._is_coroutine + try: + self.__self__ = func.__self__ + except AttributeError: + pass + + async def __call__(self, *args, **kwargs): + loop = asyncio.get_event_loop() + + # Work out what thread to run the code in + if self._thread_sensitive: + if hasattr(AsyncToSync.executors, "current"): + # If we have a parent sync thread above somewhere, use that + executor = AsyncToSync.executors.current + else: + # Otherwise, we run it in a fixed single thread + executor = self.single_thread_executor + else: + executor = None # Use default + + if contextvars is not None: + context = contextvars.copy_context() + child = functools.partial(self.func, *args, **kwargs) + func = context.run + args = (child,) + kwargs = {} + else: + func = self.func + + # Run the code in the right thread + future = loop.run_in_executor( + executor, + functools.partial( + self.thread_handler, + loop, + self.get_current_task(), + sys.exc_info(), + func, + *args, + **kwargs + ), + ) + return await asyncio.wait_for(future, timeout=None) + + def __get__(self, parent, objtype): + """ + Include self for methods + """ + return functools.partial(self.__call__, parent) + + def thread_handler(self, loop, source_task, exc_info, func, *args, **kwargs): + """ + Wraps the sync application with exception handling. + """ + # Set the threadlocal for AsyncToSync + self.threadlocal.main_event_loop = loop + # Set the task mapping (used for the locals module) + current_thread = threading.current_thread() + if AsyncToSync.launch_map.get(source_task) == current_thread: + # Our parent task was launched from this same thread, so don't make + # a launch map entry - let it shortcut over us! (and stop infinite loops) + parent_set = False + else: + self.launch_map[current_thread] = source_task + parent_set = True + # Run the function + try: + # If we have an exception, run the function inside the except block + # after raising it so exc_info is correctly populated. + if exc_info[1]: + try: + raise exc_info[1] + except: + return func(*args, **kwargs) + else: + return func(*args, **kwargs) + finally: + # Only delete the launch_map parent if we set it, otherwise it is + # from someone else. + if parent_set: + del self.launch_map[current_thread] + + @staticmethod + def get_current_task(): + """ + Cross-version implementation of asyncio.current_task() + + Returns None if there is no task. + """ + try: + if hasattr(asyncio, "current_task"): + # Python 3.7 and up + return asyncio.current_task() + else: + # Python 3.6 + return asyncio.Task.current_task() + except RuntimeError: + return None + + +# Lowercase is more sensible for most things +sync_to_async = SyncToAsync +async_to_sync = AsyncToSync diff --git a/venv/lib/python3.7/site-packages/asgiref/timeout.py b/venv/lib/python3.7/site-packages/asgiref/timeout.py new file mode 100644 index 0000000..0ff5892 --- /dev/null +++ b/venv/lib/python3.7/site-packages/asgiref/timeout.py @@ -0,0 +1,128 @@ +# This code is originally sourced from the aio-libs project "async_timeout", +# under the Apache 2.0 license. You may see the original project at +# https://github.com/aio-libs/async-timeout + +# It is vendored here to reduce chain-dependencies on this library, and +# modified slightly to remove some features we don't use. + + +import asyncio +import sys +from types import TracebackType +from typing import Any, Optional, Type # noqa + +PY_37 = sys.version_info >= (3, 7) + + +class timeout: + """timeout context manager. + + Useful in cases when you want to apply timeout logic around block + of code or in cases when asyncio.wait_for is not suitable. For example: + + >>> with timeout(0.001): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + timeout - value in seconds or None to disable timeout logic + loop - asyncio compatible event loop + """ + + def __init__( + self, + timeout: Optional[float], + *, + loop: Optional[asyncio.AbstractEventLoop] = None + ) -> None: + self._timeout = timeout + if loop is None: + loop = asyncio.get_event_loop() + self._loop = loop + self._task = None # type: Optional[asyncio.Task[Any]] + self._cancelled = False + self._cancel_handler = None # type: Optional[asyncio.Handle] + self._cancel_at = None # type: Optional[float] + + def __enter__(self) -> "timeout": + return self._do_enter() + + def __exit__( + self, + exc_type: Type[BaseException], + exc_val: BaseException, + exc_tb: TracebackType, + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + async def __aenter__(self) -> "timeout": + return self._do_enter() + + async def __aexit__( + self, + exc_type: Type[BaseException], + exc_val: BaseException, + exc_tb: TracebackType, + ) -> None: + self._do_exit(exc_type) + + @property + def expired(self) -> bool: + return self._cancelled + + @property + def remaining(self) -> Optional[float]: + if self._cancel_at is not None: + return max(self._cancel_at - self._loop.time(), 0.0) + else: + return None + + def _do_enter(self) -> "timeout": + # Support Tornado 5- without timeout + # Details: https://github.com/python/asyncio/issues/392 + if self._timeout is None: + return self + + self._task = current_task(self._loop) + if self._task is None: + raise RuntimeError( + "Timeout context manager should be used " "inside a task" + ) + + if self._timeout <= 0: + self._loop.call_soon(self._cancel_task) + return self + + self._cancel_at = self._loop.time() + self._timeout + self._cancel_handler = self._loop.call_at(self._cancel_at, self._cancel_task) + return self + + def _do_exit(self, exc_type: Type[BaseException]) -> None: + if exc_type is asyncio.CancelledError and self._cancelled: + self._cancel_handler = None + self._task = None + raise asyncio.TimeoutError + if self._timeout is not None and self._cancel_handler is not None: + self._cancel_handler.cancel() + self._cancel_handler = None + self._task = None + return None + + def _cancel_task(self) -> None: + if self._task is not None: + self._task.cancel() + self._cancelled = True + + +def current_task(loop: asyncio.AbstractEventLoop) -> "asyncio.Task[Any]": + if PY_37: + task = asyncio.current_task(loop=loop) # type: ignore + else: + task = asyncio.Task.current_task(loop=loop) + if task is None: + # this should be removed, tokio must use register_task and family API + if hasattr(loop, "current_task"): + task = loop.current_task() # type: ignore + + return task diff --git a/venv/lib/python3.7/site-packages/attr/__init__.pyi b/venv/lib/python3.7/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..38f16f0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/__init__.pyi @@ -0,0 +1,278 @@ +from typing import ( + Any, + Callable, + Dict, + Generic, + List, + Optional, + Sequence, + Mapping, + Tuple, + Type, + TypeVar, + Union, + overload, +) + +# `import X as X` is required to make these public +from . import exceptions as exceptions +from . import filters as filters +from . import converters as converters +from . import validators as validators + +from ._version_info import VersionInfo + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_ValidatorType = Callable[[Any, Attribute[_T], _T], Any] +_ConverterType = Callable[[Any], _T] +_FilterType = Callable[[Attribute[_T], _T], bool] +_ReprType = Callable[[Any], str] +_ReprArgType = Union[bool, _ReprType] +# FIXME: in reality, if multiple validators are passed they must be in a list or tuple, +# but those are invariant and so would prevent subtypes of _ValidatorType from working +# when passed in a list or tuple. +_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] + +# _make -- + +NOTHING: object + +# NOTE: Factory lies about its return type to make this possible: `x: List[int] = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +@overload +def Factory(factory: Callable[[], _T]) -> _T: ... +@overload +def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., +) -> _T: ... + +class Attribute(Generic[_T]): + name: str + default: Optional[_T] + validator: Optional[_ValidatorType[_T]] + repr: _ReprArgType + cmp: bool + eq: bool + order: bool + hash: Optional[bool] + init: bool + converter: Optional[_ConverterType[_T]] + metadata: Dict[Any, Any] + type: Optional[Type[_T]] + kw_only: bool + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting TypeVars +# e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the other arguments. +@overload +def attrib( + default: None = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: Optional[_T] = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: object = ..., + converter: Optional[_ConverterType[_T]] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> Any: ... +@overload +def attrs( + maybe_cls: _C, + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> _C: ... +@overload +def attrs( + maybe_cls: None = ..., + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> Callable[[_C], _C]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +class _Fields(Tuple[Attribute[Any], ...]): + def __getattr__(self, name: str) -> Attribute[Any]: ... + +def fields(cls: type) -> _Fields: ... +def fields_dict(cls: type) -> Dict[str, Attribute[Any]]: ... +def validate(inst: Any) -> None: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', [attr.ib()])` is valid +def make_class( + name: str, + attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]], + bases: Tuple[type, ...] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[bool] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. waiting on one of these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +def asdict( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + dict_factory: Type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., +) -> Dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + tuple_factory: Type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> Tuple[Any, ...]: ... +def has(cls: type) -> bool: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/venv/lib/python3.7/site-packages/attr/_compat.py b/venv/lib/python3.7/site-packages/attr/_compat.py new file mode 100644 index 0000000..a915db8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/_compat.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import, division, print_function + +import platform +import sys +import types +import warnings + + +PY2 = sys.version_info[0] == 2 +PYPY = platform.python_implementation() == "PyPy" + + +if PYPY or sys.version_info[:2] >= (3, 6): + ordered_dict = dict +else: + from collections import OrderedDict + + ordered_dict = OrderedDict + + +if PY2: + from UserDict import IterableUserDict + from collections import Mapping, Sequence + + # We 'bundle' isclass instead of using inspect as importing inspect is + # fairly expensive (order of 10-15 ms for a modern machine in 2016) + def isclass(klass): + return isinstance(klass, (type, types.ClassType)) + + # TYPE is used in exceptions, repr(int) is different on Python 2 and 3. + TYPE = "type" + + def iteritems(d): + return d.iteritems() + + # Python 2 is bereft of a read-only dict proxy, so we make one! + class ReadOnlyDict(IterableUserDict): + """ + Best-effort read-only dict wrapper. + """ + + def __setitem__(self, key, val): + # We gently pretend we're a Python 3 mappingproxy. + raise TypeError( + "'mappingproxy' object does not support item assignment" + ) + + def update(self, _): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'update'" + ) + + def __delitem__(self, _): + # We gently pretend we're a Python 3 mappingproxy. + raise TypeError( + "'mappingproxy' object does not support item deletion" + ) + + def clear(self): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'clear'" + ) + + def pop(self, key, default=None): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'pop'" + ) + + def popitem(self): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'popitem'" + ) + + def setdefault(self, key, default=None): + # We gently pretend we're a Python 3 mappingproxy. + raise AttributeError( + "'mappingproxy' object has no attribute 'setdefault'" + ) + + def __repr__(self): + # Override to be identical to the Python 3 version. + return "mappingproxy(" + repr(self.data) + ")" + + def metadata_proxy(d): + res = ReadOnlyDict() + res.data.update(d) # We blocked update, so we have to do it like this. + return res + + def just_warn(*args, **kw): # pragma: nocover + """ + We only warn on Python 3 because we are not aware of any concrete + consequences of not setting the cell on Python 2. + """ + + +else: # Python 3 and later. + from collections.abc import Mapping, Sequence # noqa + + def just_warn(*args, **kw): + """ + We only warn on Python 3 because we are not aware of any concrete + consequences of not setting the cell on Python 2. + """ + warnings.warn( + "Running interpreter doesn't sufficiently support code object " + "introspection. Some features like bare super() or accessing " + "__class__ will not work with slotted classes.", + RuntimeWarning, + stacklevel=2, + ) + + def isclass(klass): + return isinstance(klass, type) + + TYPE = "class" + + def iteritems(d): + return d.items() + + def metadata_proxy(d): + return types.MappingProxyType(dict(d)) + + +def make_set_closure_cell(): + """Return a function of two arguments (cell, value) which sets + the value stored in the closure cell `cell` to `value`. + """ + # pypy makes this easy. (It also supports the logic below, but + # why not do the easy/fast thing?) + if PYPY: # pragma: no cover + + def set_closure_cell(cell, value): + cell.__setstate__((value,)) + + return set_closure_cell + + # Otherwise gotta do it the hard way. + + # Create a function that will set its first cellvar to `value`. + def set_first_cellvar_to(value): + x = value + return + + # This function will be eliminated as dead code, but + # not before its reference to `x` forces `x` to be + # represented as a closure cell rather than a local. + def force_x_to_be_a_cell(): # pragma: no cover + return x + + try: + # Extract the code object and make sure our assumptions about + # the closure behavior are correct. + if PY2: + co = set_first_cellvar_to.func_code + else: + co = set_first_cellvar_to.__code__ + if co.co_cellvars != ("x",) or co.co_freevars != (): + raise AssertionError # pragma: no cover + + # Convert this code object to a code object that sets the + # function's first _freevar_ (not cellvar) to the argument. + if sys.version_info >= (3, 8): + # CPython 3.8+ has an incompatible CodeType signature + # (added a posonlyargcount argument) but also added + # CodeType.replace() to do this without counting parameters. + set_first_freevar_code = co.replace( + co_cellvars=co.co_freevars, co_freevars=co.co_cellvars + ) + else: + args = [co.co_argcount] + if not PY2: + args.append(co.co_kwonlyargcount) + args.extend( + [ + co.co_nlocals, + co.co_stacksize, + co.co_flags, + co.co_code, + co.co_consts, + co.co_names, + co.co_varnames, + co.co_filename, + co.co_name, + co.co_firstlineno, + co.co_lnotab, + # These two arguments are reversed: + co.co_cellvars, + co.co_freevars, + ] + ) + set_first_freevar_code = types.CodeType(*args) + + def set_closure_cell(cell, value): + # Create a function using the set_first_freevar_code, + # whose first closure cell is `cell`. Calling it will + # change the value of that cell. + setter = types.FunctionType( + set_first_freevar_code, {}, "setter", (), (cell,) + ) + # And call it to set the cell. + setter(value) + + # Make sure it works on this interpreter: + def make_func_with_cell(): + x = None + + def func(): + return x # pragma: no cover + + return func + + if PY2: + cell = make_func_with_cell().func_closure[0] + else: + cell = make_func_with_cell().__closure__[0] + set_closure_cell(cell, 100) + if cell.cell_contents != 100: + raise AssertionError # pragma: no cover + + except Exception: + return just_warn + else: + return set_closure_cell + + +set_closure_cell = make_set_closure_cell() diff --git a/venv/lib/python3.7/site-packages/attr/_config.py b/venv/lib/python3.7/site-packages/attr/_config.py new file mode 100644 index 0000000..8ec9209 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/_config.py @@ -0,0 +1,23 @@ +from __future__ import absolute_import, division, print_function + + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + """ + if not isinstance(run, bool): + raise TypeError("'run' must be bool.") + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + """ + return _run_validators diff --git a/venv/lib/python3.7/site-packages/attr/_make.py b/venv/lib/python3.7/site-packages/attr/_make.py new file mode 100644 index 0000000..46f9c54 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/_make.py @@ -0,0 +1,2168 @@ +from __future__ import absolute_import, division, print_function + +import copy +import linecache +import sys +import threading +import uuid +import warnings + +from operator import itemgetter + +from . import _config +from ._compat import ( + PY2, + isclass, + iteritems, + metadata_proxy, + ordered_dict, + set_closure_cell, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + PythonTooOldError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_obj_setattr = object.__setattr__ +_init_converter_pat = "__attr_converter_{}" +_init_factory_pat = "__attr_factory_{}" +_tuple_property_pat = ( + " {attr_name} = _attrs_property(_attrs_itemgetter({index}))" +) +_classvar_prefixes = ("typing.ClassVar", "t.ClassVar", "ClassVar") +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_hash_cache_field = "_attrs_cached_hash" + +_empty_metadata_singleton = metadata_proxy({}) + +# Unique object for unequivocal getattr() defaults. +_sentinel = object() + + +class _Nothing(object): + """ + Sentinel class to indicate the lack of a value when ``None`` is ambiguous. + + ``_Nothing`` is a singleton. There is only ever one of it. + """ + + _singleton = None + + def __new__(cls): + if _Nothing._singleton is None: + _Nothing._singleton = super(_Nothing, cls).__new__(cls) + return _Nothing._singleton + + def __repr__(self): + return "NOTHING" + + +NOTHING = _Nothing() +""" +Sentinel to indicate the lack of a value when ``None`` is ambiguous. +""" + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, +): + """ + Create a new attribute on a class. + + .. warning:: + + Does *not* do anything unless the class is also decorated with + `attr.s`! + + :param default: A value that is used if an ``attrs``-generated ``__init__`` + is used and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `Factory`, its callable will be + used to construct a new value (useful for mutable data types like lists + or dicts). + + If a default is not set (or set manually to ``attr.NOTHING``), a value + *must* be supplied when instantiating; otherwise a `TypeError` + will be raised. + + The default can also be set using decorator notation as shown below. + + :type default: Any value + + :param callable factory: Syntactic sugar for + ``default=attr.Factory(callable)``. + + :param validator: `callable` that is called by ``attrs``-generated + ``__init__`` methods after the instance has been initialized. They + receive the initialized instance, the `Attribute`, and the + passed value. + + The return value is *not* inspected so the validator has to throw an + exception itself. + + If a ``list`` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `get_run_validators`. + + The validator can also be set using decorator notation as shown below. + + :type validator: ``callable`` or a ``list`` of ``callable``\\ s. + + :param repr: Include this attribute in the generated ``__repr__`` + method. If ``True``, include the attribute; if ``False``, omit it. By + default, the built-in ``repr()`` function is used. To override how the + attribute value is formatted, pass a ``callable`` that takes a single + value and returns a string. Note that the resulting string is used + as-is, i.e. it will be used directly *instead* of calling ``repr()`` + (the default). + :type repr: a ``bool`` or a ``callable`` to use a custom function. + :param bool eq: If ``True`` (default), include this attribute in the + generated ``__eq__`` and ``__ne__`` methods that check two instances + for equality. + :param bool order: If ``True`` (default), include this attributes in the + generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. + :param bool cmp: Setting to ``True`` is equivalent to setting ``eq=True, + order=True``. Deprecated in favor of *eq* and *order*. + :param hash: Include this attribute in the generated ``__hash__`` + method. If ``None`` (default), mirror *eq*'s value. This is the + correct behavior according the Python spec. Setting this value to + anything else than ``None`` is *discouraged*. + :type hash: ``bool`` or ``None`` + :param bool init: Include this attribute in the generated ``__init__`` + method. It is possible to set this to ``False`` and set a default + value. In that case this attributed is unconditionally initialized + with the specified default value or factory. + :param callable converter: `callable` that is called by + ``attrs``-generated ``__init__`` methods to converter attribute's value + to the desired format. It is given the passed-in value, and the + returned value will be used as the new value of the attribute. The + value is converted before being passed to the validator, if any. + :param metadata: An arbitrary mapping, to be used by third-party + components. See `extending_metadata`. + :param type: The type of the attribute. In Python 3.6 or greater, the + preferred method to specify the type is using a variable annotation + (see `PEP 526 `_). + This argument is provided for backward compatibility. + Regardless of the approach used, the type will be stored on + ``Attribute.type``. + + Please note that ``attrs`` doesn't do anything with this metadata by + itself. You can use it as part of your own code or for + `static type checking `. + :param kw_only: Make this attribute keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is ``None`` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated + *convert* to achieve consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + """ + eq, order = _determine_eq_order(cmp, eq, order) + + if hash is not None and hash is not True and hash is not False: + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + + if factory is not None: + if default is not NOTHING: + raise ValueError( + "The `default` and `factory` arguments are mutually " + "exclusive." + ) + if not callable(factory): + raise ValueError("The `factory` argument must be a callable.") + default = Factory(factory) + + if metadata is None: + metadata = {} + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + order=order, + ) + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = "{}Attributes".format(cls_name) + attr_class_template = [ + "class {}(tuple):".format(attr_class_name), + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + _tuple_property_pat.format(index=i, attr_name=attr_name) + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + eval(compile("\n".join(attr_class_template), "", "exec"), globs) + + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + return str(annot).startswith(_classvar_prefixes) + + +def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + anns = getattr(cls, "__annotations__", None) + if anns is None: + return {} + + # Verify that the annotations aren't merely inherited. + for base_cls in cls.__mro__[1:]: + if anns is getattr(base_cls, "__annotations__", None): + return {} + + return anns + + +def _counter_getter(e): + """ + Key function for sorting to avoid re-creating a lambda for every class. + """ + return e[1].counter + + +def _transform_attrs(cls, these, auto_attribs, kw_only): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = [(name, ca) for name, ca in iteritems(these)] + + if not isinstance(these, ordered_dict): + ca_list.sort(key=_counter_getter) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + if not isinstance(a, _CountingAttr): + if a is NOTHING: + a = attrib() + else: + a = attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + taken_attr_names = {a.name: a for a in own_attrs} + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + sub_attrs = getattr(base_cls, "__attrs_attrs__", None) + if sub_attrs is not None: + for a in sub_attrs: + prev_a = taken_attr_names.get(a.name) + # Only add an attribute if it hasn't been defined before. This + # allows for overwriting attribute definitions by subclassing. + if prev_a is None: + base_attrs.append(a) + taken_attr_names[a.name] = a + base_attr_map[a.name] = base_cls + + attr_names = [a.name for a in base_attrs + own_attrs] + + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + if kw_only: + own_attrs = [a._assoc(kw_only=True) for a in own_attrs] + base_attrs = [a._assoc(kw_only=True) for a in base_attrs] + + attrs = AttrsClass(base_attrs + own_attrs) + + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + raise ValueError( + "No mandatory attributes allowed after an attribute with a " + "default value or factory. Attribute in question: %r" % (a,) + ) + + if had_default is False and a.default is not NOTHING: + had_default = True + + return _Attributes((attrs, base_attrs, base_attr_map)) + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder(object): + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_cls", + "_cls_dict", + "_attrs", + "_base_names", + "_attr_names", + "_slots", + "_frozen", + "_weakref_slot", + "_cache_hash", + "_has_post_init", + "_delete_attribs", + "_base_attr_map", + "_is_exc", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + auto_attribs, + kw_only, + cache_hash, + is_exc, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, these, auto_attribs, kw_only + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = set(a.name for a in base_attrs) + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen or _has_frozen_base_class(cls) + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = is_exc + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + def __repr__(self): + return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__) + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + return self._create_slots_class() + else: + return self._patch_original_class() + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _sentinel) is not _sentinel + ): + try: + delattr(cls, name) + except AttributeError: + # This can happen if a base class defines a class + # variable and we want to set an attribute with the + # same name by using only a type annotation. + pass + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # Attach __setstate__. This is necessary to clear the hash code + # cache on deserialization. See issue + # https://github.com/python-attrs/attrs/issues/482 . + # Note that this code only handles setstate for dict classes. + # For slotted classes, see similar code in _create_slots_class . + if self._cache_hash: + existing_set_state_method = getattr(cls, "__setstate__", None) + if existing_set_state_method: + raise NotImplementedError( + "Currently you cannot use hash caching if " + "you specify your own __setstate__ method." + "See https://github.com/python-attrs/attrs/issues/494 ." + ) + + def cache_hash_set_state(chss_self, _): + # clear hash code cache + setattr(chss_self, _hash_cache_field, None) + + setattr(cls, "__setstate__", cache_hash_set_state) + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + base_names = self._base_names + cd = { + k: v + for k, v in iteritems(self._cls_dict) + if k not in tuple(self._attr_names) + ("__dict__", "__weakref__") + } + + weakref_inherited = False + + # Traverse the MRO to check for an existing __weakref__. + for base_cls in self._cls.__mro__[1:-1]: + if "__weakref__" in getattr(base_cls, "__dict__", ()): + weakref_inherited = True + break + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + # We only add the names of attributes that aren't inherited. + # Settings __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + if self._cache_hash: + slot_names.append(_hash_cache_field) + cd["__slots__"] = tuple(slot_names) + + qualname = getattr(self._cls, "__qualname__", None) + if qualname is not None: + cd["__qualname__"] = qualname + + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return tuple(getattr(self, name) for name in state_attr_names) + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + # Clearing the hash code cache on deserialization is needed + # because hash codes can change from run to run. See issue + # https://github.com/python-attrs/attrs/issues/482 . + # Note that this code only handles setstate for slotted classes. + # For dict classes, see similar code in _patch_original_class . + if hash_caching_enabled: + __bound_setattr(_hash_cache_field, None) + + # slots and frozen require __getstate__/__setstate__ to work + cd["__getstate__"] = slots_getstate + cd["__setstate__"] = slots_setstate + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # https://github.com/python-attrs/attrs/issues/102. On Python 3, + # if a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in cls.__dict__.values(): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + if cell.cell_contents is self._cls: + set_closure_cell(cell, cls) + + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns=ns) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + raise ValueError( + "__str__ can only be generated if a __repr__ exists." + ) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + ) + ) + + return self + + def add_eq(self): + cd = self._cls_dict + + cd["__eq__"], cd["__ne__"] = ( + self._add_method_dunders(meth) + for meth in _make_eq(self._cls, self._attrs) + ) + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + try: + method.__module__ = self._cls.__module__ + except AttributeError: + pass + + try: + method.__qualname__ = ".".join( + (self._cls.__qualname__, method.__name__) + ) + except AttributeError: + pass + + return method + + +_CMP_DEPRECATION = ( + "The usage of `cmp` is deprecated and will be removed on or after " + "2021-06-01. Please use `eq` and `order` instead." +) + + +def _determine_eq_order(cmp, eq, order): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. + """ + if cmp is not None and any((eq is not None, order is not None)): + raise ValueError("Don't mix `cmp` with `eq' and `order`.") + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + warnings.warn(_CMP_DEPRECATION, DeprecationWarning, stacklevel=3) + + return cmp, cmp + + # If left None, equality is on and ordering mirrors equality. + if eq is None: + eq = True + + if order is None: + order = eq + + if eq is False and order is True: + raise ValueError("`order` can only be True if `eq` is True too.") + + return eq, order + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=True, + cmp=None, + hash=None, + init=True, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, +): + r""" + A class decorator that adds `dunder + `_\ -methods according to the + specified attributes using `attr.ib` or the *these* argument. + + :param these: A dictionary of name to `attr.ib` mappings. This is + useful to avoid the definition of your attributes within the class body + because you can't (e.g. if you want to add ``__repr__`` methods to + Django models) or don't want to. + + If *these* is not ``None``, ``attrs`` will *not* search the class body + for attributes and will *not* remove any attributes from it. + + If *these* is an ordered dict (`dict` on Python 3.6+, + `collections.OrderedDict` otherwise), the order is deduced from + the order of the attributes inside *these*. Otherwise the order + of the definition of the attributes is used. + + :type these: `dict` of `str` to `attr.ib` + + :param str repr_ns: When using nested classes, there's no way in Python 2 + to automatically detect that. Therefore it's possible to set the + namespace explicitly for a more meaningful ``repr`` output. + :param bool repr: Create a ``__repr__`` method with a human readable + representation of ``attrs`` attributes.. + :param bool str: Create a ``__str__`` method that is identical to + ``__repr__``. This is usually not necessary except for + `Exception`\ s. + :param bool eq: If ``True`` or ``None`` (default), add ``__eq__`` and + ``__ne__`` methods that check two instances for equality. + + They compare the instances as if they were tuples of their ``attrs`` + attributes, but only iff the types of both classes are *identical*! + :type eq: `bool` or `None` + :param bool order: If ``True``, add ``__lt__``, ``__le__``, ``__gt__``, + and ``__ge__`` methods that behave like *eq* above and allow instances + to be ordered. If ``None`` (default) mirror value of *eq*. + :type order: `bool` or `None` + :param cmp: Setting to ``True`` is equivalent to setting ``eq=True, + order=True``. Deprecated in favor of *eq* and *order*, has precedence + over them for backward-compatibility though. Must not be mixed with + *eq* or *order*. + :type cmp: `bool` or `None` + :param hash: If ``None`` (default), the ``__hash__`` method is generated + according how *eq* and *frozen* are set. + + 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to + None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning the + ``__hash__`` method of the base class will be used (if base class is + ``object``, this means it will fall back to id-based hashing.). + + Although not recommended, you can decide for yourself and force + ``attrs`` to create one (e.g. if the class is immutable even though you + didn't freeze it programmatically) by passing ``True`` or not. Both of + these cases are rather special and should be used carefully. + + See our documentation on `hashing`, Python's documentation on + `object.__hash__`, and the `GitHub issue that led to the default \ + behavior `_ for more + details. + :type hash: ``bool`` or ``None`` + :param bool init: Create a ``__init__`` method that initializes the + ``attrs`` attributes. Leading underscores are stripped for the + argument name. If a ``__attrs_post_init__`` method exists on the + class, it will be called after the class is fully initialized. + :param bool slots: Create a `slotted class ` that's more + memory-efficient. + :param bool frozen: Make instances immutable after initialization. If + someone attempts to modify a frozen instance, + `attr.exceptions.FrozenInstanceError` is raised. + + Please note: + + 1. This is achieved by installing a custom ``__setattr__`` method + on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other words: + ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You can + circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + :param bool weakref_slot: Make instances weak-referenceable. This has no + effect unless ``slots`` is also enabled. + :param bool auto_attribs: If True, collect `PEP 526`_-annotated attributes + (Python 3.6 and later only) from the class body. + + In this case, you **must** annotate every field. If ``attrs`` + encounters a field that is set to an `attr.ib` but lacks a type + annotation, an `attr.exceptions.UnannotatedAttributeError` is + raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't + want to set a type. + + If you assign a value to those attributes (e.g. ``x: int = 42``), that + value becomes the default value like if it were passed using + ``attr.ib(default=42)``. Passing an instance of `Factory` also + works as expected. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `attr.ib` are **ignored**. + + .. _`PEP 526`: https://www.python.org/dev/peps/pep-0526/ + :param bool kw_only: Make all attributes keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + :param bool cache_hash: Ensure that the object's hash code is computed + only once and stored on the object. If this is set to ``True``, + hashing must be either explicitly or implicitly enabled for this + class. If the hash code is cached, avoid any reassignments of + fields involved in hash code computation or mutations of the objects + those fields point to after object creation. If such changes occur, + the behavior of the object's hash code is undefined. + :param bool auto_exc: If the class subclasses `BaseException` + (which implicitly includes any subclass of any exception), the + following happens to behave like a well-behaved Python exceptions + class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids (N.B. ``attrs`` will + *not* remove existing implementations of ``__hash__`` or the equality + methods. It just won't add own ones.), + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the ``args`` + attribute, + - the value of *str* is ignored leaving ``__str__`` to base classes. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports ``None`` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + """ + eq, order = _determine_eq_order(cmp, eq, order) + + def wrap(cls): + + if getattr(cls, "__class__", None) is None: + raise TypeError("attrs only works with new-style classes.") + + is_exc = auto_exc is True and issubclass(cls, BaseException) + + builder = _ClassBuilder( + cls, + these, + slots, + frozen, + weakref_slot, + auto_attribs, + kw_only, + cache_hash, + is_exc, + ) + + if repr is True: + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + if eq is True and not is_exc: + builder.add_eq() + if order is True and not is_exc: + builder.add_order() + + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + elif hash is False or (hash is None and eq is False) or is_exc: + # Don't do anything. Should fall back to __object__'s __hash__ + # which is by id. + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + elif hash is True or (hash is None and eq is True and frozen is True): + # Build a __hash__ if told so, or if it's safe. + builder.add_hash() + else: + # Raise TypeError on attempts to hash. + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + builder.make_unhashable() + + if init is True: + builder.add_init() + else: + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " init must be True." + ) + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + if maybe_cls is None: + return wrap + else: + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +if PY2: + + def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return ( + getattr(cls.__setattr__, "__module__", None) + == _frozen_setattrs.__module__ + and cls.__setattr__.__name__ == _frozen_setattrs.__name__ + ) + + +else: + + def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ == _frozen_setattrs + + +def _attrs_to_tuple(obj, attrs): + """ + Create a tuple of all values of *obj*'s *attrs*. + """ + return tuple(getattr(obj, a.name) for a in attrs) + + +def _generate_unique_filename(cls, func_name): + """ + Create a "filename" suitable for a function being generated. + """ + unique_id = uuid.uuid4() + extra = "" + count = 1 + + while True: + unique_filename = "".format( + func_name, + cls.__module__, + getattr(cls, "__qualname__", cls.__name__), + extra, + ) + # To handle concurrency we essentially "reserve" our spot in + # the linecache with a dummy line. The caller can then + # set this value correctly. + cache_line = (1, None, (str(unique_id),), unique_filename) + if ( + linecache.cache.setdefault(unique_filename, cache_line) + == cache_line + ): + return unique_filename + + # Looks like this spot is taken. Try again. + count += 1 + extra = "-{0}".format(count) + + +def _make_hash(cls, attrs, frozen, cache_hash): + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + unique_filename = _generate_unique_filename(cls, "hash") + type_hash = hash(unique_filename) + + method_lines = ["def __hash__(self):"] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + method_lines.extend( + [indent + prefix + "hash((", indent + " %d," % (type_hash,)] + ) + + for a in attrs: + method_lines.append(indent + " self.%s," % a.name) + + method_lines.append(indent + " ))") + + if cache_hash: + method_lines.append(tab + "if self.%s is None:" % _hash_cache_field) + if frozen: + append_hash_computation_lines( + "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + "self.%s = " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab + "return self.%s" % _hash_cache_field) + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + globs = {} + locs = {} + bytecode = compile(script, unique_filename, "exec") + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + + return locs["__hash__"] + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) + return cls + + +def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or return the result + negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + +def _make_eq(cls, attrs): + attrs = [a for a in attrs if a.eq] + + unique_filename = _generate_unique_filename(cls, "eq") + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + if attrs: + lines.append(" return (") + others = [" ) == ("] + for a in attrs: + lines.append(" self.%s," % (a.name,)) + others.append(" other.%s," % (a.name,)) + + lines += others + [" )"] + else: + lines.append(" return True") + + script = "\n".join(lines) + globs = {} + locs = {} + bytecode = compile(script, unique_filename, "exec") + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + return locs["__eq__"], __ne__ + + +def _make_order(cls, attrs): + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return _attrs_to_tuple(obj, attrs) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__, cls.__ne__ = _make_eq(cls, attrs) + + return cls + + +_already_repring = threading.local() + + +def _make_repr(attrs, ns): + """ + Make a repr method that includes relevant *attrs*, adding *ns* to the full + name. + """ + + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom callable. + attr_names_with_reprs = tuple( + (a.name, repr if a.repr is True else a.repr) + for a in attrs + if a.repr is not False + ) + + def __repr__(self): + """ + Automatically created by attrs. + """ + try: + working_set = _already_repring.working_set + except AttributeError: + working_set = set() + _already_repring.working_set = working_set + + if id(self) in working_set: + return "..." + real_cls = self.__class__ + if ns is None: + qualname = getattr(real_cls, "__qualname__", None) + if qualname is not None: + class_name = qualname.rsplit(">.", 1)[-1] + else: + class_name = real_cls.__name__ + else: + class_name = ns + "." + real_cls.__name__ + + # Since 'self' remains on the stack (i.e.: strongly referenced) for the + # duration of this call, it's safe to depend on id(...) stability, and + # not need to track the instance and therefore worry about properties + # like weakref- or hash-ability. + working_set.add(id(self)) + try: + result = [class_name, "("] + first = True + for name, attr_repr in attr_names_with_reprs: + if first: + first = False + else: + result.append(", ") + result.extend( + (name, "=", attr_repr(getattr(self, name, NOTHING))) + ) + return "".join(result) + ")" + finally: + working_set.remove(id(self)) + + return __repr__ + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns) + return cls + + +def _make_init( + cls, attrs, post_init, frozen, slots, cache_hash, base_attr_map, is_exc +): + attrs = [a for a in attrs if a.init or a.default is not NOTHING] + + unique_filename = _generate_unique_filename(cls, "init") + + script, globs, annotations = _attrs_to_init_script( + attrs, frozen, slots, post_init, cache_hash, base_attr_map, is_exc + ) + locs = {} + bytecode = compile(script, unique_filename, "exec") + attr_dict = dict((a.name, a) for a in attrs) + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if frozen is True: + # Save the lookup overhead in __init__ if we need to circumvent + # immutability. + globs["_cached_setattr"] = _obj_setattr + + eval(bytecode, globs, locs) + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + linecache.cache[unique_filename] = ( + len(script), + None, + script.splitlines(True), + unique_filename, + ) + + __init__ = locs["__init__"] + __init__.__annotations__ = annotations + + return __init__ + + +def fields(cls): + """ + Return the tuple of ``attrs`` attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: tuple (with name accessors) of `attr.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + """ + if not isclass(cls): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of ``attrs`` attributes for a class, whose + keys are the attribute names. + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: an ordered dict where keys are attribute names and values are + `attr.Attribute`\\ s. This will be a `dict` if it's + naturally ordered like on Python 3.6+ or an + :class:`~collections.OrderedDict` otherwise. + + .. versionadded:: 18.1.0 + """ + if not isclass(cls): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return ordered_dict(((a.name, a) for a in attrs)) + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + :param inst: Instance of a class with ``attrs`` attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_cls(cls): + return "__slots__" in cls.__dict__ + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) + + +def _attrs_to_init_script( + attrs, frozen, slots, post_init, cache_hash, base_attr_map, is_exc +): + """ + Return a script of an initializer for *attrs* and a dict of globals. + + The globals are expected by the generated script. + + If *frozen* is True, we cannot set the attributes directly so we use + a cached ``object.__setattr__``. + """ + lines = [] + any_slot_ancestors = any( + _is_slot_attr(a.name, base_attr_map) for a in attrs + ) + if frozen is True: + if slots is True: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. + # Note _setattr will be used again below if cache_hash is True + "_setattr = _cached_setattr.__get__(self, self.__class__)" + ) + + def fmt_setter(attr_name, value_var): + return "_setattr('%(attr_name)s', %(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + } + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + return "_setattr('%(attr_name)s', %(conv)s(%(value_var)s))" % { + "attr_name": attr_name, + "value_var": value_var, + "conv": conv_name, + } + + else: + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + lines.append("_inst_dict = self.__dict__") + if any_slot_ancestors: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup + # per assignment. + "_setattr = _cached_setattr.__get__(self, self.__class__)" + ) + + def fmt_setter(attr_name, value_var): + if _is_slot_attr(attr_name, base_attr_map): + res = "_setattr('%(attr_name)s', %(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + } + else: + res = "_inst_dict['%(attr_name)s'] = %(value_var)s" % { + "attr_name": attr_name, + "value_var": value_var, + } + return res + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + if _is_slot_attr(attr_name, base_attr_map): + tmpl = "_setattr('%(attr_name)s', %(c)s(%(value_var)s))" + else: + tmpl = "_inst_dict['%(attr_name)s'] = %(c)s(%(value_var)s)" + return tmpl % { + "attr_name": attr_name, + "value_var": value_var, + "c": conv_name, + } + + else: + # Not frozen. + def fmt_setter(attr_name, value): + return "self.%(attr_name)s = %(value)s" % { + "attr_name": attr_name, + "value": value, + } + + def fmt_setter_with_converter(attr_name, value_var): + conv_name = _init_converter_pat.format(attr_name) + return "self.%(attr_name)s = %(conv)s(%(value_var)s)" % { + "attr_name": attr_name, + "value_var": value_var, + "conv": conv_name, + } + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + attr_name = a.name + arg_name = a.name.lstrip("_") + has_factory = isinstance(a.default, Factory) + if has_factory and a.default.takes_self: + maybe_self = "self" + else: + maybe_self = "" + if a.init is False: + if has_factory: + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + conv_name = _init_converter_pat.format(a.name) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + "attr_dict['{attr_name}'].default".format( + attr_name=attr_name + ), + ) + ) + conv_name = _init_converter_pat.format(a.name) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + "attr_dict['{attr_name}'].default".format( + attr_name=attr_name + ), + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = "{arg_name}=attr_dict['{attr_name}'].default".format( + arg_name=arg_name, attr_name=attr_name + ) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + if a.converter is not None: + lines.append(fmt_setter_with_converter(attr_name, arg_name)) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name)) + elif has_factory: + arg = "{arg_name}=NOTHING".format(arg_name=arg_name) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append( + "if {arg_name} is not NOTHING:".format(arg_name=arg_name) + ) + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + " " + fmt_setter_with_converter(attr_name, arg_name) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(" " + fmt_setter(attr_name, arg_name)) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "({0})".format(maybe_self), + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + if a.converter is not None: + lines.append(fmt_setter_with_converter(attr_name, arg_name)) + names_for_globals[ + _init_converter_pat.format(a.name) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name)) + + if a.init is True and a.converter is None and a.type is not None: + annotations[arg_name] = a.type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_{}".format(a.name) + attr_name = "__attr_{}".format(a.name) + lines.append( + " {}(self, {}, self.{})".format(val_name, attr_name, a.name) + ) + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + if post_init: + lines.append("self.__attrs_post_init__()") + + # because this is set only after __attrs_post_init is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to + # field values during post-init combined with post-init accessing the + # hash code would result in silent bugs. + if cache_hash: + if frozen: + if slots: + # if frozen and slots, then _setattr defined above + init_hash_cache = "_setattr('%s', %s)" + else: + # if frozen and not slots, then _inst_dict defined above + init_hash_cache = "_inst_dict['%s'] = %s" + else: + init_hash_cache = "self.%s = %s" + lines.append(init_hash_cache % (_hash_cache_field, "None")) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join("self." + a.name for a in attrs if a.init) + + lines.append("BaseException.__init__(self, %s)" % (vals,)) + + args = ", ".join(args) + if kw_only_args: + if PY2: + raise PythonTooOldError( + "Keyword-only arguments only work on Python 3 and later." + ) + + args += "{leading_comma}*, {kw_only_args}".format( + leading_comma=", " if args else "", + kw_only_args=", ".join(kw_only_args), + ) + return ( + """\ +def __init__(self, {args}): + {lines} +""".format( + args=args, lines="\n ".join(lines) if lines else "pass" + ), + names_for_globals, + annotations, + ) + + +class Attribute(object): + """ + *Read-only* representation of an attribute. + + :attribute name: The name of the attribute. + + Plus *all* arguments of `attr.ib` (except for ``factory`` + which is only syntactic sugar for ``default=Factory(...)``. + + For the version history of the fields, see `attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "eq", + "order", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + order=None, + ): + eq, order = _determine_eq_order(cmp, eq, order) + + # Cache this descriptor here to speed things up later. + bound_setattr = _obj_setattr.__get__(self, Attribute) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("order", order) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + metadata_proxy(metadata) + if metadata + else _empty_metadata_singleton + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + raise ValueError( + "Type annotation and type argument cannot both be present" + ) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + cmp=None, + **inst_dict + ) + + @property + def cmp(self): + """ + Simulate the presence of a cmp attribute and warn. + """ + warnings.warn(_CMP_DEPRECATION, DeprecationWarning, stacklevel=2) + + return self.eq and self.order + + # Don't use attr.assoc since fields(Attribute) doesn't work + def _assoc(self, **changes): + """ + Copy *self* and apply *changes*. + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + metadata_proxy(value) + if value + else _empty_metadata_singleton, + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq(_add_repr(Attribute, attrs=_a), attrs=_a), + attrs=[a for a in _a if a.hash], +) + + +class _CountingAttr(object): + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + ) + __attrs_attrs__ = tuple( + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + order=False, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + ) + ) + ( + Attribute( + name="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + order=False, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, # XXX: unused, remove along with cmp + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + order, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + # If validator is a list/tuple, wrap it using helper validator. + if validator and isinstance(validator, (list, tuple)): + self._validator = and_(*validator) + else: + self._validator = validator + self.repr = repr + self.eq = eq + self.order = order + self.hash = hash + self.init = init + self.converter = converter + self.metadata = metadata + self.type = type + self.kw_only = kw_only + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + :raises DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +@attrs(slots=True, init=False, hash=True) +class Factory(object): + """ + Stores a factory callable. + + If passed as the default value to `attr.ib`, the factory is used to + generate a new value. + + :param callable factory: A callable that takes either none or exactly one + mandatory positional argument depending on *takes_self*. + :param bool takes_self: Pass the partially initialized instance that is + being initialized as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + factory = attrib() + takes_self = attrib() + + def __init__(self, factory, takes_self=False): + """ + `Factory` is part of the default machinery so if we want a default + value here, we have to implement it ourselves. + """ + self.factory = factory + self.takes_self = takes_self + + +def make_class(name, attrs, bases=(object,), **attributes_arguments): + """ + A quick way to create a new class called *name* with *attrs*. + + :param name: The name for the new class. + :type name: str + + :param attrs: A list of names or a dictionary of mappings of names to + attributes. + + If *attrs* is a list or an ordered dict (`dict` on Python 3.6+, + `collections.OrderedDict` otherwise), the order is deduced from + the order of the names or attributes inside *attrs*. Otherwise the + order of the definition of the attributes is used. + :type attrs: `list` or `dict` + + :param tuple bases: Classes that the new class will subclass. + + :param attributes_arguments: Passed unmodified to `attr.s`. + + :return: A new class with *attrs*. + :rtype: type + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = dict((a, attrib()) for a in attrs) + else: + raise TypeError("attrs argument must be a dict or a list.") + + post_init = cls_dict.pop("__attrs_post_init__", None) + type_ = type( + name, + bases, + {} if post_init is None else {"__attrs_post_init__": post_init}, + ) + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + try: + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + except (AttributeError, ValueError): + pass + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + attributes_arguments["eq"], attributes_arguments[ + "order" + ] = _determine_eq_order( + cmp, attributes_arguments.get("eq"), attributes_arguments.get("order") + ) + + return _attrs(these=cls_dict, **attributes_arguments)(type_) + + +# These are required by within this module so we define them here and merely +# import into .validators. + + +@attrs(slots=True, hash=True) +class _AndValidator(object): + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + :param validators: Arbitrary number of validators. + :type validators: callables + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) diff --git a/venv/lib/python3.7/site-packages/attr/converters.py b/venv/lib/python3.7/site-packages/attr/converters.py new file mode 100644 index 0000000..8592897 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/converters.py @@ -0,0 +1,78 @@ +""" +Commonly useful converters. +""" + +from __future__ import absolute_import, division, print_function + +from ._make import NOTHING, Factory + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to ``None``. + + :param callable converter: the converter that is used for non-``None`` + values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace ``None`` values by *default* or the + result of *factory*. + + :param default: Value to be used if ``None`` is passed. Passing an instance + of `attr.Factory` is supported, however the ``takes_self`` option + is *not*. + :param callable factory: A callable that takes not parameters whose result + is used if ``None`` is passed. + + :raises TypeError: If **neither** *default* or *factory* is passed. + :raises TypeError: If **both** *default* and *factory* are passed. + :raises ValueError: If an instance of `attr.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + raise TypeError("Must pass either `default` or `factory`.") + + if default is not NOTHING and factory is not None: + raise TypeError( + "Must pass either `default` or `factory` but not both." + ) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + raise ValueError( + "`takes_self` is not supported by default_if_none." + ) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter diff --git a/venv/lib/python3.7/site-packages/attr/converters.pyi b/venv/lib/python3.7/site-packages/attr/converters.pyi new file mode 100644 index 0000000..63b2a38 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/converters.pyi @@ -0,0 +1,12 @@ +from typing import TypeVar, Optional, Callable, overload +from . import _ConverterType + +_T = TypeVar("_T") + +def optional( + converter: _ConverterType[_T] +) -> _ConverterType[Optional[_T]]: ... +@overload +def default_if_none(default: _T) -> _ConverterType[_T]: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType[_T]: ... diff --git a/venv/lib/python3.7/site-packages/attr/exceptions.pyi b/venv/lib/python3.7/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..736fde2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/exceptions.pyi @@ -0,0 +1,15 @@ +from typing import Any + +class FrozenInstanceError(AttributeError): + msg: str = ... + +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/venv/lib/python3.7/site-packages/attr/filters.py b/venv/lib/python3.7/site-packages/attr/filters.py new file mode 100644 index 0000000..dc47e8f --- /dev/null +++ b/venv/lib/python3.7/site-packages/attr/filters.py @@ -0,0 +1,52 @@ +""" +Commonly useful filters for `attr.asdict`. +""" + +from __future__ import absolute_import, division, print_function + +from ._compat import isclass +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isclass(cls)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Whitelist *what*. + + :param what: What to whitelist. + :type what: `list` of `type` or `attr.Attribute`\\ s + + :rtype: `callable` + """ + cls, attrs = _split_what(what) + + def include_(attribute, value): + return value.__class__ in cls or attribute in attrs + + return include_ + + +def exclude(*what): + """ + Blacklist *what*. + + :param what: What to blacklist. + :type what: `list` of classes or `attr.Attribute`\\ s. + + :rtype: `callable` + """ + cls, attrs = _split_what(what) + + def exclude_(attribute, value): + return value.__class__ not in cls and attribute not in attrs + + return exclude_ diff --git a/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/LICENSE b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/LICENSE new file mode 100644 index 0000000..7ae3df9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/METADATA new file mode 100644 index 0000000..a106415 --- /dev/null +++ b/venv/lib/python3.7/site-packages/attrs-19.3.0.dist-info/METADATA @@ -0,0 +1,229 @@ +Metadata-Version: 2.1 +Name: attrs +Version: 19.3.0 +Summary: Classes Without Boilerplate +Home-page: https://www.attrs.org/ +Author: Hynek Schlawack +Author-email: hs@ox.cx +Maintainer: Hynek Schlawack +Maintainer-email: hs@ox.cx +License: MIT +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Bug Tracker, https://github.com/python-attrs/attrs/issues +Project-URL: Source Code, https://github.com/python-attrs/attrs +Keywords: class,attribute,boilerplate +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Description-Content-Type: text/x-rst +Provides-Extra: azure-pipelines +Requires-Dist: coverage ; extra == 'azure-pipelines' +Requires-Dist: hypothesis ; extra == 'azure-pipelines' +Requires-Dist: pympler ; extra == 'azure-pipelines' +Requires-Dist: pytest (>=4.3.0) ; extra == 'azure-pipelines' +Requires-Dist: six ; extra == 'azure-pipelines' +Requires-Dist: zope.interface ; extra == 'azure-pipelines' +Requires-Dist: pytest-azurepipelines ; extra == 'azure-pipelines' +Provides-Extra: dev +Requires-Dist: coverage ; extra == 'dev' +Requires-Dist: hypothesis ; extra == 'dev' +Requires-Dist: pympler ; extra == 'dev' +Requires-Dist: pytest (>=4.3.0) ; extra == 'dev' +Requires-Dist: six ; extra == 'dev' +Requires-Dist: zope.interface ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: pre-commit ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: zope.interface ; extra == 'docs' +Provides-Extra: tests +Requires-Dist: coverage ; extra == 'tests' +Requires-Dist: hypothesis ; extra == 'tests' +Requires-Dist: pympler ; extra == 'tests' +Requires-Dist: pytest (>=4.3.0) ; extra == 'tests' +Requires-Dist: six ; extra == 'tests' +Requires-Dist: zope.interface ; extra == 'tests' + +.. image:: https://www.attrs.org/en/latest/_static/attrs_logo.png + :alt: attrs Logo + +====================================== +``attrs``: Classes Without Boilerplate +====================================== + +.. image:: https://readthedocs.org/projects/attrs/badge/?version=stable + :target: https://www.attrs.org/en/stable/?badge=stable + :alt: Documentation Status + +.. image:: https://attrs.visualstudio.com/attrs/_apis/build/status/python-attrs.attrs?branchName=master + :target: https://attrs.visualstudio.com/attrs/_build/latest?definitionId=1&branchName=master + :alt: CI Status + +.. image:: https://codecov.io/github/python-attrs/attrs/branch/master/graph/badge.svg + :target: https://codecov.io/github/python-attrs/attrs + :alt: Test Coverage + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code style: black + +.. teaser-begin + +``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder `_ methods). + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + +.. -spiel-end- + +For that, it gives you a class decorator and a way to declaratively define the attributes on that class: + +.. -code-begin- + +.. code-block:: pycon + + >>> import attr + + >>> @attr.s + ... class SomeClass(object): + ... a_number = attr.ib(default=42) + ... list_of_numbers = attr.ib(factory=list) + ... + ... def hard_math(self, another_number): + ... return self.a_number + sum(self.list_of_numbers) * another_number + + + >>> sc = SomeClass(1, [1, 2, 3]) + >>> sc + SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + + >>> sc.hard_math(3) + 19 + >>> sc == SomeClass(1, [1, 2, 3]) + True + >>> sc != SomeClass(2, [3, 2, 1]) + True + + >>> attr.asdict(sc) + {'a_number': 1, 'list_of_numbers': [1, 2, 3]} + + >>> SomeClass() + SomeClass(a_number=42, list_of_numbers=[]) + + >>> C = attr.make_class("C", ["a", "b"]) + >>> C("foo", "bar") + C(a='foo', b='bar') + + +After *declaring* your attributes ``attrs`` gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable ``__repr__``, +- a complete set of comparison methods (equality and ordering), +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +On Python 3.6 and later, you can often even drop the calls to ``attr.ib()`` by using `type annotations `_. + +This gives you the power to use actual classes with actual types in your code instead of confusing ``tuple``\ s or `confusingly behaving `_ ``namedtuple``\ s. +Which in turn encourages you to write *small classes* that do `one thing well `_. +Never again violate the `single responsibility principle `_ just because implementing ``__init__`` et al is a painful drag. + + +.. -testimonials- + +Testimonials +============ + +**Amber Hawkie Brown**, Twisted Release Manager and Computer Owl: + + Writing a fully-functional class using attrs takes me less time than writing this testimonial. + + +**Glyph Lefkowitz**, creator of `Twisted `_, `Automat `_, and other open source software, in `The One Python Library Everyone Needs `_: + + I’m looking forward to is being able to program in Python-with-attrs everywhere. + It exerts a subtle, but positive, design influence in all the codebases I’ve see it used in. + + +**Kenneth Reitz**, creator of `Requests `_ (`on paper no less `_!): + + attrs—classes for humans. I like it. + + +**Łukasz Langa**, creator of `Black `_, prolific Python core developer, and release manager for Python 3.8 and 3.9: + + I'm increasingly digging your attr.ocity. Good job! + + +.. -end- + +.. -project-information- + +Getting Help +============ + +Please use the ``python-attrs`` tag on `StackOverflow `_ to get help. + +Answering questions of your fellow developers is also great way to help the project! + + +Project Information +=================== + +``attrs`` is released under the `MIT `_ license, +its documentation lives at `Read the Docs `_, +the code on `GitHub `_, +and the latest release on `PyPI `_. +It’s rigorously tested on Python 2.7, 3.4+, and PyPy. + +We collect information on **third-party extensions** in our `wiki `_. +Feel free to browse and add your own! + +If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide `_ to get you started! + + +Release Information +=================== + +19.3.0 (2019-10-15) +------------------- + +Changes +^^^^^^^ + +- Fixed ``auto_attribs`` usage when default values cannot be compared directly with ``==``, such as ``numpy`` arrays. + `#585 `_ + +`Full changelog `_. + +Credits +======= + +``attrs`` is written and maintained by `Hynek Schlawack `_. + +The development is kindly supported by `Variomedia AG `_. + +A full list of contributors can be found in `GitHub's overview `_. + +It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. +Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? + + diff --git a/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/LICENSE b/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/LICENSE new file mode 100644 index 0000000..98b5b34 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Crossbar.io Technologies GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/RECORD new file mode 100644 index 0000000..36b593e --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn-19.11.1.dist-info/RECORD @@ -0,0 +1,347 @@ +autobahn/__init__.py,sha256=uCdcBR1rNLDCosowHs3ea1A1lH10lrbC_aPjM5YGjOM,1399 +autobahn/__main__.py,sha256=vMSMsxDkAWFpIv-53lNBn9k7iFIstouSfLmJcTZPTtc,11114 +autobahn/_version.py,sha256=nAupaY5VTtY8dIxAKX-Xn8RL_GqiKBfOKcwKZ7Ii_XM,1319 +autobahn/exception.py,sha256=zJG4u2Y7iQdvBocW6EA0WYCCjB4s50lJw7nTUwwbKDA,1614 +autobahn/util.py,sha256=Cu68EMPBGYN85_AvrVBY0E2StDiUwHVngCk1U9IfuGs,27599 +autobahn/asyncio/__init__.py,sha256=EfiMPwA8Ivr-QPWKr1iuM5xpeb7S-n1UJyFeihRUnfA,2055 +autobahn/asyncio/component.py,sha256=5BNTpptXPv1y4UfDURJ-nxX0BC2RfdT1nizBgo4VaME,16045 +autobahn/asyncio/rawsocket.py,sha256=TVXD_CaJaWZ9Vfb7TiNiXNWoSZTSyu6-jlhpatw7Xd8,17259 +autobahn/asyncio/util.py,sha256=GvrzlbVwIRU7v4EIt2AhPyK_p2eQ8TmyUZw7UqsTDdA,3297 +autobahn/asyncio/wamp.py,sha256=2R7wr7VRYyknKID58ZHPAeTTSgBTrB-uiwLJPl7omDY,11247 +autobahn/asyncio/websocket.py,sha256=EzHkmuQcPC8IdzbCddtAHh_FfIyOrpZ7BoLd-lpRh8o,12134 +autobahn/asyncio/xbr.py,sha256=DSnL-qHXyU9O9Tz6QpguGDxN5t8vJDpaEwB_Y2OLNzg,3465 +autobahn/asyncio/test/README,sha256=LB9qc37yrpi15mmHeOw9sJ7yu9Bzo0xxcXJD2IvNYjM,951 +autobahn/asyncio/test/test_asyncio_rawsocket.py,sha256=SXo4IwYrka9jf_gl2bg4Gn7p5yfOXOEyj98hoGbSrbM,7713 +autobahn/asyncio/test/test_asyncio_websocket.py,sha256=9MPJoVTWrYHBoI0dnB4wQYihU9Uu9hDL-GP3fzwXEIk,2401 +autobahn/nvx/__init__.py,sha256=E2gqYZ596EK-HPfki680pP3KFimqfCCWVhQdzDYtH3c,1426 +autobahn/nvx/_utf8validator.c,sha256=C6mpS9BVrkwyrfmhqnbdQXn8nMF_fpo8ZYGekaZreUA,17063 +autobahn/nvx/_utf8validator.py,sha256=ADlNAm_kIUiOkKQnWfywd9d2JOEmJGeyGh0GF4bFcpk,2543 +autobahn/nvx/test/test_utf8validator.py,sha256=_pAJPTbIW9hogD44BvsKXcGdUPswV811NptiFnITnLU,14213 +autobahn/rawsocket/__init__.py,sha256=NhWjNyqDKUs_FqdWfLdMN5-ddQ8OrWaYok3_FRZSbJU,1293 +autobahn/rawsocket/util.py,sha256=7TuuTgPyKcFNQkpPmxy2GYUcQAMagx7dKPIuODifLtk,5931 +autobahn/rawsocket/test/__init__.py,sha256=NhWjNyqDKUs_FqdWfLdMN5-ddQ8OrWaYok3_FRZSbJU,1293 +autobahn/rawsocket/test/test_rawsocket_url.py,sha256=orFompUzrWUw7QtgcrIDFss-ZycfYgUnfBsw-Utf6Zg,4982 +autobahn/test/__init__.py,sha256=_drclixbeIOutvlA9xEKpg1NUa9t6ZVcRFkl8JIToBA,2471 +autobahn/test/test_rng.py,sha256=J7_nux44GBRcvBHU3INgaglkEUDK_lreE91sLnl9XXQ,3873 +autobahn/test/test_util.py,sha256=dBT7j-sca67xfI9lCUctjeRtELK_NwIwFDU-0F3h6Mg,1850 +autobahn/twisted/__init__.py,sha256=af4M9V4yMKhAoAA9cZCNjBLOhccbi_0BSwk8YeZJVE0,3110 +autobahn/twisted/choosereactor.py,sha256=8-kEWvufaLmlAxvYbHiLxR6CIezuzp_P1a3gdY72fCA,9042 +autobahn/twisted/component.py,sha256=NJBsvuGn5OVog0KM7QLoFb6oDVmZKuGlHrgzF4uPfqo,15052 +autobahn/twisted/cryptosign.py,sha256=FCi4fRGDDOJJZQqGyo32MypQzuLdQs-2Moz4SarY7Cs,5856 +autobahn/twisted/forwarder.py,sha256=HGW35hGYBBHrRTzU9-K-EJth8uzriEgxAhscohfdzok,4695 +autobahn/twisted/rawsocket.py,sha256=szK49XxxpeoSOBHQqB5uJtPLDBBSTSyfl8W1aLJ4zOQ,22903 +autobahn/twisted/resource.py,sha256=Uobz7135OXu8ljkj6Kh1aBFydu7uUg7zrKTSQX7YFZA,7208 +autobahn/twisted/util.py,sha256=mGaVwPAplcnd3ggtOYywpqUzwO9RhDsB3-kqaaM-2FE,5192 +autobahn/twisted/wamp.py,sha256=iHrowZDebCnQ_G9mBmR2gu-f9nvDLQkNaPRxQlFDgOY,32347 +autobahn/twisted/websocket.py,sha256=tEZ0sHI9d4cn9iHmyFdne1nKtd-Tw_0bF4VPSUm4vos,30162 +autobahn/twisted/xbr.py,sha256=vAK3mNAGBJLQ-IBT16M3QL4l4VgoRhOu--PVP9I2va4,3834 +autobahn/twisted/testing/__init__.py,sha256=JKkTGvbTkmEPNG5Eh83RcA27Tylmu0ZTUQa_Vx5fmhw,10000 +autobahn/wamp/__init__.py,sha256=PezDFOWF7GIM63pZRXnsD6LgC8fhaaTHgrmFwBvY8vI,2317 +autobahn/wamp/auth.py,sha256=r5mcqTTxe3lBineC-cz9hrD3qFeNqxilaLs5T-1U2zg,20164 +autobahn/wamp/component.py,sha256=O5LrREX6CePgRmDUAYg07uj1U-s3e4Paz8hPhgoD1kI,37093 +autobahn/wamp/cryptobox.py,sha256=lfo_cUTrqMq3imNY1uVp5eoZ_025W75V7wA6m-QlpBs,10673 +autobahn/wamp/cryptosign.py,sha256=wFUeN99vN4qLJbMVNAkUnzST3Dhap16J7FwvkLMmjXg,21198 +autobahn/wamp/exception.py,sha256=9teqpFXPJ3Gjlb0S7_irsCpXCLMLpUksiM8EEuAIpyw,10115 +autobahn/wamp/interfaces.py,sha256=iXad4yNp4ul440jS534MzxWMtV7wW2iupwEw08Xidng,26914 +autobahn/wamp/message.py,sha256=_oAsii5xTLDPG2AmQqIGu021fGz8TGmrEpX8foeoZs4,215716 +autobahn/wamp/message_fbs.py,sha256=6NFttrOPlGdtSNBQ-375JezbDOo14kYR-vKrUhbjBFQ,4649 +autobahn/wamp/protocol.py,sha256=uyEns1_ul27nkpTKFe8_hyhfVquxkPWUsRTeNAeP0ak,85576 +autobahn/wamp/request.py,sha256=u0dk4eMIlMkKSe2BU2_SKyT_ds5PoqSVIItWjriRZAg,9559 +autobahn/wamp/role.py,sha256=ojL8hqeyDB1fecD7GH5VGjo94rfg3NWBYtbblFz4CXM,10986 +autobahn/wamp/serializer.py,sha256=2cSw2jeCZ5FHkaptt5O0ArFhVN8IXTs98qs9T2EnOdY,26307 +autobahn/wamp/types.py,sha256=YL-qf_owVahxVpDKIbYhBC4Rr6itQq_d4aTxJV3Sv1o,52400 +autobahn/wamp/uri.py,sha256=-fEI4eYF01S4p4U-2KJoQqIqKFNVs7L1ca0cQ2lv3P4,11613 +autobahn/wamp/websocket.py,sha256=3yO5qrD3Yx2C0ya7BAWA542XXC3Lv_yIq3KsoAC1oqQ,11165 +autobahn/wamp/gen/__init__.py,sha256=NhWjNyqDKUs_FqdWfLdMN5-ddQ8OrWaYok3_FRZSbJU,1293 +autobahn/wamp/gen/schema/auth.bfbs,sha256=5NohfPH8xErVkCRyH00Rvj5vYXOyKt4B44-rvVWiFiM,12792 +autobahn/wamp/gen/schema/pubsub.bfbs,sha256=SpSvTkNV_dlFIat08VO4-SojyJWRY0qyhszV2oBmDV8,8840 +autobahn/wamp/gen/schema/roles.bfbs,sha256=Sjyzs0tFLDrbxNUvJov9Tyx_of7z9k2SHYYElsFer_8,8240 +autobahn/wamp/gen/schema/rpc.bfbs,sha256=XZbU-v1BFD9tBT7Al4GuCWdAJOpVinHxXLwRfvw0Lp8,7664 +autobahn/wamp/gen/schema/session.bfbs,sha256=Q-9TWiilL6qYGiNOewRoyeNx2BKAdUTBh2w017Ejtz0,15944 +autobahn/wamp/gen/schema/types.bfbs,sha256=ih3tez-Jdgwx0V0N07jp4ordvJEiS-11SoHRuEQVndE,3736 +autobahn/wamp/gen/schema/wamp.bfbs,sha256=QENoUkeKlGH2zrDDQOEaschawHAvGNKZvMySQPrdgQk,26856 +autobahn/wamp/gen/wamp/Map.py,sha256=tAF0s5-5-g7YNOKintFpR1d4lUt2gEgYi0R7wRyDF1k,1208 +autobahn/wamp/gen/wamp/Void.py,sha256=S9gG7Z1qe-c0bToR6c2OzhSU8ljvCksqiBFB6s9iljs,550 +autobahn/wamp/gen/wamp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +autobahn/wamp/gen/wamp/proto/Abort.py,sha256=4zEG4LxLduCzuz-bi-vIHNltK1rANazICQiWZE3miUc,1249 +autobahn/wamp/gen/wamp/proto/AnyMessage.py,sha256=GmCjxk29SVpDJIqklYkizaCnh2XTgMNq1HLx8IujnYQ,605 +autobahn/wamp/gen/wamp/proto/AuthCraChallenge.py,sha256=SZVi5fJxDH3k6hEBmuH6TD3hLx2V8szcDIIi2P47iA8,2062 +autobahn/wamp/gen/wamp/proto/AuthCraRequest.py,sha256=-GzXW3MeE3guUaHI6Mnvj6NClIwRFYHToaoP9Aq9jHk,611 +autobahn/wamp/gen/wamp/proto/AuthCraWelcome.py,sha256=CscxVwes4tfiwJMHiFDjV8mDTWsmuSoEJI8DE-QOJXQ,611 +autobahn/wamp/gen/wamp/proto/AuthCryptosignChallenge.py,sha256=_s6rx58ftx5Otl8vrjRRRz6xd4jpmhCKczzUzU8TXNQ,1049 +autobahn/wamp/gen/wamp/proto/AuthCryptosignRequest.py,sha256=TEXT0Hr1XkSl0z5U48CiLl4gEovieIDumcCBoR2PlJU,1409 +autobahn/wamp/gen/wamp/proto/AuthCryptosignWelcome.py,sha256=39bZjIyQNrGRx2-veF71fnC4zThO00pjrpDI1UQmbtI,653 +autobahn/wamp/gen/wamp/proto/AuthFactor.py,sha256=Y1zNCZNRMeWV8IvsaNt-uxLI8-yDFZ2Uc0lzKt6mqIg,234 +autobahn/wamp/gen/wamp/proto/AuthMethod.py,sha256=ZwkdO8-aitDwJLGY2vLbIrbrlg6gnyI5o86SMFXkiK8,222 +autobahn/wamp/gen/wamp/proto/AuthMode.py,sha256=UWgMyhyNUPeu2xw4aqI-ow_a0cvBOfVQ4L0EdOjnvwg,149 +autobahn/wamp/gen/wamp/proto/AuthScramChallenge.py,sha256=77CBgc_3tqNUb3yH80Icq003598p17GmN7KWxWzGTwc,2774 +autobahn/wamp/gen/wamp/proto/AuthScramRequest.py,sha256=aQQye797PXkm1RjldhI0uCW6QvqVHkO4WkkbyuSwzSM,1355 +autobahn/wamp/gen/wamp/proto/AuthScramWelcome.py,sha256=28xHstHV7V-Tu6-N9AnjmvxJSbnLm58k0sFCblyzAnw,997 +autobahn/wamp/gen/wamp/proto/AuthTicketChallenge.py,sha256=90DIv5T_ccz_PjDww7mL5Rk3VIV9N4xvsOFcQXP4rhc,641 +autobahn/wamp/gen/wamp/proto/AuthTicketRequest.py,sha256=ZrFj2sEItg5sYqimyfNMntPtBLfVUjrDuK80X1gjVSc,629 +autobahn/wamp/gen/wamp/proto/AuthTicketWelcome.py,sha256=AxVrC6XudwUDaDZOUCFvPYoENszNWW53lPnnigDt1QY,629 +autobahn/wamp/gen/wamp/proto/Authenticate.py,sha256=cPm08hvSQFrWJqOYfu_fTaaXY1j14a0gtRH6W4DSlq4,1443 +autobahn/wamp/gen/wamp/proto/BrokerFeatures.py,sha256=U1VL0LMW4txZ9f0N27LsVJpzbdsrBjNeTYgKuS3jUJw,6251 +autobahn/wamp/gen/wamp/proto/Call.py,sha256=VmrWRA5DBfA4gSjXn1-QKz4gnY4t4Wv9b8zZF0sKIM8,4541 +autobahn/wamp/gen/wamp/proto/CalleeFeatures.py,sha256=wIYgWCA099izQKDEs6EPX8x6nsQqufeM7dIiAfej6UY,4559 +autobahn/wamp/gen/wamp/proto/CallerFeatures.py,sha256=0BPek4PnoFDEMz4WegcfZFc_705ZEtKks1WhXO0sbnI,2966 +autobahn/wamp/gen/wamp/proto/Cancel.py,sha256=P0-5iW6et2HXnj9AQDzGsp7gbWHflfJMA4TzUvkZS5E,1197 +autobahn/wamp/gen/wamp/proto/CancelMode.py,sha256=vh5uzg0R1hO4R2WCQ4TzMjxqwwhp86Tc5mUCoEc_tlM,157 +autobahn/wamp/gen/wamp/proto/Challenge.py,sha256=49tA5J4B5mKGT1kTodPZxEDn4SH7DuT8WHTzwesLwRc,1373 +autobahn/wamp/gen/wamp/proto/ChannelBinding.py,sha256=M8qp-JHRwVu_AC_4fWdKor7rmNNRHw1iRETx_rOPvOE,153 +autobahn/wamp/gen/wamp/proto/ClientRoles.py,sha256=2NUgfetpclNCFOJOl3wg5Q_N6dAy26sa3sVXvilonaY,2679 +autobahn/wamp/gen/wamp/proto/DealerFeatures.py,sha256=GINWcy2mK4wiQT17mA1zLSc8ljVSNMAa2OcsPbwM0sE,5715 +autobahn/wamp/gen/wamp/proto/Error.py,sha256=GIwH1ssVtK7nHuL9yl__gFj_lXRe063EwUqggfUdxek,4210 +autobahn/wamp/gen/wamp/proto/Event.py,sha256=U-NF3jWWrtKrKCdqpVc3ozEKJpC5RbVZaYhUcieZSy4,9087 +autobahn/wamp/gen/wamp/proto/EventReceived.py,sha256=XZHvzQyjdTzVOx9KPlJ1FFMHzFkMG2QEjyxq0ctBtZA,3720 +autobahn/wamp/gen/wamp/proto/Goodbye.py,sha256=CuJ6K4g3DhsN31Rxq2gNm2BdCMo2Fsitc8sk2_Z-UVM,1609 +autobahn/wamp/gen/wamp/proto/Hello.py,sha256=gwApzTi6xiFGW3E39zsZGkSm9WuzR8JpJgy82KBbAN0,4627 +autobahn/wamp/gen/wamp/proto/HelloNew.py,sha256=7jnNPBeiT8ZMFkrnuCvsawo5CL-0svoG9RT7gTsewaw,5989 +autobahn/wamp/gen/wamp/proto/Interrupt.py,sha256=Vr4NuGUVzh-F2AZUsCU60w4Aghult6w-AUQnttjtc54,1227 +autobahn/wamp/gen/wamp/proto/Invocation.py,sha256=Mqcjaex_KNOzWRKUTrkUnyVGMPXs0pomHDFOHdNU6o0,6160 +autobahn/wamp/gen/wamp/proto/InvocationPolicy.py,sha256=PzKHYeKYTt3vuPUyj260cPSGgXtMZZE0H0JiyMKkeGw,199 +autobahn/wamp/gen/wamp/proto/Kdf.py,sha256=x9AXogMyCtV9pfBqBXEF6MAQhmQCuhm4koeGnEpfEm8,153 +autobahn/wamp/gen/wamp/proto/Match.py,sha256=xPyjrehsQXn7qjSIPON2k1-XrigZj2u-R4iNNZSpoqQ,158 +autobahn/wamp/gen/wamp/proto/Message.py,sha256=LsYjfelutuVJpPH5Wu5w9JyEjuptHb8uZ38bmRVtC5A,1321 +autobahn/wamp/gen/wamp/proto/MessageType.py,sha256=aluiW50TmyPljbCDBtz6slTC75Qrx2KA28OSXylS_hE,610 +autobahn/wamp/gen/wamp/proto/Payload.py,sha256=fmB6dDCwB-yVlGjWEYmK6affoF6rxVKcnFeuvDQdIvM,161 +autobahn/wamp/gen/wamp/proto/Principal.py,sha256=8kLZEH-513EViBkB60XMaou-4meeF3h6_-0S6pp2PxE,1623 +autobahn/wamp/gen/wamp/proto/Publish.py,sha256=smmlHJN8pXzMl6nkUKLL3kyG3Oby1BIdd0Aw3Inf9So,13155 +autobahn/wamp/gen/wamp/proto/Published.py,sha256=Ih51BbhQWSSPQdoNjX-0NQYFFUpIlFmH0QXgXdQMy64,1257 +autobahn/wamp/gen/wamp/proto/PublisherFeatures.py,sha256=uSoS1JazH32tEI082RZH5-8Iqa56Yzx5Z49oOCJWcAo,3124 +autobahn/wamp/gen/wamp/proto/Register.py,sha256=9cTBlJpuKqdvegS0Bf5BElgDWUKNNqw8Pu_0WWYd_uM,2618 +autobahn/wamp/gen/wamp/proto/Registered.py,sha256=THhRcMZzj0r-cDXaUT2k15KPEUvoE9H0_NGjP5oMfRg,1271 +autobahn/wamp/gen/wamp/proto/Result.py,sha256=bReDBODwihT8ZKeZHjRgHTHA-oJtVy6dfC5yXVOJg_o,3885 +autobahn/wamp/gen/wamp/proto/RouterRoles.py,sha256=9xco2KbV5qgAGmaKq7wsNJIrLgdMc1hFa663hqBscDk,1611 +autobahn/wamp/gen/wamp/proto/Serializer.py,sha256=64D2_OlFMfiOTJpbY3PHqBeu7qcUVzGmFnOkXHOC6AA,227 +autobahn/wamp/gen/wamp/proto/Subscribe.py,sha256=OgPOofEt6CRBIrx8oWBQWTAI1ct0SFCZ7Ec-2Mf-ABA,1932 +autobahn/wamp/gen/wamp/proto/Subscribed.py,sha256=EXs_Q3-TXiA5NIidjLlnVTeSXmm7ddoVAOpx7ppPC7s,1271 +autobahn/wamp/gen/wamp/proto/SubscriberFeatures.py,sha256=FWbBVXTBsYfNA1AyzkF11EseZOKJ75Xxw5h19wVTnb0,3956 +autobahn/wamp/gen/wamp/proto/SubscriberReceived.py,sha256=TVZNMQu-jao1Beaw8S9bS7isXD4V67Ne5CePrBzbf_o,5023 +autobahn/wamp/gen/wamp/proto/Unregister.py,sha256=n3fSOimgjCYVUTTC-I7XerGbaEhI3vCuv8C7TvFoDhI,1271 +autobahn/wamp/gen/wamp/proto/Unregistered.py,sha256=5oRn_dWavEEo0hLfsIvzge6JEs41drZPICFEYnFhTvU,1649 +autobahn/wamp/gen/wamp/proto/Unsubscribe.py,sha256=Rv0YhU2DlmhfvVaBfdL3yqcickQCeHEXVRX3mbWAdEU,1281 +autobahn/wamp/gen/wamp/proto/Unsubscribed.py,sha256=sD6BlUodQMBWsB5XXqTRoHdOdJjPNsWL1JNqQHYvkjQ,1649 +autobahn/wamp/gen/wamp/proto/Welcome.py,sha256=MMkF8ebOTgnNhG_draW6WwdwhgN022UHPtpGWECRDNY,4669 +autobahn/wamp/gen/wamp/proto/Yield.py,sha256=bZmFHORjHR3NhOB5UJ4K3rbyUSAzP2KViKRPA3p8A_0,3528 +autobahn/wamp/gen/wamp/proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +autobahn/wamp/test/__init__.py,sha256=NhWjNyqDKUs_FqdWfLdMN5-ddQ8OrWaYok3_FRZSbJU,1293 +autobahn/wamp/test/test_auth.py,sha256=mHdNWCu46tY9ziMDMrxMYLaqpWclLRIZ8HynBHy4xQ0,9982 +autobahn/wamp/test/test_component.py,sha256=U0F5vQcVMRIbsW5M-A_lbVGt7fTGVpMm6jc0R8b272s,7636 +autobahn/wamp/test/test_component_aio.py,sha256=AhmADJBd4kbPJaHfDgdj9cLHffC3GB0eiqUjn-L32i8,6133 +autobahn/wamp/test/test_cryptobox.py,sha256=8us4P5Qb382rmAPX9HJlbjSothufX_w-Axi_Glpm2Co,1594 +autobahn/wamp/test/test_cryptosign.py,sha256=_jAyfjR2gUKvZoDv5J28hYMIoBJeKoX_A4mgkDna_rY,5056 +autobahn/wamp/test/test_exception.py,sha256=SxaFxSKNqxL0sCXIkpgfX17WaGWIPnhFkmCnMwhD6m4,2277 +autobahn/wamp/test/test_message.py,sha256=-oj55oc_8DIDLxHoB0UWfux_DiafVDkWPdH7HsIguGk,48434 +autobahn/wamp/test/test_protocol.py,sha256=mY3UNpX17BrRgd3MsoAeqctIPDdX9SRtfj2jTUm-suc,41982 +autobahn/wamp/test/test_protocol_peer.py,sha256=hDfL36jafVG1ni3QrUu9j0oKYZd3bFt3cy-dhtXlY8U,4484 +autobahn/wamp/test/test_runner.py,sha256=fbzE6RSXWnH6KNDYR8OSVC7h0w9HKJC37zgVVh_915s,9280 +autobahn/wamp/test/test_serializer.py,sha256=0RzcU-AsgVQ-lxTeyUxmsBVE9ggspoj61IRlXDNVuSw,11222 +autobahn/wamp/test/test_uri_pattern.py,sha256=8RermiOXm_KKNfCF5BsTbE6mXYhUABX0b8V0rjuaKwY,24728 +autobahn/wamp/test/test_user_handler_errors.py,sha256=mjVdWnRPkxoocmmk4cTsJO_ppnXquOwEnPmepWkMIVY,16020 +autobahn/wamp/test/test_websocket.py,sha256=gYNEzVKthy8PhWiBGxUrwLNKlxtG_izlIKnA1w9YTWE,1783 +autobahn/websocket/__init__.py,sha256=psmYUAHzor87GFkLEegMXfi0M_QxtliaTBo0yL278WA,1751 +autobahn/websocket/compress.py,sha256=oijEK_PGQ0WB1dRmVAn8_8hm3Q8Sb29_9CY34JZe2JQ,4606 +autobahn/websocket/compress_base.py,sha256=1mx7Chhonb2SjgAbtDCRp2_6wSQYlrNnwn5xrBzmNHU,2146 +autobahn/websocket/compress_bzip2.py,sha256=uXH6ABvkdHe4heIUUbdSIHAyG3h7j4YLHmyvgKDWyng,18368 +autobahn/websocket/compress_deflate.py,sha256=_6CIpzYZY95jDstXVGFICvSuDsWfGQO0TnVhVsEDZMg,29930 +autobahn/websocket/compress_snappy.py,sha256=NR-a90iCb1wwybLvdRxCJSkeHtmcGSZWucD6gltMreA,16979 +autobahn/websocket/interfaces.py,sha256=5kNhHo7qbZNG0gMmEMwJySxj4quBvU1MBtcG6H0_B4A,30069 +autobahn/websocket/protocol.py,sha256=Yo5sYF-LdgYDXZ-mAyvBPu2CM2pOaZ9aLFmT6DRRqzY,162502 +autobahn/websocket/types.py,sha256=Pbw7sNulOg3xKiDcmy8qOHUhfBh4WCNLzC0ZyRJd898,15313 +autobahn/websocket/utf8validator.py,sha256=zrWgsbNqnOJ5_DolmUJ4q_lyM748sNu6z7goOlQfRTQ,10472 +autobahn/websocket/util.py,sha256=XVBGXR4ayMYvvX29sHwPhz4meWwHcI-0gmUWy834eHI,6734 +autobahn/websocket/xormasker.py,sha256=XF9idKxou9DHNFYuRlossm_XLQW2SBydWa43skf2gbI,4546 +autobahn/websocket/test/__init__.py,sha256=NhWjNyqDKUs_FqdWfLdMN5-ddQ8OrWaYok3_FRZSbJU,1293 +autobahn/websocket/test/test_protocol.py,sha256=cEm2g69azxh_oNKnBW2rtZFjhoRvt9isoqCshGWlyhM,9523 +autobahn/websocket/test/test_websocket.py,sha256=oz-V1T31euVBqDgc6JOPRdVheBWpOU4Uy1GZfIvV8Ck,14095 +autobahn/websocket/test/test_websocket_url.py,sha256=1XU_f6LXYIzIc35M0RpdJ02jNTy_nZ10uqneEGnPieY,5455 +autobahn/xbr/__init__.py,sha256=KqqlDFiim1xYbwkRdkC_MZRFvbIsmq5l0n7EcUZXFcc,6543 +autobahn/xbr/_abi.py,sha256=ZbdUEKmwKcB3Q3Ls-O5zsX8MlsC2BPub32piymQ5was,3169 +autobahn/xbr/_blockchain.py,sha256=K5Yw4p0XzM2GHhtSifOkOdN9MtpZxqFxn8exz2DC9xU,7314 +autobahn/xbr/_buyer.py,sha256=t_OTeSWVJqvDi8tu4JouhRfKrFHRg7T2x_rngUzZQ3M,25629 +autobahn/xbr/_interfaces.py,sha256=KH3GryyUnnwmiYuXOQ9tcrSRJYNN-MI_8gPq8cC_FhQ,4572 +autobahn/xbr/_mnemonic.py,sha256=omcP6F5W3S_j9d636EBuQUtJRol79F8U4sqDuIsac2Q,6112 +autobahn/xbr/_seller.py,sha256=-cYXjmwg0mCTkSJjtqjGFudUqW8A2vmaZkxqXo2Th2c,31311 +autobahn/xbr/_util.py,sha256=9KtQBAU42MyqIdKlJJvffYPaPc_SDMxLo3Bv2hN9e0s,7775 +autobahn/xbr/contracts/ECDSA.json,sha256=EVvH_fkEzyji3VSDgq88_YzJf2d-iAzuBCde_PWN9Bo,102692 +autobahn/xbr/contracts/ERC20.json,sha256=WE4H06FGvmOUUoJXpafU3OAuu5QOqXTOV6Uz4uFwqgE,485849 +autobahn/xbr/contracts/ERC20Detailed.json,sha256=EKI-ACQu6D5kUELGLv13aqg6Qg3z5lSgHHWivIpBR_o,54285 +autobahn/xbr/contracts/IERC20.json,sha256=0H34Yqdivc9wuqCfcUWfYhleEZXNKScn_jhjEFCsqJE,69299 +autobahn/xbr/contracts/Migrations.json,sha256=-y8tyFGmlIpxiQ8UVnsVXyqog_Z8PstMjkQkEIOkfm8,54004 +autobahn/xbr/contracts/Roles.json,sha256=VE1FmcWS0sIZhExrlVQSjYgvbMEWrK_iOe_yuB080Qw,90764 +autobahn/xbr/contracts/SafeMath.json,sha256=ZGXMQAWIl8PbPKCS4fGk6zorp2YU0uWiunSamk7m05M,145860 +autobahn/xbr/contracts/XBRChannel.json,sha256=lyf2lGIviSAipky82hISfmJtyhYkmhu7YVhRtD8FbFo,785283 +autobahn/xbr/contracts/XBRMaintained.json,sha256=M_ORh2fC3PrLxls7ppyeAJIjqRcTqDPN3MqIrFdXd6s,97235 +autobahn/xbr/contracts/XBRNetwork.json,sha256=Kb-yQCubto1yWZeYnxRTA41EofAkeBkGf3yiC2uq8mU,2294558 +autobahn/xbr/contracts/XBRNetworkProxy.json,sha256=80LV0bjKi4_plCXZD--S7-fq8glRwG1S32qeXx9UZXQ,28872 +autobahn/xbr/contracts/XBRToken.json,sha256=eBux5eHKi_ZZqAq4-CEOBWDsVUhCzQxa_t6GyDDriuU,68488 +twisted/plugins/autobahn_endpoints.py,sha256=PwwMP1IYX-2KVAzxm4LYpVc8rpSaPGlcgSKfEFrKiYc,6389 +twisted/plugins/autobahn_twistd.py,sha256=9mccXpFlai3XpoYHAtxAynedzogaLb6XM7-Qb9IF5yQ,1566 +autobahn-19.11.1.dist-info/LICENSE,sha256=A4fu_OVwRT2qpgYz8oZ2ADcx7soostCgBxxijjoABO8,1091 +autobahn-19.11.1.dist-info/METADATA,sha256=TZrnK8k_AAaXCE7n_tSLnKy-AdUk96rc3KnW0yXEKSw,16840 +autobahn-19.11.1.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +autobahn-19.11.1.dist-info/entry_points.txt,sha256=pOQzqt1oaJ0ZAex4ZEdquHVbriLGGB6DicT_1O1Y96w,50 +autobahn-19.11.1.dist-info/top_level.txt,sha256=i67H6_FOEnZCuafCKor2-4scMopj2B4VZiqG_K2709g,17 +autobahn-19.11.1.dist-info/RECORD,, +../../../bin/wamp,sha256=f5CNfXC8MlqzFh6qfB3IICZmkBsawPVDZSpwxSPZIWU,272 +autobahn-19.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +autobahn/websocket/test/__pycache__/test_protocol.cpython-37.pyc,, +autobahn/websocket/test/__pycache__/test_websocket_url.cpython-37.pyc,, +autobahn/websocket/test/__pycache__/__init__.cpython-37.pyc,, +autobahn/websocket/test/__pycache__/test_websocket.cpython-37.pyc,, +autobahn/websocket/__pycache__/util.cpython-37.pyc,, +autobahn/websocket/__pycache__/interfaces.cpython-37.pyc,, +autobahn/websocket/__pycache__/compress_base.cpython-37.pyc,, +autobahn/websocket/__pycache__/types.cpython-37.pyc,, +autobahn/websocket/__pycache__/compress.cpython-37.pyc,, +autobahn/websocket/__pycache__/compress_bzip2.cpython-37.pyc,, +autobahn/websocket/__pycache__/protocol.cpython-37.pyc,, +autobahn/websocket/__pycache__/compress_deflate.cpython-37.pyc,, +autobahn/websocket/__pycache__/xormasker.cpython-37.pyc,, +autobahn/websocket/__pycache__/__init__.cpython-37.pyc,, +autobahn/websocket/__pycache__/utf8validator.cpython-37.pyc,, +autobahn/websocket/__pycache__/compress_snappy.cpython-37.pyc,, +autobahn/test/__pycache__/test_rng.cpython-37.pyc,, +autobahn/test/__pycache__/test_util.cpython-37.pyc,, +autobahn/test/__pycache__/__init__.cpython-37.pyc,, +autobahn/xbr/__pycache__/_interfaces.cpython-37.pyc,, +autobahn/xbr/__pycache__/_util.cpython-37.pyc,, +autobahn/xbr/__pycache__/_seller.cpython-37.pyc,, +autobahn/xbr/__pycache__/_blockchain.cpython-37.pyc,, +autobahn/xbr/__pycache__/_abi.cpython-37.pyc,, +autobahn/xbr/__pycache__/_mnemonic.cpython-37.pyc,, +autobahn/xbr/__pycache__/__init__.cpython-37.pyc,, +autobahn/xbr/__pycache__/_buyer.cpython-37.pyc,, +autobahn/rawsocket/test/__pycache__/test_rawsocket_url.cpython-37.pyc,, +autobahn/rawsocket/test/__pycache__/__init__.cpython-37.pyc,, +autobahn/rawsocket/__pycache__/util.cpython-37.pyc,, +autobahn/rawsocket/__pycache__/__init__.cpython-37.pyc,, +autobahn/twisted/__pycache__/util.cpython-37.pyc,, +autobahn/twisted/__pycache__/forwarder.cpython-37.pyc,, +autobahn/twisted/__pycache__/websocket.cpython-37.pyc,, +autobahn/twisted/__pycache__/resource.cpython-37.pyc,, +autobahn/twisted/__pycache__/rawsocket.cpython-37.pyc,, +autobahn/twisted/__pycache__/wamp.cpython-37.pyc,, +autobahn/twisted/__pycache__/component.cpython-37.pyc,, +autobahn/twisted/__pycache__/xbr.cpython-37.pyc,, +autobahn/twisted/__pycache__/choosereactor.cpython-37.pyc,, +autobahn/twisted/__pycache__/cryptosign.cpython-37.pyc,, +autobahn/twisted/__pycache__/__init__.cpython-37.pyc,, +autobahn/twisted/testing/__pycache__/__init__.cpython-37.pyc,, +autobahn/__pycache__/util.cpython-37.pyc,, +autobahn/__pycache__/_version.cpython-37.pyc,, +autobahn/__pycache__/__main__.cpython-37.pyc,, +autobahn/__pycache__/exception.cpython-37.pyc,, +autobahn/__pycache__/__init__.cpython-37.pyc,, +autobahn/nvx/test/__pycache__/test_utf8validator.cpython-37.pyc,, +autobahn/nvx/__pycache__/_utf8validator.cpython-37.pyc,, +autobahn/nvx/__pycache__/__init__.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_message.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_exception.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_runner.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_cryptobox.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_component_aio.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_protocol.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_component.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_auth.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_cryptosign.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_protocol_peer.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_serializer.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_user_handler_errors.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_uri_pattern.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/__init__.cpython-37.pyc,, +autobahn/wamp/test/__pycache__/test_websocket.cpython-37.pyc,, +autobahn/wamp/__pycache__/serializer.cpython-37.pyc,, +autobahn/wamp/__pycache__/interfaces.cpython-37.pyc,, +autobahn/wamp/__pycache__/uri.cpython-37.pyc,, +autobahn/wamp/__pycache__/websocket.cpython-37.pyc,, +autobahn/wamp/__pycache__/request.cpython-37.pyc,, +autobahn/wamp/__pycache__/message.cpython-37.pyc,, +autobahn/wamp/__pycache__/message_fbs.cpython-37.pyc,, +autobahn/wamp/__pycache__/types.cpython-37.pyc,, +autobahn/wamp/__pycache__/component.cpython-37.pyc,, +autobahn/wamp/__pycache__/auth.cpython-37.pyc,, +autobahn/wamp/__pycache__/role.cpython-37.pyc,, +autobahn/wamp/__pycache__/cryptosign.cpython-37.pyc,, +autobahn/wamp/__pycache__/exception.cpython-37.pyc,, +autobahn/wamp/__pycache__/protocol.cpython-37.pyc,, +autobahn/wamp/__pycache__/__init__.cpython-37.pyc,, +autobahn/wamp/__pycache__/cryptobox.cpython-37.pyc,, +autobahn/wamp/gen/__pycache__/__init__.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Payload.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Publish.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthScramChallenge.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Principal.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/BrokerFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Unsubscribe.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Hello.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Register.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Serializer.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/ClientRoles.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/ChannelBinding.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthTicketRequest.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthTicketWelcome.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Event.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/CalleeFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Result.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Invocation.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Welcome.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Message.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Call.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Published.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Abort.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthScramRequest.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Unregister.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthScramWelcome.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthTicketChallenge.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthMode.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Yield.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/InvocationPolicy.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthMethod.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Unregistered.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Subscribed.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/SubscriberFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/DealerFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/RouterRoles.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Registered.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Unsubscribed.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCraWelcome.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCraRequest.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Match.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/MessageType.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/EventReceived.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Challenge.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/PublisherFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCryptosignChallenge.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/CallerFeatures.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Subscribe.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Interrupt.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/HelloNew.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Authenticate.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCraChallenge.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Kdf.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AnyMessage.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCryptosignRequest.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthCryptosignWelcome.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/AuthFactor.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Goodbye.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/CancelMode.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Error.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/__init__.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/SubscriberReceived.cpython-37.pyc,, +autobahn/wamp/gen/wamp/proto/__pycache__/Cancel.cpython-37.pyc,, +autobahn/wamp/gen/wamp/__pycache__/Map.cpython-37.pyc,, +autobahn/wamp/gen/wamp/__pycache__/Void.cpython-37.pyc,, +autobahn/wamp/gen/wamp/__pycache__/__init__.cpython-37.pyc,, +autobahn/asyncio/test/__pycache__/test_asyncio_websocket.cpython-37.pyc,, +autobahn/asyncio/test/__pycache__/test_asyncio_rawsocket.cpython-37.pyc,, +autobahn/asyncio/__pycache__/util.cpython-37.pyc,, +autobahn/asyncio/__pycache__/websocket.cpython-37.pyc,, +autobahn/asyncio/__pycache__/rawsocket.cpython-37.pyc,, +autobahn/asyncio/__pycache__/wamp.cpython-37.pyc,, +autobahn/asyncio/__pycache__/component.cpython-37.pyc,, +autobahn/asyncio/__pycache__/xbr.cpython-37.pyc,, +autobahn/asyncio/__pycache__/__init__.cpython-37.pyc,, +twisted/plugins/__pycache__/autobahn_endpoints.cpython-37.pyc,, +twisted/plugins/__pycache__/autobahn_twistd.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/autobahn/_version.py b/venv/lib/python3.7/site-packages/autobahn/_version.py new file mode 100644 index 0000000..aedd0a2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/_version.py @@ -0,0 +1,27 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +__version__ = u'19.11.1' diff --git a/venv/lib/python3.7/site-packages/autobahn/asyncio/rawsocket.py b/venv/lib/python3.7/site-packages/autobahn/asyncio/rawsocket.py new file mode 100644 index 0000000..fbf4303 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/asyncio/rawsocket.py @@ -0,0 +1,505 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +try: + import asyncio +except ImportError: + # trollious for py2 support - however it has been deprecated + import trollius as asyncio +import struct +import math + +from autobahn.util import public, _LazyHexFormatter +from autobahn.wamp.exception import ProtocolError, SerializationError, TransportLost +from autobahn.asyncio.util import peer2str, get_serializers +import txaio + +__all__ = ( + 'WampRawSocketServerProtocol', + 'WampRawSocketClientProtocol', + 'WampRawSocketServerFactory', + 'WampRawSocketClientFactory' +) + +txaio.use_asyncio() + +FRAME_TYPE_DATA = 0 +FRAME_TYPE_PING = 1 +FRAME_TYPE_PONG = 2 + +MAGIC_BYTE = 0x7F + + +class PrefixProtocol(asyncio.Protocol): + + prefix_format = '!L' + prefix_length = struct.calcsize(prefix_format) + max_length = 16 * 1024 * 1024 + max_length_send = max_length + log = txaio.make_logger() # @UndefinedVariable + + def connection_made(self, transport): + self.transport = transport + peer = transport.get_extra_info('peername') + self.peer = peer2str(peer) + self.log.debug('RawSocker Asyncio: Connection made with peer {peer}', peer=self.peer) + self._buffer = b'' + self._header = None + self._wait_closed = txaio.create_future() + + @property + def is_closed(self): + if hasattr(self, '_wait_closed'): + return self._wait_closed + else: + f = txaio.create_future() + f.set_result(True) + return f + + def connection_lost(self, exc): + self.log.debug('RawSocker Asyncio: Connection lost') + self.transport = None + self._wait_closed.set_result(True) + self._on_connection_lost(exc) + + def _on_connection_lost(self, exc): + pass + + def protocol_error(self, msg): + self.log.error(msg) + self.transport.close() + + def sendString(self, data): + l = len(data) + if l > self.max_length_send: + raise ValueError('Data too big') + header = struct.pack(self.prefix_format, len(data)) + self.transport.write(header) + self.transport.write(data) + + def ping(self, data): + raise NotImplementedError() + + def pong(self, data): + raise NotImplementedError() + + def data_received(self, data): + self._buffer += data + pos = 0 + remaining = len(self._buffer) + while remaining >= self.prefix_length: + # do not recalculate header if available from previous call + if self._header: + frame_type, frame_length = self._header + else: + header = self._buffer[pos:pos + self.prefix_length] + frame_type = ord(header[0:1]) & 0b00000111 + if frame_type > FRAME_TYPE_PONG: + self.protocol_error('Invalid frame type') + return + frame_length = struct.unpack(self.prefix_format, b'\0' + header[1:])[0] + if frame_length > self.max_length: + self.protocol_error('Frame too big') + return + + if remaining - self.prefix_length >= frame_length: + self._header = None + pos += self.prefix_length + remaining -= self.prefix_length + data = self._buffer[pos:pos + frame_length] + pos += frame_length + remaining -= frame_length + + if frame_type == FRAME_TYPE_DATA: + self.stringReceived(data) + elif frame_type == FRAME_TYPE_PING: + self.ping(data) + elif frame_type == FRAME_TYPE_PONG: + self.pong(data) + else: + # save heaader + self._header = frame_type, frame_length + break + + self._buffer = self._buffer[pos:] + + def stringReceived(self, data): + raise NotImplementedError() + + +class RawSocketProtocol(PrefixProtocol): + + def __init__(self): + max_size = None + if max_size: + exp = int(math.ceil(math.log(max_size, 2))) - 9 + if exp > 15: + raise ValueError('Maximum length is 16M') + self.max_length = 2**(exp + 9) + self._length_exp = exp + else: + self._length_exp = 15 + self.max_length = 2**24 + + def connection_made(self, transport): + PrefixProtocol.connection_made(self, transport) + self._handshake_done = False + + def _on_handshake_complete(self): + raise NotImplementedError() + + def parse_handshake(self): + buf = bytearray(self._buffer[:4]) + if buf[0] != MAGIC_BYTE: + raise HandshakeError('Invalid magic byte in handshake') + return + ser = buf[1] & 0x0F + lexp = buf[1] >> 4 + self.max_length_send = 2**(lexp + 9) + if buf[2] != 0 or buf[3] != 0: + raise HandshakeError('Reserved bytes must be zero') + return ser, lexp + + def process_handshake(self): + raise NotImplementedError() + + def data_received(self, data): + self.log.debug('RawSocker Asyncio: data received {data}', data=_LazyHexFormatter(data)) + if self._handshake_done: + return PrefixProtocol.data_received(self, data) + else: + self._buffer += data + if len(self._buffer) >= 4: + try: + self.process_handshake() + except HandshakeError as e: + self.protocol_error('Handshake error : {err}'.format(err=e)) + return + self._handshake_done = True + self._on_handshake_complete() + data = self._buffer[4:] + self._buffer = b'' + if data: + PrefixProtocol.data_received(self, data) + + +ERR_SERIALIZER_UNSUPPORTED = 1 + +ERRMAP = { + 0: "illegal (must not be used)", + 1: "serializer unsupported", + 2: "maximum message length unacceptable", + 3: "use of reserved bits (unsupported feature)", + 4: "maximum connection count reached" +} + + +class HandshakeError(Exception): + def __init__(self, msg, code=0): + Exception.__init__(self, msg if not code else msg + ' : %s' % ERRMAP.get(code)) + + +class RawSocketClientProtocol(RawSocketProtocol): + + def check_serializer(self, ser_id): + return True + + def process_handshake(self): + ser_id, err = self.parse_handshake() + if ser_id == 0: + raise HandshakeError('Server returned handshake error', err) + if self.serializer_id != ser_id: + raise HandshakeError('Server returned different serializer {0} then requested {1}' + .format(ser_id, self.serializer_id)) + + @property + def serializer_id(self): + raise NotImplementedError() + + def connection_made(self, transport): + RawSocketProtocol.connection_made(self, transport) + # start handshake + hs = bytes(bytearray([MAGIC_BYTE, + self._length_exp << 4 | self.serializer_id, + 0, 0])) + transport.write(hs) + self.log.debug('RawSocket Asyncio: Client handshake sent') + + +class RawSocketServerProtocol(RawSocketProtocol): + + def supports_serializer(self, ser_id): + raise NotImplementedError() + + def process_handshake(self): + def send_response(lexp, ser_id): + b2 = lexp << 4 | (ser_id & 0x0f) + self.transport.write(bytes(bytearray([MAGIC_BYTE, b2, 0, 0]))) + ser_id, _lexp = self.parse_handshake() + if not self.supports_serializer(ser_id): + send_response(ERR_SERIALIZER_UNSUPPORTED, 0) + raise HandshakeError('Serializer unsupported : {ser_id}'.format(ser_id=ser_id)) + send_response(self._length_exp, ser_id) + + +# this is transport independent part of WAMP protocol +class WampRawSocketMixinGeneral(object): + + def _on_handshake_complete(self): + self.log.debug("WampRawSocketProtocol: Handshake complete") + try: + self._session = self.factory._factory() + self._session.onOpen(self) + except Exception as e: + # Exceptions raised in onOpen are fatal .. + self.log.warn("WampRawSocketProtocol: ApplicationSession constructor / onOpen raised ({err})", err=e) + self.abort() + else: + self.log.info("ApplicationSession started.") + + def stringReceived(self, payload): + self.log.debug("WampRawSocketProtocol: RX octets: {octets}", octets=_LazyHexFormatter(payload)) + try: + for msg in self._serializer.unserialize(payload): + self.log.debug("WampRawSocketProtocol: RX WAMP message: {msg}", msg=msg) + self._session.onMessage(msg) + + except ProtocolError as e: + self.log.warn("WampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connection", err=e) + self.abort() + + except Exception as e: + self.log.warn("WampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection", err=e) + self.abort() + + def send(self, msg): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.send` + """ + if self.isOpen(): + self.log.debug("WampRawSocketProtocol: TX WAMP message: {msg}", msg=msg) + try: + payload, _ = self._serializer.serialize(msg) + except Exception as e: + # all exceptions raised from above should be serialization errors .. + raise SerializationError("WampRawSocketProtocol: unable to serialize WAMP application payload ({0})" + .format(e)) + else: + self.sendString(payload) + self.log.debug("WampRawSocketProtocol: TX octets: {octets}", octets=_LazyHexFormatter(payload)) + else: + raise TransportLost() + + def isOpen(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen` + """ + return hasattr(self, '_session') and self._session is not None + + +# this is asyncio dependent part of WAMP protocol +class WampRawSocketMixinAsyncio(object): + """ + Base class for asyncio-based WAMP-over-RawSocket protocols. + """ + + def _on_connection_lost(self, exc): + try: + wasClean = exc is None + self._session.onClose(wasClean) + except Exception as e: + # silently ignore exceptions raised here .. + self.log.warn("WampRawSocketProtocol: ApplicationSession.onClose raised ({err})", err=e) + self._session = None + + def close(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.close` + """ + if self.isOpen(): + self.transport.close() + else: + raise TransportLost() + + def abort(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.abort` + """ + if self.isOpen(): + if hasattr(self.transport, 'abort'): + # ProcessProtocol lacks abortConnection() + self.transport.abort() + else: + self.transport.close() + else: + raise TransportLost() + + +@public +class WampRawSocketServerProtocol(WampRawSocketMixinGeneral, WampRawSocketMixinAsyncio, RawSocketServerProtocol): + """ + asyncio-based WAMP-over-RawSocket server protocol. + + Implements: + + * :class:`autobahn.wamp.interfaces.ITransport` + """ + + def supports_serializer(self, ser_id): + if ser_id in self.factory._serializers: + self._serializer = self.factory._serializers[ser_id]() + self.log.debug( + "WampRawSocketProtocol: client wants to use serializer '{serializer}'", + serializer=ser_id, + ) + return True + else: + self.log.debug( + "WampRawSocketProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers}", + serializer=ser_id, + serializers=self.factory._serializers.keys(), + ) + self.abort() + return False + + def get_channel_id(self, channel_id_type=u'tls-unique'): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id` + """ + return None + # return transport_channel_id(self.transport, is_server=True, channel_id_type=channel_id_type) + + +@public +class WampRawSocketClientProtocol(WampRawSocketMixinGeneral, WampRawSocketMixinAsyncio, RawSocketClientProtocol): + """ + asyncio-based WAMP-over-RawSocket client protocol. + + Implements: + + * :class:`autobahn.wamp.interfaces.ITransport` + """ + + @property + def serializer_id(self): + if not hasattr(self, '_serializer'): + self._serializer = self.factory._serializer + return self._serializer.RAWSOCKET_SERIALIZER_ID + + def get_channel_id(self, channel_id_type=u'tls-unique'): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id` + """ + return None + # return transport_channel_id(self.transport, is_server=False, channel_id_type=channel_id_type) + + +class WampRawSocketFactory(object): + """ + Adapter class for asyncio-based WebSocket client and server factories.def dataReceived(self, data): + """ + + log = txaio.make_logger() + + @public + def __call__(self): + proto = self.protocol() + proto.factory = self + return proto + + +@public +class WampRawSocketServerFactory(WampRawSocketFactory): + """ + asyncio-based WAMP-over-RawSocket server protocol factory. + """ + protocol = WampRawSocketServerProtocol + + def __init__(self, factory, serializers=None): + """ + + :param factory: A callable that produces instances that implement + :class:`autobahn.wamp.interfaces.ITransportHandler` + :type factory: callable + + :param serializers: A list of WAMP serializers to use (or ``None`` + for all available serializers). + :type serializers: list of objects implementing + :class:`autobahn.wamp.interfaces.ISerializer` + """ + if callable(factory): + self._factory = factory + else: + self._factory = lambda: factory + + # when no serializers were requested specifically, then support + # all that are available + if serializers is None: + serializers = get_serializers() + + if not serializers: + raise Exception("could not import any WAMP serializers") + + self._serializers = {ser.RAWSOCKET_SERIALIZER_ID: ser for ser in serializers} + + +@public +class WampRawSocketClientFactory(WampRawSocketFactory): + """ + asyncio-based WAMP-over-RawSocket client factory. + """ + protocol = WampRawSocketClientProtocol + + def __init__(self, factory, serializer=None): + """ + + :param factory: A callable that produces instances that implement + :class:`autobahn.wamp.interfaces.ITransportHandler` + :type factory: callable + + :param serializer: The WAMP serializer to use (or ``None`` for + "best" serializer, chosen as the first serializer available from + this list: CBOR, MessagePack, UBJSON, JSON). + :type serializer: object implementing :class:`autobahn.wamp.interfaces.ISerializer` + """ + if callable(factory): + self._factory = factory + else: + self._factory = lambda: factory + + # when no serializer was requested specifically, use the first + # one available + if serializer is None: + serializers = get_serializers() + if serializers: + serializer = serializers[0]() + + if serializer is None: + raise Exception("could not import any WAMP serializer") + + self._serializer = serializer diff --git a/venv/lib/python3.7/site-packages/autobahn/asyncio/websocket.py b/venv/lib/python3.7/site-packages/autobahn/asyncio/websocket.py new file mode 100644 index 0000000..97a494c --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/asyncio/websocket.py @@ -0,0 +1,396 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +from collections import deque + +import txaio +txaio.use_asyncio() + +from autobahn.util import public +from autobahn.asyncio.util import transport_channel_id, peer2str +from autobahn.wamp import websocket +from autobahn.websocket import protocol +from autobahn.websocket.types import TransportDetails + +try: + import asyncio + from asyncio import iscoroutine + from asyncio import Future +except ImportError: + # Trollius >= 0.3 was renamed + # noinspection PyUnresolvedReferences + import trollius as asyncio + from trollius import iscoroutine + from trollius import Future + +if hasattr(asyncio, 'ensure_future'): + ensure_future = asyncio.ensure_future +else: # Deprecated since Python 3.4.4 + ensure_future = getattr(asyncio, 'async') + +__all__ = ( + 'WebSocketServerProtocol', + 'WebSocketClientProtocol', + 'WebSocketServerFactory', + 'WebSocketClientFactory', + 'WampWebSocketServerProtocol', + 'WampWebSocketClientProtocol', + 'WampWebSocketServerFactory', + 'WampWebSocketClientFactory', +) + + +def yields(value): + """ + Returns ``True`` iff the value yields. + + .. seealso:: http://stackoverflow.com/questions/20730248/maybedeferred-analog-with-asyncio + """ + return isinstance(value, Future) or iscoroutine(value) + + +class WebSocketAdapterProtocol(asyncio.Protocol): + """ + Adapter class for asyncio-based WebSocket client and server protocols. + """ + + def connection_made(self, transport): + self.transport = transport + + self.receive_queue = deque() + self._consume() + + try: + self.peer = peer2str(transport.get_extra_info('peername')) + except: + self.peer = u"?" + + self._connectionMade() + + def connection_lost(self, exc): + self._connectionLost(exc) + # according to asyncio docs, connection_lost(None) is called + # if something else called transport.close() + if exc is not None: + self.transport.close() + self.transport = None + + def _consume(self): + self.waiter = Future(loop=self.factory.loop or txaio.config.loop) + + def process(_): + while len(self.receive_queue): + data = self.receive_queue.popleft() + if self.transport: + self._dataReceived(data) + self._consume() + + self.waiter.add_done_callback(process) + + def data_received(self, data): + self.receive_queue.append(data) + if not self.waiter.done(): + self.waiter.set_result(None) + + def _closeConnection(self, abort=False): + if abort and hasattr(self.transport, 'abort'): + self.transport.abort() + else: + self.transport.close() + + def _onOpen(self): + res = self.onOpen() + if yields(res): + ensure_future(res) + + def _onMessageBegin(self, isBinary): + res = self.onMessageBegin(isBinary) + if yields(res): + ensure_future(res) + + def _onMessageFrameBegin(self, length): + res = self.onMessageFrameBegin(length) + if yields(res): + ensure_future(res) + + def _onMessageFrameData(self, payload): + res = self.onMessageFrameData(payload) + if yields(res): + ensure_future(res) + + def _onMessageFrameEnd(self): + res = self.onMessageFrameEnd() + if yields(res): + ensure_future(res) + + def _onMessageFrame(self, payload): + res = self.onMessageFrame(payload) + if yields(res): + ensure_future(res) + + def _onMessageEnd(self): + res = self.onMessageEnd() + if yields(res): + ensure_future(res) + + def _onMessage(self, payload, isBinary): + res = self.onMessage(payload, isBinary) + if yields(res): + ensure_future(res) + + def _onPing(self, payload): + res = self.onPing(payload) + if yields(res): + ensure_future(res) + + def _onPong(self, payload): + res = self.onPong(payload) + if yields(res): + ensure_future(res) + + def _onClose(self, wasClean, code, reason): + res = self.onClose(wasClean, code, reason) + if yields(res): + ensure_future(res) + + def registerProducer(self, producer, streaming): + raise Exception("not implemented") + + def unregisterProducer(self): + # note that generic websocket/protocol.py code calls + # .unregisterProducer whenever we dropConnection -- that's + # correct behavior on Twisted so either we'd have to + # try/except there, or special-case Twisted, ..or just make + # this "not an error" + pass + + +@public +class WebSocketServerProtocol(WebSocketAdapterProtocol, protocol.WebSocketServerProtocol): + """ + Base class for asyncio-based WebSocket server protocols. + + Implements: + + * :class:`autobahn.websocket.interfaces.IWebSocketChannel` + """ + + log = txaio.make_logger() + + def get_channel_id(self, channel_id_type=u'tls-unique'): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id` + """ + return transport_channel_id(self.transport, True, channel_id_type) + + +@public +class WebSocketClientProtocol(WebSocketAdapterProtocol, protocol.WebSocketClientProtocol): + """ + Base class for asyncio-based WebSocket client protocols. + + Implements: + + * :class:`autobahn.websocket.interfaces.IWebSocketChannel` + """ + + log = txaio.make_logger() + + def _onConnect(self, response): + res = self.onConnect(response) + if yields(res): + ensure_future(res) + + def startTLS(self): + raise Exception("WSS over explicit proxies not implemented") + + def get_channel_id(self, channel_id_type=u'tls-unique'): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id` + """ + return transport_channel_id(self.transport, False, channel_id_type) + + def _create_transport_details(self): + """ + Internal helper. + Base class calls this to create a TransportDetails + """ + is_secure = self.transport.get_extra_info('peercert', None) is not None + if is_secure: + secure_channel_id = { + u'tls-unique': transport_channel_id(self.transport, False, 'tls-unique'), + } + else: + secure_channel_id = {} + return TransportDetails(peer=self.peer, is_secure=is_secure, secure_channel_id=secure_channel_id) + + +class WebSocketAdapterFactory(object): + """ + Adapter class for asyncio-based WebSocket client and server factories. + """ + log = txaio.make_logger() + + def __call__(self): + proto = self.protocol() + proto.factory = self + return proto + + +@public +class WebSocketServerFactory(WebSocketAdapterFactory, protocol.WebSocketServerFactory): + """ + Base class for asyncio-based WebSocket server factories. + + Implements: + + * :class:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory` + """ + + protocol = WebSocketServerProtocol + + def __init__(self, *args, **kwargs): + """ + .. note:: + In addition to all arguments to the constructor of + :meth:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory`, + you can supply a ``loop`` keyword argument to specify the + asyncio event loop to be used. + """ + loop = kwargs.pop('loop', None) + self.loop = loop or asyncio.get_event_loop() + + protocol.WebSocketServerFactory.__init__(self, *args, **kwargs) + + +@public +class WebSocketClientFactory(WebSocketAdapterFactory, protocol.WebSocketClientFactory): + """ + Base class for asyncio-based WebSocket client factories. + + Implements: + + * :class:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory` + """ + + def __init__(self, *args, **kwargs): + """ + + .. note:: + In addition to all arguments to the constructor of + :meth:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory`, + you can supply a ``loop`` keyword argument to specify the + asyncio event loop to be used. + """ + loop = kwargs.pop('loop', None) + self.loop = loop or asyncio.get_event_loop() + + protocol.WebSocketClientFactory.__init__(self, *args, **kwargs) + + +@public +class WampWebSocketServerProtocol(websocket.WampWebSocketServerProtocol, WebSocketServerProtocol): + """ + asyncio-based WAMP-over-WebSocket server protocol. + + Implements: + + * :class:`autobahn.wamp.interfaces.ITransport` + """ + + +@public +class WampWebSocketServerFactory(websocket.WampWebSocketServerFactory, WebSocketServerFactory): + """ + asyncio-based WAMP-over-WebSocket server factory. + """ + + protocol = WampWebSocketServerProtocol + + def __init__(self, factory, *args, **kwargs): + """ + + :param factory: A callable that produces instances that implement + :class:`autobahn.wamp.interfaces.ITransportHandler` + :type factory: callable + + :param serializers: A list of WAMP serializers to use (or ``None`` + for all available serializers). + :type serializers: list of objects implementing + :class:`autobahn.wamp.interfaces.ISerializer` + """ + + serializers = kwargs.pop('serializers', None) + + websocket.WampWebSocketServerFactory.__init__(self, factory, serializers) + + kwargs['protocols'] = self._protocols + + # noinspection PyCallByClass + WebSocketServerFactory.__init__(self, *args, **kwargs) + + +@public +class WampWebSocketClientProtocol(websocket.WampWebSocketClientProtocol, WebSocketClientProtocol): + """ + asyncio-based WAMP-over-WebSocket client protocols. + + Implements: + + * :class:`autobahn.wamp.interfaces.ITransport` + """ + + +@public +class WampWebSocketClientFactory(websocket.WampWebSocketClientFactory, WebSocketClientFactory): + """ + asyncio-based WAMP-over-WebSocket client factory. + """ + + protocol = WampWebSocketClientProtocol + + def __init__(self, factory, *args, **kwargs): + """ + + :param factory: A callable that produces instances that implement + :class:`autobahn.wamp.interfaces.ITransportHandler` + :type factory: callable + + :param serializer: The WAMP serializer to use (or ``None`` for + "best" serializer, chosen as the first serializer available from + this list: CBOR, MessagePack, UBJSON, JSON). + :type serializer: object implementing :class:`autobahn.wamp.interfaces.ISerializer` + """ + + serializers = kwargs.pop('serializers', None) + + websocket.WampWebSocketClientFactory.__init__(self, factory, serializers) + + kwargs['protocols'] = self._protocols + + WebSocketClientFactory.__init__(self, *args, **kwargs) diff --git a/venv/lib/python3.7/site-packages/autobahn/exception.py b/venv/lib/python3.7/site-packages/autobahn/exception.py new file mode 100644 index 0000000..5d6432c --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/exception.py @@ -0,0 +1,41 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +from autobahn.util import public + +__all__ = ( + 'PayloadExceededError', +) + + +@public +class PayloadExceededError(RuntimeError): + """ + Exception raised when the serialized and framed (eg WebSocket/RawSocket) WAMP payload + exceeds the transport message size limit. + """ diff --git a/venv/lib/python3.7/site-packages/autobahn/nvx/_utf8validator.c b/venv/lib/python3.7/site-packages/autobahn/nvx/_utf8validator.c new file mode 100644 index 0000000..5e632ac --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/nvx/_utf8validator.c @@ -0,0 +1,646 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// The MIT License (MIT) +// +// Copyright (c) Crossbar.io Technologies GmbH +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include + +// http://stackoverflow.com/questions/11228855/header-files-for-simd-intrinsics +#include + + +#define UTF8_ACCEPT 0 +#define UTF8_REJECT 1 + + +typedef struct { + size_t current_index; + size_t total_index; + int state; + int impl; +} utf8_validator_t; + + +#define UTF8_VALIDATOR_OPTIMAL 0 +#define UTF8_VALIDATOR_TABLE_DFA 1 +#define UTF8_VALIDATOR_UNROLLED_DFA 2 +#define UTF8_VALIDATOR_SSE2_DFA 3 +#define UTF8_VALIDATOR_SSE41_DFA 4 + + +int nvx_utf8vld_get_impl (void* utf8vld) { + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + return vld->impl; +} + +int nvx_utf8vld_set_impl (void* utf8vld, int impl) { + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + if (impl) { + // set requested implementation + // +#ifndef __SSE4_1__ +# ifdef __SSE2__ + if (impl <= UTF8_VALIDATOR_SSE2_DFA) { + vld->impl = impl; + } +# else + if (impl <= UTF8_VALIDATOR_UNROLLED_DFA) { + vld->impl = impl; + } +# endif +#else + if (impl <= UTF8_VALIDATOR_SSE41_DFA) { + vld->impl = impl; + } +#endif + + } else { + // set optimal implementation + // +#ifndef __SSE4_1__ +# ifdef __SSE2__ + vld->impl = UTF8_VALIDATOR_SSE2_DFA; +# else + vld->impl = UTF8_VALIDATOR_UNROLLED_DFA; +# endif +#else + vld->impl = UTF8_VALIDATOR_SSE41_DFA; +#endif + + } + return vld->impl; +} + + +void nvx_utf8vld_reset (void* utf8vld) { + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + vld->state = 0; + vld->current_index = -1; + vld->total_index = -1; +} + + +void* nvx_utf8vld_new () { + void* p = malloc(sizeof(utf8_validator_t)); + nvx_utf8vld_reset(p); + nvx_utf8vld_set_impl(p, 0); + return p; +} + + +void nvx_utf8vld_free (void* utf8vld) { + free (utf8vld); +} + + +// unrolled DFA from http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +// +static const uint8_t UTF8VALIDATOR_DFA[] __attribute__((aligned(64))) = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df + + 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef + 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff + 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0 + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2 + 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4 + 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6 + 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1 // s7..s8 +}; + + +int _nvx_utf8vld_validate_table (void* utf8vld, const uint8_t* data, size_t length) { + + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + int state = vld->state; + + const uint8_t* end = data + length; + + while (data < end && state != 1) { + state = UTF8VALIDATOR_DFA[256 + state * 16 + UTF8VALIDATOR_DFA[*data++]]; + } + + vld->state = state; + + if (state == 0) { + // UTF8 is valid and ends on codepoint + return 0; + } else { + if (state == 1) { + // UTF8 is invalid + return -1; + } else { + // UTF8 is valid, but does not end on codepoint (needs more data) + return 1; + } + } +} + + +// unrolled DFA from http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +// +#define DFA_TRANSITION(state, octet) \ + if (state == 0) { \ + if (octet >= 0x00 && octet <= 0x7f) { \ + /* reflective state 0 */ \ + } else if (octet >= 0xc2 && octet <= 0xdf) { \ + state = 2; \ + } else if ((octet >= 0xe1 && octet <= 0xec) || octet == 0xee || octet == 0xef) { \ + state = 3; \ + } else if (octet == 0xe0) { \ + state = 4; \ + } else if (octet == 0xed) { \ + state = 5; \ + } else if (octet == 0xf4) { \ + state = 8; \ + } else if (octet == 0xf1 || octet == 0xf2 || octet == 0xf3) { \ + state = 7; \ + } else if (octet == 0xf0) { \ + state = 6; \ + } else { \ + state = 1; \ + } \ + } else if (state == 2) { \ + if (octet >= 0x80 && octet <= 0xbf) { \ + state = 0; \ + } else { \ + state = 1; \ + } \ + } else if (state == 3) { \ + if (octet >= 0x80 && octet <= 0xbf) { \ + state = 2; \ + } else { \ + state = 1; \ + } \ + } else if (state == 4) { \ + if (octet >= 0xa0 && octet <= 0xbf) { \ + state = 2; \ + } else { \ + state = 1; \ + } \ + } else if (state == 5) { \ + if (octet >= 0x80 && octet <= 0x9f) { \ + state = 2; \ + } else { \ + state = 1; \ + } \ + } else if (state == 6) { \ + if (octet >= 0x90 && octet <= 0xbf) { \ + state = 3; \ + } else { \ + state = 1; \ + } \ + } else if (state == 7) { \ + if (octet >= 0x80 && octet <= 0xbf) { \ + state = 3; \ + } else { \ + state = 1; \ + } \ + } else if (state == 8) { \ + if (octet >= 0x80 && octet <= 0x8f) { \ + state = 3; \ + } else { \ + state = 1; \ + } \ + } else if (state == 1) { \ + /* refective state 1 */ \ + } else { \ + /* should not arrive here */ \ + } + + +int _nvx_utf8vld_validate_unrolled (void* utf8vld, const uint8_t* data, size_t length) { + + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + int state = vld->state; + + const uint8_t* tail_end = data + length; + + while (data < tail_end && state != 1) { + + // get tail octet + int octet = *data; + + // do the DFA + DFA_TRANSITION(state, octet); + + ++data; + } + + vld->state = state; + + if (state == 0) { + // UTF8 is valid and ends on codepoint + return 0; + } else { + if (state == 1) { + // UTF8 is invalid + return -1; + } else { + // UTF8 is valid, but does not end on codepoint (needs more data) + return 1; + } + } +} + + +/* + __m128i _mm_load_si128 (__m128i const* mem_addr) + #include "emmintrin.h" + Instruction: movdqa + CPUID Feature Flag: SSE2 + + int _mm_movemask_epi8 (__m128i a) + #include "emmintrin.h" + Instruction: pmovmskb + CPUID Feature Flag: SSE2 + + __m128i _mm_srli_si128 (__m128i a, int imm) + #include "emmintrin.h" + Instruction: psrldq + CPUID Feature Flag: SSE2 + + int _mm_cvtsi128_si32 (__m128i a) + #include "emmintrin.h" + Instruction: movd + CPUID Feature Flag: SSE2 + + int _mm_extract_epi16 (__m128i a, int imm) + #include "emmintrin.h" + Instruction: pextrw + CPUID Feature Flag: SSE2 + + int _mm_extract_epi8 (__m128i a, const int imm) + #include "smmintrin.h" + Instruction: pextrb + CPUID Feature Flag: SSE4.1 +*/ + +#ifdef __SSE2__ +int _nvx_utf8vld_validate_sse2 (void* utf8vld, const uint8_t* data, size_t length) { + + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + int state = vld->state; + + const uint8_t* tail_end = data + length; + + // process unaligned head (sub 16 octets) + // + size_t head_len = ((size_t) data) % sizeof(__m128i); + if (head_len) { + + const uint8_t* head_end = data + head_len; + + while (data < head_end && state != UTF8_REJECT) { + + // get head octet + int octet = *data; + + // do the DFA + DFA_TRANSITION(state, octet); + + ++data; + } + } + + // process aligned middle (16 octet chunks) + // + const __m128i* ptr = ((const __m128i*) data); + const __m128i* end = ((const __m128i*) data) + ((length - head_len) / sizeof(__m128i)); + + while (ptr < end && state != UTF8_REJECT) { + + __builtin_prefetch(ptr + 1, 0, 3); + //__builtin_prefetch(ptr + 4, 0, 3); // 16*4=64: cache-line prefetch + + __m128i xmm1 = _mm_load_si128(ptr); + + if (__builtin_expect(state || _mm_movemask_epi8(xmm1), 0)) { + + // copy to different reg - this allows the prefetching to + // do its job in the meantime (I guess ..) + + // SSE2 variant + // + int octet; + + // octet 0 + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 1 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 2 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 3 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 4 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 5 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 6 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 7 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 8 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 9 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 10 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 11 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 12 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 13 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 14 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + + // octet 15 + xmm1 = _mm_srli_si128(xmm1, 1); + octet = 0xff & _mm_cvtsi128_si32(xmm1); + DFA_TRANSITION(state, octet); + } + ++ptr; + } + + // process unaligned tail (sub 16 octets) + // + const uint8_t* tail_ptr = (const uint8_t*) ptr; + + while (tail_ptr < tail_end && state != UTF8_REJECT) { + + // get tail octet + int octet = *tail_ptr; + + // do the DFA + DFA_TRANSITION(state, octet); + + ++tail_ptr; + } + + vld->state = state; + + if (state == UTF8_ACCEPT) { + // UTF8 is valid and ends on codepoint + return 0; + } else { + if (state == UTF8_REJECT) { + // UTF8 is invalid + return -1; + } else { + // UTF8 is valid, but does not end on codepoint (needs more data) + return 1; + } + } +} +#endif + + +#ifdef __SSE4_1__ +int _nvx_utf8vld_validate_sse4 (void* utf8vld, const uint8_t* data, size_t length) { + + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + int state = vld->state; + + const uint8_t* tail_end = data + length; + + // process unaligned head (sub 16 octets) + // + size_t head_len = ((size_t) data) % sizeof(__m128i); + if (head_len) { + + const uint8_t* head_end = data + head_len; + + while (data < head_end && state != UTF8_REJECT) { + + // get head octet + int octet = *data; + + // do the DFA + DFA_TRANSITION(state, octet); + + ++data; + } + } + + // process aligned middle (16 octet chunks) + // + const __m128i* ptr = ((const __m128i*) data); + const __m128i* end = ((const __m128i*) data) + ((length - head_len) / sizeof(__m128i)); + + while (ptr < end && state != UTF8_REJECT) { + + __builtin_prefetch(ptr + 1, 0, 3); + //__builtin_prefetch(ptr + 4, 0, 3); // 16*4=64: cache-line prefetch + + __m128i xmm1 = _mm_load_si128(ptr); + + + if (__builtin_expect(state || _mm_movemask_epi8(xmm1), 0)) { + + // copy to different reg - this allows the prefetching to + // do its job in the meantime (I guess ..) + + // SSE4.1 variant + // + int octet; + + // octet 0 + octet = _mm_extract_epi8(xmm1, 0); + DFA_TRANSITION(state, octet); + + // octet 1 + octet = _mm_extract_epi8(xmm1, 1); + DFA_TRANSITION(state, octet); + + // octet 2 + octet = _mm_extract_epi8(xmm1, 2); + DFA_TRANSITION(state, octet); + + // octet 3 + octet = _mm_extract_epi8(xmm1, 3); + DFA_TRANSITION(state, octet); + + // octet 4 + octet = _mm_extract_epi8(xmm1, 4); + DFA_TRANSITION(state, octet); + + // octet 5 + octet = _mm_extract_epi8(xmm1, 5); + DFA_TRANSITION(state, octet); + + // octet 6 + octet = _mm_extract_epi8(xmm1, 6); + DFA_TRANSITION(state, octet); + + // octet 7 + octet = _mm_extract_epi8(xmm1, 7); + DFA_TRANSITION(state, octet); + + // octet 8 + octet = _mm_extract_epi8(xmm1, 8); + DFA_TRANSITION(state, octet); + + // octet 9 + octet = _mm_extract_epi8(xmm1, 9); + DFA_TRANSITION(state, octet); + + // octet 10 + octet = _mm_extract_epi8(xmm1, 10); + DFA_TRANSITION(state, octet); + + // octet 11 + octet = _mm_extract_epi8(xmm1, 11); + DFA_TRANSITION(state, octet); + + // octet 12 + octet = _mm_extract_epi8(xmm1, 12); + DFA_TRANSITION(state, octet); + + // octet 13 + octet = _mm_extract_epi8(xmm1, 13); + DFA_TRANSITION(state, octet); + + // octet 14 + octet = _mm_extract_epi8(xmm1, 14); + DFA_TRANSITION(state, octet); + + // octet 15 + octet = _mm_extract_epi8(xmm1, 15); + DFA_TRANSITION(state, octet); + } + ++ptr; + } + + // process unaligned tail (sub 16 octets) + // + const uint8_t* tail_ptr = (const uint8_t*) ptr; + + while (tail_ptr < tail_end && state != UTF8_REJECT) { + + // get tail octet + int octet = *tail_ptr; + + // do the DFA + DFA_TRANSITION(state, octet); + + ++tail_ptr; + } + + vld->state = state; + + if (state == UTF8_ACCEPT) { + // UTF8 is valid and ends on codepoint + return 0; + } else { + if (state == UTF8_REJECT) { + // UTF8 is invalid + return -1; + } else { + // UTF8 is valid, but does not end on codepoint (needs more data) + return 1; + } + } +} +#endif + + +int nvx_utf8vld_validate (void* utf8vld, const uint8_t* data, size_t length) { + + utf8_validator_t* vld = (utf8_validator_t*) utf8vld; + + switch (vld->impl) { + case UTF8_VALIDATOR_TABLE_DFA: + return _nvx_utf8vld_validate_table(utf8vld, data, length); + case UTF8_VALIDATOR_UNROLLED_DFA: + return _nvx_utf8vld_validate_unrolled(utf8vld, data, length); +#ifdef __SSE2__ + case UTF8_VALIDATOR_SSE2_DFA: + return _nvx_utf8vld_validate_table(utf8vld, data, length); +#endif +#ifdef __SSE4_1__ + case UTF8_VALIDATOR_SSE41_DFA: + return _nvx_utf8vld_validate_table(utf8vld, data, length); +#endif + default: + return _nvx_utf8vld_validate_table(utf8vld, data, length); + } +} diff --git a/venv/lib/python3.7/site-packages/autobahn/nvx/test/test_utf8validator.py b/venv/lib/python3.7/site-packages/autobahn/nvx/test/test_utf8validator.py new file mode 100644 index 0000000..f31ca2a --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/nvx/test/test_utf8validator.py @@ -0,0 +1,357 @@ +# coding=utf-8 + +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import six +import struct +import unittest + +from autobahn.websocket.utf8validator import Utf8Validator as StandardUtf8Validator + +try: + from _nvx_utf8validator import lib # noqa + from autobahn.nvx import Utf8Validator as NvxUtf8Validator +except ImportError: + HAS_NVX = False +else: + HAS_NVX = True + + +def _create_utf8_test_sequences(): + """ + Create test sequences for UTF-8 decoder tests from + http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + """ + + UTF8_TEST_SEQUENCES = [] + + # 1 Some correct UTF-8 text + vss = b'\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5' + vs = [b"Some valid UTF-8 sequences", []] + vs[1].append((True, b'hello\x24world')) # U+0024 + vs[1].append((True, b'hello\xC2\xA2world')) # U+00A2 + vs[1].append((True, b'hello\xE2\x82\xACworld')) # U+20AC + vs[1].append((True, b'hello\xF0\xA4\xAD\xA2world')) # U+24B62 + vs[1].append((True, vss)) + UTF8_TEST_SEQUENCES.append(vs) + + # All prefixes of correct UTF-8 text + vs = [ + b"All prefixes of a valid UTF-8 string that contains multi-byte code points", + []] + v = StandardUtf8Validator() + for i in range(1, len(vss) + 1): + v.reset() + res = v.validate(vss[:i]) + vs[1].append((res[0] and res[1], vss[:i])) + UTF8_TEST_SEQUENCES.append(vs) + + # 2.1 First possible sequence of a certain length + vs = [b"First possible sequence of a certain length", []] + vs[1].append((True, b'\x00')) + vs[1].append((True, b'\xc2\x80')) + vs[1].append((True, b'\xe0\xa0\x80')) + vs[1].append((True, b'\xf0\x90\x80\x80')) + UTF8_TEST_SEQUENCES.append(vs) + + # the following conform to the UTF-8 integer encoding scheme, but + # valid UTF-8 only allows for Unicode code points up to U+10FFFF + vs = [b"First possible sequence length 5/6 (invalid codepoints)", []] + vs[1].append((False, b'\xf8\x88\x80\x80\x80')) + vs[1].append((False, b'\xfc\x84\x80\x80\x80\x80')) + UTF8_TEST_SEQUENCES.append(vs) + + # 2.2 Last possible sequence of a certain length + vs = [b"Last possible sequence of a certain length", []] + vs[1].append((True, b'\x7f')) + vs[1].append((True, b'\xdf\xbf')) + vs[1].append((True, b'\xef\xbf\xbf')) + vs[1].append((True, b'\xf4\x8f\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + # the following conform to the UTF-8 integer encoding scheme, but + # valid UTF-8 only allows for Unicode code points up to U+10FFFF + vs = [b"Last possible sequence length 4/5/6 (invalid codepoints)", []] + vs[1].append((False, b'\xf7\xbf\xbf\xbf')) + vs[1].append((False, b'\xfb\xbf\xbf\xbf\xbf')) + vs[1].append((False, b'\xfd\xbf\xbf\xbf\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + # 2.3 Other boundary conditions + vs = [b"Other boundary conditions", []] + vs[1].append((True, b'\xed\x9f\xbf')) + vs[1].append((True, b'\xee\x80\x80')) + vs[1].append((True, b'\xef\xbf\xbd')) + vs[1].append((True, b'\xf4\x8f\xbf\xbf')) + vs[1].append((False, b'\xf4\x90\x80\x80')) + UTF8_TEST_SEQUENCES.append(vs) + + # 3.1 Unexpected continuation bytes + vs = [b"Unexpected continuation bytes", []] + vs[1].append((False, b'\x80')) + vs[1].append((False, b'\xbf')) + vs[1].append((False, b'\x80\xbf')) + vs[1].append((False, b'\x80\xbf\x80')) + vs[1].append((False, b'\x80\xbf\x80\xbf')) + vs[1].append((False, b'\x80\xbf\x80\xbf\x80')) + vs[1].append((False, b'\x80\xbf\x80\xbf\x80\xbf')) + s = b'' + + # 3.2 Lonely start characters + vs = [b"Lonely start characters", []] + m = [(0xc0, 0xdf), (0xe0, 0xef), (0xf0, 0xf7), (0xf8, 0xfb), (0xfc, 0xfd)] + for mm in m: + s = b'' + for i in range(mm[0], mm[1]): + s += struct.pack('BB', i, 0x20) + # s += chr(i) + # s += chr(0x20) + vs[1].append((False, s)) + UTF8_TEST_SEQUENCES.append(vs) + + # 3.3 Sequences with last continuation byte missing + vs = [b"Sequences with last continuation byte missing", []] + k = [b'\xc0', b'\xe0\x80', b'\xf0\x80\x80', b'\xf8\x80\x80\x80', b'\xfc\x80\x80\x80\x80', + b'\xdf', b'\xef\xbf', b'\xf7\xbf\xbf', b'\xfb\xbf\xbf\xbf', b'\xfd\xbf\xbf\xbf\xbf'] + for kk in k: + vs[1].append((False, kk)) + UTF8_TEST_SEQUENCES.append(vs) + + # 3.4 Concatenation of incomplete sequences + vs = [b"Concatenation of incomplete sequences", []] + vs[1].append((False, b''.join(k))) + UTF8_TEST_SEQUENCES.append(vs) + + # 3.5 Impossible bytes + vs = [b"Impossible bytes", []] + vs[1].append((False, b'\xfe')) + vs[1].append((False, b'\xff')) + vs[1].append((False, b'\xfe\xfe\xff\xff')) + UTF8_TEST_SEQUENCES.append(vs) + + # 4.1 Examples of an overlong ASCII character + vs = [b"Examples of an overlong ASCII character", []] + vs[1].append((False, b'\xc0\xaf')) + vs[1].append((False, b'\xe0\x80\xaf')) + vs[1].append((False, b'\xf0\x80\x80\xaf')) + vs[1].append((False, b'\xf8\x80\x80\x80\xaf')) + vs[1].append((False, b'\xfc\x80\x80\x80\x80\xaf')) + UTF8_TEST_SEQUENCES.append(vs) + + # 4.2 Maximum overlong sequences + vs = [b"Maximum overlong sequences", []] + vs[1].append((False, b'\xc1\xbf')) + vs[1].append((False, b'\xe0\x9f\xbf')) + vs[1].append((False, b'\xf0\x8f\xbf\xbf')) + vs[1].append((False, b'\xf8\x87\xbf\xbf\xbf')) + vs[1].append((False, b'\xfc\x83\xbf\xbf\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + # 4.3 Overlong representation of the NUL character + vs = [b"Overlong representation of the NUL character", []] + vs[1].append((False, b'\xc0\x80')) + vs[1].append((False, b'\xe0\x80\x80')) + vs[1].append((False, b'\xf0\x80\x80\x80')) + vs[1].append((False, b'\xf8\x80\x80\x80\x80')) + vs[1].append((False, b'\xfc\x80\x80\x80\x80\x80')) + UTF8_TEST_SEQUENCES.append(vs) + + # 5.1 Single UTF-16 surrogates + vs = [b"Single UTF-16 surrogates", []] + vs[1].append((False, b'\xed\xa0\x80')) + vs[1].append((False, b'\xed\xad\xbf')) + vs[1].append((False, b'\xed\xae\x80')) + vs[1].append((False, b'\xed\xaf\xbf')) + vs[1].append((False, b'\xed\xb0\x80')) + vs[1].append((False, b'\xed\xbe\x80')) + vs[1].append((False, b'\xed\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + # 5.2 Paired UTF-16 surrogates + vs = [b"Paired UTF-16 surrogates", []] + vs[1].append((False, b'\xed\xa0\x80\xed\xb0\x80')) + vs[1].append((False, b'\xed\xa0\x80\xed\xbf\xbf')) + vs[1].append((False, b'\xed\xad\xbf\xed\xb0\x80')) + vs[1].append((False, b'\xed\xad\xbf\xed\xbf\xbf')) + vs[1].append((False, b'\xed\xae\x80\xed\xb0\x80')) + vs[1].append((False, b'\xed\xae\x80\xed\xbf\xbf')) + vs[1].append((False, b'\xed\xaf\xbf\xed\xb0\x80')) + vs[1].append((False, b'\xed\xaf\xbf\xed\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + # 5.3 Other illegal code positions + # Those are non-character code points and valid UTF-8 by RFC 3629 + vs = [b"Non-character code points (valid UTF-8)", []] + # https://bug686312.bugzilla.mozilla.org/attachment.cgi?id=561257 + # non-characters: EF BF [BE-BF] + vs[1].append((True, b'\xef\xbf\xbe')) + vs[1].append((True, b'\xef\xbf\xbf')) + # non-characters: F[0-7] [89AB]F BF [BE-BF] + for z1 in [b'\xf0', b'\xf1', b'\xf2', b'\xf3', b'\xf4']: + for z2 in [b'\x8f', b'\x9f', b'\xaf', b'\xbf']: + # those encode codepoints >U+10FFFF + if not (z1 == b'\xf4' and z2 != b'\x8f'): + for z3 in [b'\xbe', b'\xbf']: + zz = z1 + z2 + b'\xbf' + z3 + if zz not in [b'\xf0\x8f\xbf\xbe', + b'\xf0\x8f\xbf\xbf']: # filter overlong sequences + vs[1].append((True, zz)) + UTF8_TEST_SEQUENCES.append(vs) + + # Unicode "specials", such as replacement char etc + # http://en.wikipedia.org/wiki/Specials_%28Unicode_block%29 + vs = [b"Unicode specials (i.e. replacement char)", []] + vs[1].append((True, b'\xef\xbf\xb9')) + vs[1].append((True, b'\xef\xbf\xba')) + vs[1].append((True, b'\xef\xbf\xbb')) + vs[1].append((True, b'\xef\xbf\xbc')) + vs[1].append((True, b'\xef\xbf\xbd')) # replacement char + vs[1].append((True, b'\xef\xbf\xbe')) + vs[1].append((True, b'\xef\xbf\xbf')) + UTF8_TEST_SEQUENCES.append(vs) + + return UTF8_TEST_SEQUENCES + + +def _create_valid_utf8_test_sequences(): + """ + Generate some exotic, but valid UTF8 test strings. + """ + VALID_UTF8_TEST_SEQUENCES = [] + for test in _create_utf8_test_sequences(): + valids = [x[1] for x in test[1] if x[0]] + if len(valids) > 0: + VALID_UTF8_TEST_SEQUENCES.append([test[0], valids]) + return VALID_UTF8_TEST_SEQUENCES + + +@unittest.skipIf(not HAS_NVX, 'NVX native extensions not present') +class TestNvxUtf8Validator(unittest.TestCase): + + def setUp(self): + # These tests verify the UTF-8 decoder/validator on the various test cases from + # http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + vs = [] + for k in _create_utf8_test_sequences(): + vs.extend(k[1]) + + # All Unicode code points + for i in range( + 0, 0xffff): # should by 0x10ffff, but non-wide Python build is limited to 16-bits + if i < 0xD800 or i > 0xDFFF: # filter surrogate code points, which are disallowed to encode in UTF-8 + vs.append((True, six.unichr(i).encode("utf-8"))) + + # FIXME: UnicodeEncodeError: 'utf-8' codec can't encode character '\ud800' + # in position 0: surrogates not allowed + if False: + # 5.1 Single UTF-16 surrogates + for i in range(0xD800, 0xDBFF): # high-surrogate + ss = six.unichr(i).encode("utf-8") + vs.append((False, ss)) + for i in range(0xDC00, 0xDFFF): # low-surrogate + ss = six.unichr(i).encode("utf-8") + vs.append((False, ss)) + + # 5.2 Paired UTF-16 surrogates + for i in range(0xD800, 0xDBFF): # high-surrogate + for j in range(0xDC00, 0xDFFF): # low-surrogate + ss1 = six.unichr(i).encode("utf-8") + ss2 = six.unichr(j).encode("utf-8") + vs.append((False, ss1 + ss2)) + vs.append((False, ss2 + ss1)) + + self._TEST_SEQUENCES = vs + + def test_standard_utf8validator(self): + """ + Test standard implementation of UTF8 validator. + """ + validator = StandardUtf8Validator() + return self._test_utf8(validator) + + def test_nvx_utf8validator(self): + """ + Test NVX implementation of UTF8 validator. + """ + validator = NvxUtf8Validator() + return self._test_utf8(validator) + + def test_standard_utf8validator_incremental(self): + """ + Test standard implementation of UTF8 validator in incremental mode. + """ + validator = StandardUtf8Validator() + return self._test_utf8_incremental(validator) + + # NVX UTF8 validator lack incremental mode implementation + @unittest.expectedFailure + def test_nvx_utf8validator_incremental(self): + """ + Test NVX implementation of UTF8 validator in incremental mode. + """ + validator = NvxUtf8Validator() + return self._test_utf8_incremental(validator) + + def _test_utf8(self, validator): + for s in self._TEST_SEQUENCES: + validator.reset() + r = validator.validate(s[1]) + + # no UTF-8 decode error _and_ everything consumed + res = r[0] and r[1] + + self.assertEqual(res, s[0]) + + def _test_utf8_incremental(self, validator, withPositions=True): + # These tests verify that the UTF-8 decoder/validator can operate incrementally. + if withPositions: + # testing validator 4 on incremental detection with positions + k = 4 + else: + # testing validator 2 on incremental detection without positions + k = 2 + + validator.reset() + self.assertEqual((True, True, 15, 15)[:k], validator.validate(u'µ@ßöäüàá'.encode('utf8'))[:k]) + + validator.reset() + self.assertEqual((False, False, 0, 0)[:k], validator.validate(b"\xF5")[:k]) + + # the following 3 all fail on eating byte 7 (0xA0) + validator.reset() + self.assertEqual((True, True, 6, 6)[:k], validator.validate(b"\x65\x64\x69\x74\x65\x64")[:k]) + self.assertEqual((False, False, 1, 7)[:k], validator.validate(b"\xED\xA0\x80")[:k]) + + validator.reset() + self.assertEqual((True, True, 4, 4)[:k], validator.validate(b"\x65\x64\x69\x74")[:k]) + self.assertEqual((False, False, 3, 7)[:k], validator.validate(b"\x65\x64\xED\xA0\x80")[:k]) + + validator.reset() + self.assertEqual((True, False, 7, 7)[:k], validator.validate(b"\x65\x64\x69\x74\x65\x64\xED")[:k]) + self.assertEqual((False, False, 0, 7)[:k], validator.validate(b"\xA0\x80")[:k]) diff --git a/venv/lib/python3.7/site-packages/autobahn/rawsocket/test/test_rawsocket_url.py b/venv/lib/python3.7/site-packages/autobahn/rawsocket/test/test_rawsocket_url.py new file mode 100644 index 0000000..6b11fa8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/rawsocket/test/test_rawsocket_url.py @@ -0,0 +1,126 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import unittest + +from autobahn.rawsocket.util import create_url, parse_url + + +class TestCreateRsUrl(unittest.TestCase): + + def test_create_url01(self): + self.assertEqual(create_url("localhost"), "rs://localhost:80") + + def test_create_url02(self): + self.assertEqual(create_url("localhost", port=8090), "rs://localhost:8090") + + def test_create_url03(self): + self.assertEqual(create_url("localhost", isSecure=True), "rss://localhost:443") + + def test_create_url04(self): + self.assertEqual(create_url("localhost", isSecure=True, port=443), "rss://localhost:443") + + def test_create_url05(self): + self.assertEqual(create_url("localhost", isSecure=True, port=80), "rss://localhost:80") + + def test_create_url06(self): + self.assertEqual(create_url("unix", port="file.sock"), "rs://unix:file.sock") + + def test_create_url07(self): + self.assertEqual(create_url("unix", port="/tmp/file.sock"), "rs://unix:/tmp/file.sock") + + def test_create_url08(self): + self.assertEqual(create_url("unix", port="../file.sock"), "rs://unix:../file.sock") + + def test_create_url09(self): + self.assertEqual(create_url("unix", isSecure=True, port="file.sock"), "rss://unix:file.sock") + + def test_create_url10(self): + self.assertEqual(create_url("unix", isSecure=True, port="/tmp/file.sock"), "rss://unix:/tmp/file.sock") + + def test_create_url11(self): + self.assertEqual(create_url("unix", isSecure=True, port="../file.sock"), "rss://unix:../file.sock") + + +class TestParseWsUrl(unittest.TestCase): + + # parse_url -> (isSecure, host, port) + + def test_parse_url01(self): + self.assertEqual(parse_url("rs://localhost"), (False, 'localhost', 80)) + + def test_parse_url02(self): + self.assertEqual(parse_url("rss://localhost"), (True, 'localhost', 443)) + + def test_parse_url03(self): + self.assertEqual(parse_url("rs://localhost:9000"), (False, 'localhost', 9000)) + + def test_parse_url04(self): + self.assertEqual(parse_url("rss://localhost:9000"), (True, 'localhost', 9000)) + + def test_parse_url05(self): + self.assertRaises(Exception, parse_url, "ws://localhost") + + def test_parse_url06(self): + self.assertRaises(Exception, parse_url, "wss://localhost") + + def test_parse_url07(self): + self.assertRaises(Exception, parse_url, "ws://localhost:80") + + def test_parse_url08(self): + self.assertRaises(Exception, parse_url, "rs://localhost/somepath") + + def test_parse_url09(self): + self.assertRaises(Exception, parse_url, "rs://localhost#somefrag") + + def test_parse_url10(self): + self.assertRaises(Exception, parse_url, "rs://localhost?foo=bar") + + def test_parse_url11(self): + self.assertRaises(Exception, parse_url, "rss://") + + def test_parse_url12(self): + self.assertRaises(Exception, parse_url, "rs://") + + def test_parse_url13(self): + self.assertEqual(parse_url("rs://unix:file.sock"), (False, 'unix', 'file.sock')) + + def test_parse_url14(self): + self.assertEqual(parse_url("rs://unix:/tmp/file.sock"), (False, 'unix', '/tmp/file.sock')) + + def test_parse_url15(self): + self.assertEqual(parse_url("rs://unix:../file.sock"), (False, 'unix', '../file.sock')) + + def test_parse_url16(self): + self.assertEqual(parse_url("rss://unix:file.sock"), (True, 'unix', 'file.sock')) + + def test_parse_url17(self): + self.assertEqual(parse_url("rss://unix:/tmp/file.sock"), (True, 'unix', '/tmp/file.sock')) + + def test_parse_url18(self): + self.assertEqual(parse_url("rss://unix:../file.sock"), (True, 'unix', '../file.sock')) diff --git a/venv/lib/python3.7/site-packages/autobahn/test/test_rng.py b/venv/lib/python3.7/site-packages/autobahn/test/test_rng.py new file mode 100644 index 0000000..5bf728c --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/test/test_rng.py @@ -0,0 +1,111 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import sys +import unittest + +import uuid +import random +from nacl import utils, public + +from autobahn import util + + +@unittest.skipIf(not sys.platform.startswith('linux'), 'entropy depletion tests only available on Linux') +class TestEntropy(unittest.TestCase): + + def test_non_depleting(self): + res = {} + + with open('/dev/urandom', 'rb') as rng: + for i in range(1000): + for j in range(100): + + # "reseed" (seems pointless, but ..) + random.seed() + + # random UUIDs + v1 = uuid.uuid4() # noqa + + # stdlib random + v2 = random.random() # noqa + v3 = random.getrandbits(32) # noqa + v4 = random.randint(0, 9007199254740992) # noqa + v5 = random.normalvariate(10, 100) # noqa + v6 = random.choice(range(100)) # noqa + + # PyNaCl + v7 = utils.random(public.Box.NONCE_SIZE) # noqa + + # Autobahn utils + v8 = util.generate_token(4, 4) # noqa + v9 = util.id() # noqa + v10 = util.rid() # noqa + v11 = util.newid() # noqa + + # direct procfs access to PRNG + d = rng.read(1000) # noqa + + # check available entropy + with open('/proc/sys/kernel/random/entropy_avail', 'r') as ent: + ea = int(ent.read()) // 100 + if ea not in res: + res[ea] = 0 + res[ea] += 1 + + skeys = sorted(res.keys()) + + print('\nsystem entropy depletion stats:') + for k in skeys: + print('{}: {}'.format(k, res[k])) + + self.assertTrue(skeys[0] > 10) + + def test_depleting(self): + res = {} + + with open('/dev/random', 'rb') as rng: + for i in range(10000): + + # direct procfs access to "real" RNG + d = rng.read(1000) # noqa + + # check available entropy + with open('/proc/sys/kernel/random/entropy_avail', 'r') as ent: + ea = int(ent.read()) // 100 + if ea not in res: + res[ea] = 0 + res[ea] += 1 + + skeys = sorted(res.keys()) + + print('\nsystem entropy depletion stats:') + for k in skeys: + print('{}: {}'.format(k, res[k])) + + self.assertTrue(skeys[0] == 0) diff --git a/venv/lib/python3.7/site-packages/autobahn/test/test_util.py b/venv/lib/python3.7/site-packages/autobahn/test/test_util.py new file mode 100644 index 0000000..bf0652b --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/test/test_util.py @@ -0,0 +1,48 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import unittest + +from autobahn.util import IdGenerator + + +class TestIdGenerator(unittest.TestCase): + def test_idgenerator_is_generator(self): + "IdGenerator follows the generator protocol" + g = IdGenerator() + self.assertEqual(1, next(g)) + self.assertEqual(2, next(g)) + + def test_generator_wrap(self): + g = IdGenerator() + g._next = 2 ** 53 - 1 # cheat a little + + v = next(g) + self.assertEqual(v, 2 ** 53) + v = next(g) + self.assertEqual(v, 1) diff --git a/venv/lib/python3.7/site-packages/autobahn/twisted/__init__.py b/venv/lib/python3.7/site-packages/autobahn/twisted/__init__.py new file mode 100644 index 0000000..80e24ad --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/twisted/__init__.py @@ -0,0 +1,89 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + + +from __future__ import absolute_import + +import sys +import platform + +import twisted + +import autobahn + +# Twisted specific utilities (these should really be in Twisted, but +# they aren't, and we use these in example code, so it must be part of +# the public API) +from autobahn.twisted.util import sleep +from autobahn.twisted.choosereactor import install_reactor + +# WebSocket protocol support +from autobahn.twisted.websocket import \ + WebSocketServerProtocol, \ + WebSocketClientProtocol, \ + WebSocketServerFactory, \ + WebSocketClientFactory + +# support for running Twisted stream protocols over WebSocket +from autobahn.twisted.websocket import WrappingWebSocketServerFactory, \ + WrappingWebSocketClientFactory + +# Twisted Web support - FIXME: these imports trigger import of Twisted reactor! +# from autobahn.twisted.resource import WebSocketResource, WSGIRootResource + +# WAMP support +from autobahn.twisted.wamp import ApplicationSession + + +__all__ = ( + # this should really be in Twisted + 'sleep', + 'install_reactor', + + # WebSocket + 'WebSocketServerProtocol', + 'WebSocketClientProtocol', + 'WebSocketServerFactory', + 'WebSocketClientFactory', + + # wrapping stream protocols in WebSocket + 'WrappingWebSocketServerFactory', + 'WrappingWebSocketClientFactory', + + # Twisted Web - FIXME: see comment for import above + # 'WebSocketResource', + + # this should really be in Twisted - FIXME: see comment for import above + # 'WSGIRootResource', + + # WAMP support + 'ApplicationSession', +) + +__ident__ = u'Autobahn/{}-Twisted/{}-{}/{}'.format(autobahn.__version__, twisted.__version__, platform.python_implementation(), '.'.join([str(x) for x in list(sys.version_info[:3])])) +""" +AutobahnPython library implementation (eg. "Autobahn/0.13.0-Twisted/15.5.0-CPython/3.5.1") +""" diff --git a/venv/lib/python3.7/site-packages/autobahn/util.py b/venv/lib/python3.7/site-packages/autobahn/util.py new file mode 100644 index 0000000..c248459 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/util.py @@ -0,0 +1,870 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", fWITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import os +import time +import struct +import sys +import re +import base64 +import math +import random +import binascii +from datetime import datetime, timedelta +from pprint import pformat +from array import array + +import six + +import txaio + +try: + _TLS = True + from OpenSSL import SSL +except ImportError: + _TLS = False + + +__all__ = ("public", + "encode_truncate", + "xor", + "utcnow", + "utcstr", + "id", + "rid", + "newid", + "rtime", + "Stopwatch", + "Tracker", + "EqualityMixin", + "ObservableMixin", + "IdGenerator", + "generate_token", + "generate_activation_code", + "generate_serial_number", + "generate_user_password") + + +def public(obj): + """ + The public user API of Autobahn is marked using this decorator. + Everything that is not decorated @public is library internal, can + change at any time and should not be used in user program code. + """ + try: + obj._is_public = True + except AttributeError: + # FIXME: exceptions.AttributeError: 'staticmethod' object has no attribute '_is_public' + pass + return obj + + +@public +def encode_truncate(text, limit, encoding='utf8', return_encoded=True): + """ + Given a string, return a truncated version of the string such that + the UTF8 encoding of the string is smaller than the given limit. + + This function correctly truncates even in the presence of Unicode code + points that encode to multi-byte encodings which must not be truncated + in the middle. + + :param text: The (Unicode) string to truncate. + :type text: str + :param limit: The number of bytes to limit the UTF8 encoding to. + :type limit: int + :param encoding: Truncate the string in this encoding (default is ``utf-8``). + :type encoding: str + :param return_encoded: If ``True``, return the string encoded into bytes + according to the specified encoding, else return the string as a string. + :type return_encoded: bool + + :returns: The truncated string. + :rtype: str or bytes + """ + assert(text is None or type(text) == six.text_type) + assert(type(limit) in six.integer_types) + assert(limit >= 0) + + if text is None: + return + + # encode the given string in the specified encoding + s = text.encode(encoding) + + # when the resulting byte string is longer than the given limit .. + if len(s) > limit: + # .. truncate, and + s = s[:limit] + + # decode back, ignoring errors that result from truncation + # in the middle of multi-byte encodings + text = s.decode(encoding, 'ignore') + + if return_encoded: + s = text.encode(encoding) + + if return_encoded: + return s + else: + return text + + +@public +def xor(d1, d2): + """ + XOR two binary strings of arbitrary (equal) length. + + :param d1: The first binary string. + :type d1: binary + :param d2: The second binary string. + :type d2: binary + + :returns: XOR of the binary strings (``XOR(d1, d2)``) + :rtype: bytes + """ + if type(d1) != six.binary_type: + raise Exception("invalid type {} for d1 - must be binary".format(type(d1))) + if type(d2) != six.binary_type: + raise Exception("invalid type {} for d2 - must be binary".format(type(d2))) + if len(d1) != len(d2): + raise Exception("cannot XOR binary string of differing length ({} != {})".format(len(d1), len(d2))) + + d1 = array('B', d1) + d2 = array('B', d2) + + for i in range(len(d1)): + d1[i] ^= d2[i] + + if six.PY3: + return d1.tobytes() + else: + return d1.tostring() + + +@public +def utcstr(ts=None): + """ + Format UTC timestamp in ISO 8601 format. + + Note: to parse an ISO 8601 formatted string, use the **iso8601** + module instead (e.g. ``iso8601.parse_date("2014-05-23T13:03:44.123Z")``). + + :param ts: The timestamp to format. + :type ts: instance of :py:class:`datetime.datetime` or ``None`` + + :returns: Timestamp formatted in ISO 8601 format. + :rtype: str + """ + assert(ts is None or isinstance(ts, datetime)) + if ts is None: + ts = datetime.utcnow() + return u"{0}Z".format(ts.strftime(u"%Y-%m-%dT%H:%M:%S.%f")[:-3]) + + +@public +def utcnow(): + """ + Get current time in UTC as ISO 8601 string. + + :returns: Current time as string in ISO 8601 format. + :rtype: str + """ + return utcstr() + + +class IdGenerator(object): + """ + ID generator for WAMP request IDs. + + WAMP request IDs are sequential per WAMP session, starting at 1 and + wrapping around at 2**53 (both value are inclusive [1, 2**53]). + + The upper bound **2**53** is chosen since it is the maximum integer that can be + represented as a IEEE double such that all smaller integers are representable as well. + + Hence, IDs can be safely used with languages that use IEEE double as their + main (or only) number type (JavaScript, Lua, etc). + + See https://github.com/wamp-proto/wamp-proto/blob/master/spec/basic.md#ids + """ + + def __init__(self): + self._next = 0 # starts at 1; next() pre-increments + + def next(self): + """ + Returns next ID. + + :returns: The next ID. + :rtype: int + """ + self._next += 1 + if self._next > 9007199254740992: + self._next = 1 + return self._next + + # generator protocol + def __next__(self): + return self.next() + + +# +# Performance comparison of IdGenerator.next(), id() and rid(). +# +# All tests were performed on: +# +# - Ubuntu 14.04 LTS x86-64 +# - Intel Core i7 920 @ 3.3GHz +# +# The tests generated 100 mio. IDs and run-time was measured +# as wallclock from Unix "time" command. In each run, a single CPU +# core was essentially at 100% load all the time (though the sys/usr +# ratio was different). +# +# PyPy 2.6.1: +# +# IdGenerator.next() 0.5s +# id() 29.4s +# rid() 106.1s +# +# CPython 2.7.10: +# +# IdGenerator.next() 49.0s +# id() 370.5s +# rid() 196.4s +# + +# +# Note on the ID range [0, 2**53]. We once reduced the range to [0, 2**31]. +# This lead to extremely hard to track down issues due to ID collisions! +# Here: https://github.com/crossbario/autobahn-python/issues/419#issue-90483337 +# + + +# 8 byte mask with 53 LSBs set (WAMP requires IDs from [0, 2**53] +_WAMP_ID_MASK = struct.unpack(">Q", b"\x00\x1f\xff\xff\xff\xff\xff\xff")[0] + + +def rid(): + """ + Generate a new random integer ID from range **[0, 2**53]**. + + The generated ID is uniformly distributed over the whole range, doesn't have + a period (no pseudo-random generator is used) and cryptographically strong. + + The upper bound **2**53** is chosen since it is the maximum integer that can be + represented as a IEEE double such that all smaller integers are representable as well. + + Hence, IDs can be safely used with languages that use IEEE double as their + main (or only) number type (JavaScript, Lua, etc). + + :returns: A random integer ID. + :rtype: int + """ + return struct.unpack("@Q", os.urandom(8))[0] & _WAMP_ID_MASK + + +# noinspection PyShadowingBuiltins +def id(): + """ + Generate a new random integer ID from range **[0, 2**53]**. + + The generated ID is based on a pseudo-random number generator (Mersenne Twister, + which has a period of 2**19937-1). It is NOT cryptographically strong, and + hence NOT suitable to generate e.g. secret keys or access tokens. + + The upper bound **2**53** is chosen since it is the maximum integer that can be + represented as a IEEE double such that all smaller integers are representable as well. + + Hence, IDs can be safely used with languages that use IEEE double as their + main (or only) number type (JavaScript, Lua, etc). + + :returns: A random integer ID. + :rtype: int + """ + return random.randint(0, 9007199254740992) + + +def newid(length=16): + """ + Generate a new random string ID. + + The generated ID is uniformly distributed and cryptographically strong. It is + hence usable for things like secret keys and access tokens. + + :param length: The length (in chars) of the ID to generate. + :type length: int + + :returns: A random string ID. + :rtype: str + """ + l = int(math.ceil(float(length) * 6. / 8.)) + return base64.b64encode(os.urandom(l))[:length].decode('ascii') + + +# a standard base36 character set +# DEFAULT_TOKEN_CHARS = string.digits + string.ascii_uppercase + +# we take out the following 9 chars (leaving 27), because there +# is visual ambiguity: 0/O/D, 1/I, 8/B, 2/Z +DEFAULT_TOKEN_CHARS = u'345679ACEFGHJKLMNPQRSTUVWXY' +""" +Default set of characters to create rtokens from. +""" + +DEFAULT_ZBASE32_CHARS = u'13456789abcdefghijkmnopqrstuwxyz' +""" +Our choice of confusing characters to eliminate is: `0', `l', `v', and `2'. Our +reasoning is that `0' is potentially mistaken for `o', that `l' is potentially +mistaken for `1' or `i', that `v' is potentially mistaken for `u' or `r' +(especially in handwriting) and that `2' is potentially mistaken for `z' +(especially in handwriting). + +Note that we choose to focus on typed and written transcription more than on +vocal, since humans already have a well-established system of disambiguating +spoken alphanumerics, such as the United States military's "Alpha Bravo Charlie +Delta" and telephone operators' "Is that 'd' as in 'dog'?". + +* http://philzimmermann.com/docs/human-oriented-base-32-encoding.txt +""" + + +@public +def generate_token(char_groups, chars_per_group, chars=None, sep=None, lower_case=False): + """ + Generate cryptographically strong tokens, which are strings like `M6X5-YO5W-T5IK`. + These can be used e.g. for used-only-once activation tokens or the like. + + The returned token has an entropy of + ``math.log(len(chars), 2.) * chars_per_group * char_groups`` + bits. + + With the default charset and 4 characters per group, ``generate_token()`` produces + strings with the following entropy: + + ================ =================== ======================================== + character groups entropy (at least) recommended use + ================ =================== ======================================== + 2 38 bits + 3 57 bits one-time activation or pairing code + 4 76 bits secure user password + 5 95 bits + 6 114 bits globally unique serial / product code + 7 133 bits + ================ =================== ======================================== + + Here are some examples: + + * token(3): ``9QXT-UXJW-7R4H`` + * token(4): ``LPNN-JMET-KWEP-YK45`` + * token(6): ``NXW9-74LU-6NUH-VLPV-X6AG-QUE3`` + + :param char_groups: Number of character groups (or characters if chars_per_group == 1). + :type char_groups: int + + :param chars_per_group: Number of characters per character group (or 1 to return a token with no grouping). + :type chars_per_group: int + + :param chars: Characters to choose from. Default is 27 character subset + of the ISO basic Latin alphabet (see: ``DEFAULT_TOKEN_CHARS``). + :type chars: str or None + + :param sep: When separating groups in the token, the separater string. + :type sep: str + + :param lower_case: If ``True``, generate token in lower-case. + :type lower_case: bool + + :returns: The generated token. + :rtype: str + """ + assert(type(char_groups) in six.integer_types) + assert(type(chars_per_group) in six.integer_types) + assert(chars is None or type(chars) == six.text_type) + chars = chars or DEFAULT_TOKEN_CHARS + if lower_case: + chars = chars.lower() + sep = sep or u'-' + rng = random.SystemRandom() + token_value = u''.join(rng.choice(chars) for _ in range(char_groups * chars_per_group)) + if chars_per_group > 1: + return sep.join(map(u''.join, zip(*[iter(token_value)] * chars_per_group))) + else: + return token_value + + +@public +def generate_activation_code(): + """ + Generate a one-time activation code or token of the form ``u'W97F-96MJ-YGJL'``. + The generated value is cryptographically strong and has (at least) 57 bits of entropy. + + :returns: The generated activation code. + :rtype: str + """ + return generate_token(char_groups=3, chars_per_group=4, chars=DEFAULT_TOKEN_CHARS, sep=u'-', lower_case=False) + + +@public +def generate_user_password(): + """ + Generate a secure, random user password of the form ``u'kgojzi61dn5dtb6d'``. + The generated value is cryptographically strong and has (at least) 76 bits of entropy. + + :returns: The generated password. + :rtype: str + """ + return generate_token(char_groups=16, chars_per_group=1, chars=DEFAULT_ZBASE32_CHARS, sep=u'-', lower_case=True) + + +@public +def generate_serial_number(): + """ + Generate a globally unique serial / product code of the form ``u'YRAC-EL4X-FQQE-AW4T-WNUV-VN6T'``. + The generated value is cryptographically strong and has (at least) 114 bits of entropy. + + :returns: The generated serial number / product code. + :rtype: str + """ + return generate_token(char_groups=6, chars_per_group=4, chars=DEFAULT_TOKEN_CHARS, sep=u'-', lower_case=False) + + +# Select the most precise walltime measurement function available +# on the platform +# +if sys.platform.startswith('win'): + # On Windows, this function returns wall-clock seconds elapsed since the + # first call to this function, as a floating point number, based on the + # Win32 function QueryPerformanceCounter(). The resolution is typically + # better than one microsecond + if sys.version_info >= (3, 8): + _rtime = time.perf_counter + else: + _rtime = time.clock + _ = _rtime() # this starts wallclock +else: + # On Unix-like platforms, this used the first available from this list: + # (1) gettimeofday() -- resolution in microseconds + # (2) ftime() -- resolution in milliseconds + # (3) time() -- resolution in seconds + _rtime = time.time + + +@public +def rtime(): + """ + Precise, fast wallclock time. + + :returns: The current wallclock in seconds. Returned values are only guaranteed + to be meaningful relative to each other. + :rtype: float + """ + return _rtime() + + +class Stopwatch(object): + """ + Stopwatch based on walltime. + + This can be used to do code timing and uses the most precise walltime measurement + available on the platform. This is a very light-weight object, + so create/dispose is very cheap. + """ + + def __init__(self, start=True): + """ + + :param start: If ``True``, immediately start the stopwatch. + :type start: bool + """ + self._elapsed = 0 + if start: + self._started = rtime() + self._running = True + else: + self._started = None + self._running = False + + def elapsed(self): + """ + Return total time elapsed in seconds during which the stopwatch was running. + + :returns: The elapsed time in seconds. + :rtype: float + """ + if self._running: + now = rtime() + return self._elapsed + (now - self._started) + else: + return self._elapsed + + def pause(self): + """ + Pauses the stopwatch and returns total time elapsed in seconds during which + the stopwatch was running. + + :returns: The elapsed time in seconds. + :rtype: float + """ + if self._running: + now = rtime() + self._elapsed += now - self._started + self._running = False + return self._elapsed + else: + return self._elapsed + + def resume(self): + """ + Resumes a paused stopwatch and returns total elapsed time in seconds + during which the stopwatch was running. + + :returns: The elapsed time in seconds. + :rtype: float + """ + if not self._running: + self._started = rtime() + self._running = True + return self._elapsed + else: + now = rtime() + return self._elapsed + (now - self._started) + + def stop(self): + """ + Stops the stopwatch and returns total time elapsed in seconds during which + the stopwatch was (previously) running. + + :returns: The elapsed time in seconds. + :rtype: float + """ + elapsed = self.pause() + self._elapsed = 0 + self._started = None + self._running = False + return elapsed + + +class Tracker(object): + """ + A key-based statistics tracker. + """ + + def __init__(self, tracker, tracked): + """ + """ + self.tracker = tracker + self.tracked = tracked + self._timings = {} + self._offset = rtime() + self._dt_offset = datetime.utcnow() + + def track(self, key): + """ + Track elapsed for key. + + :param key: Key under which to track the timing. + :type key: str + """ + self._timings[key] = rtime() + + def diff(self, start_key, end_key, formatted=True): + """ + Get elapsed difference between two previously tracked keys. + + :param start_key: First key for interval (older timestamp). + :type start_key: str + :param end_key: Second key for interval (younger timestamp). + :type end_key: str + :param formatted: If ``True``, format computed time period and return string. + :type formatted: bool + + :returns: Computed time period in seconds (or formatted string). + :rtype: float or str + """ + if end_key in self._timings and start_key in self._timings: + d = self._timings[end_key] - self._timings[start_key] + if formatted: + if d < 0.00001: # 10us + s = "%d ns" % round(d * 1000000000.) + elif d < 0.01: # 10ms + s = "%d us" % round(d * 1000000.) + elif d < 10: # 10s + s = "%d ms" % round(d * 1000.) + else: + s = "%d s" % round(d) + return s.rjust(8) + else: + return d + else: + if formatted: + return "n.a.".rjust(8) + else: + return None + + def absolute(self, key): + """ + Return the UTC wall-clock time at which a tracked event occurred. + + :param key: The key + :type key: str + + :returns: Timezone-naive datetime. + :rtype: instance of :py:class:`datetime.datetime` + """ + elapsed = self[key] + if elapsed is None: + raise KeyError("No such key \"%s\"." % elapsed) + return self._dt_offset + timedelta(seconds=elapsed) + + def __getitem__(self, key): + if key in self._timings: + return self._timings[key] - self._offset + else: + return None + + def __iter__(self): + return self._timings.__iter__() + + def __str__(self): + return pformat(self._timings) + + +class EqualityMixin(object): + """ + Mixing to add equality comparison operators to a class. + + Two objects are identical under this mixin, if and only if: + + 1. both object have the same class + 2. all non-private object attributes are equal + """ + + def __eq__(self, other): + """ + Compare this object to another object for equality. + + :param other: The other object to compare with. + :type other: obj + + :returns: ``True`` iff the objects are equal. + :rtype: bool + """ + if not isinstance(other, self.__class__): + return False + # we only want the actual message data attributes (not eg _serialize) + for k in self.__dict__: + if not k.startswith('_'): + if not self.__dict__[k] == other.__dict__[k]: + return False + return True + # return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__) + + def __ne__(self, other): + """ + Compare this object to another object for inequality. + + :param other: The other object to compare with. + :type other: obj + + :returns: ``True`` iff the objects are not equal. + :rtype: bool + """ + return not self.__eq__(other) + + +def wildcards2patterns(wildcards): + """ + Compute a list of regular expression patterns from a list of + wildcard strings. A wildcard string uses '*' as a wildcard character + matching anything. + + :param wildcards: List of wildcard strings to compute regular expression patterns for. + :type wildcards: list of str + + :returns: Computed regular expressions. + :rtype: list of obj + """ + # note that we add the ^ and $ so that the *entire* string must + # match. Without this, e.g. a prefix will match: + # re.match('.*good\\.com', 'good.com.evil.com') # match! + # re.match('.*good\\.com$', 'good.com.evil.com') # no match! + return [re.compile('^' + wc.replace('.', r'\.').replace('*', '.*') + '$') for wc in wildcards] + + +class ObservableMixin(object): + """ + Internal utility for enabling event-listeners on particular objects + """ + + # A "helper" style composable class (as opposed to a mix-in) might + # be a lot easier to deal with here. Having an __init__ method + # with a "mix in" style class can be fragile and error-prone, + # especially if it takes arguments. Since we don't use the + # "parent" beavior anywhere, I didn't add a .set_parent() (yet?) + + # these are class-level globals; individual instances are + # initialized as-needed (e.g. the first .on() call adds a + # _listeners dict). Thus, subclasses don't have to call super() + # properly etc. + _parent = None + _valid_events = None + _listeners = None + + def set_valid_events(self, valid_events=None): + """ + :param valid_events: if non-None, .on() or .fire() with an event + not listed in valid_events raises an exception. + """ + self._valid_events = list(valid_events) + + def _check_event(self, event): + """ + Internal helper. Throws RuntimeError if we have a valid_events + list, and the given event isnt' in it. Does nothing otherwise. + """ + if self._valid_events and event not in self._valid_events: + raise RuntimeError( + "Invalid event '{event}'. Expected one of: {events}".format( + event=event, + events=', '.join(self._valid_events), + ) + ) + + def on(self, event, handler): + """ + Add a handler for an event. + + :param event: the name of the event + + :param handler: a callable thats invoked when .fire() is + called for this events. Arguments will be whatever are given + to .fire() + """ + # print("adding '{}' to '{}': {}".format(event, hash(self), handler)) + self._check_event(event) + if self._listeners is None: + self._listeners = dict() + if event not in self._listeners: + self._listeners[event] = [] + self._listeners[event].append(handler) + + def off(self, event=None, handler=None): + """ + Stop listening for a single event, or all events. + + :param event: if None, remove all listeners. Otherwise, remove + listeners for the single named event. + + :param handler: if None, remove all handlers for the named + event; otherwise remove just the given handler. + """ + if event is None: + if handler is not None: + # maybe this should mean "remove the given handler + # from any event at all that contains it"...? + raise RuntimeError( + "Can't specificy a specific handler without an event" + ) + self._listeners = dict() + else: + if self._listeners is None: + return + self._check_event(event) + if event in self._listeners: + if handler is None: + del self._listeners[event] + else: + self._listeners[event].discard(handler) + + def fire(self, event, *args, **kwargs): + """ + Fire a particular event. + + :param event: the event to fire. All other args and kwargs are + passed on to the handler(s) for the event. + + :return: a Deferred/Future gathering all async results from + all handlers and/or parent handlers. + """ + # print("firing '{}' from '{}'".format(event, hash(self))) + if self._listeners is None: + return txaio.create_future(result=[]) + + self._check_event(event) + res = [] + for handler in self._listeners.get(event, []): + future = txaio.as_future(handler, *args, **kwargs) + res.append(future) + if self._parent is not None: + res.append(self._parent.fire(event, *args, **kwargs)) + return txaio.gather(res, consume_exceptions=False) + + +class _LazyHexFormatter(object): + """ + This is used to avoid calling binascii.hexlify() on data given to + log.debug() calls unless debug is active (for example). Like:: + + self.log.debug( + "Some data: {octets}", + octets=_LazyHexFormatter(os.urandom(32)), + ) + """ + __slots__ = ('obj',) + + def __init__(self, obj): + self.obj = obj + + def __str__(self): + return binascii.hexlify(self.obj).decode('ascii') + + +def _is_tls_error(instance): + """ + :returns: True if we have TLS support and 'instance' is an + instance of :class:`OpenSSL.SSL.Error` otherwise False + """ + if _TLS: + return isinstance(instance, SSL.Error) + return False + + +def _maybe_tls_reason(instance): + """ + :returns: a TLS error-message, or empty-string if 'instance' is + not a TLS error. + """ + if _is_tls_error(instance): + ssl_error = instance.args[0][0] + return u"SSL error: {msg} (in {func})".format( + func=ssl_error[1], + msg=ssl_error[2], + ) + return u"" diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/__init__.py b/venv/lib/python3.7/site-packages/autobahn/wamp/__init__.py new file mode 100644 index 0000000..3bd4d85 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/__init__.py @@ -0,0 +1,83 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +from autobahn.wamp.types import \ + ComponentConfig, \ + SessionDetails, \ + CloseDetails, \ + RegisterOptions, \ + CallOptions, \ + CallDetails, \ + CallResult, \ + SubscribeOptions, \ + PublishOptions, \ + EventDetails + +from autobahn.wamp.exception import \ + Error, \ + SessionNotReady, \ + SerializationError, \ + ProtocolError, \ + TransportLost, \ + ApplicationError, \ + InvalidUri + +from autobahn.wamp.interfaces import ISession + +from autobahn.wamp.uri import \ + error, \ + register, \ + subscribe + + +__all__ = ( + 'ComponentConfig', + 'SessionDetails', + 'CloseDetails', + 'RegisterOptions', + 'CallOptions', + 'CallDetails', + 'CallResult', + 'SubscribeOptions', + 'PublishOptions', + 'EventDetails', + + 'Error', + 'SessionNotReady', + 'SerializationError', + 'ProtocolError', + 'TransportLost', + 'ApplicationError', + 'InvalidUri', + + 'ISession', + + 'error', + 'register', + 'subscribe', +) diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/exception.py b/venv/lib/python3.7/site-packages/autobahn/wamp/exception.py new file mode 100644 index 0000000..17ec6d4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/exception.py @@ -0,0 +1,314 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import six + +from autobahn.util import public +from autobahn.wamp.uri import error + +__all__ = ( + 'Error', + 'SessionNotReady', + 'SerializationError', + 'ProtocolError', + 'TransportLost', + 'ApplicationError', + 'NotAuthorized', + 'InvalidUri', +) + + +@public +class Error(RuntimeError): + """ + Base class for all exceptions related to WAMP. + """ + + +@public +class SessionNotReady(Error): + """ + The application tried to perform a WAMP interaction, but the + session is not yet fully established. + """ + + +@public +class SerializationError(Error): + """ + Exception raised when the WAMP serializer could not serialize the + application payload (``args`` or ``kwargs`` for ``CALL``, ``PUBLISH``, etc). + """ + + +@public +class InvalidUriError(Error): + """ + Exception raised when an invalid WAMP URI was used. + """ + + +@public +class ProtocolError(Error): + """ + Exception raised when WAMP protocol was violated. Protocol errors + are fatal and are handled by the WAMP implementation. They are + not supposed to be handled at the application level. + """ + + +@public +class TransportLost(Error): + """ + Exception raised when the transport underlying the WAMP session + was lost or is not connected. + """ + + +@public +class ApplicationError(Error): + """ + Base class for all exceptions that can/may be handled + at the application level. + """ + + INVALID_URI = u"wamp.error.invalid_uri" + """ + Peer provided an incorrect URI for a URI-based attribute of a WAMP message + such as a realm, topic or procedure. + """ + + INVALID_PAYLOAD = u"wamp.error.invalid_payload" + """ + The application payload could not be serialized. + """ + + PAYLOAD_SIZE_EXCEEDED = u"wamp.error.payload_size_exceeded" + """ + The application payload could not be transported becuase the serialized/framed payload + exceeds the transport limits. + """ + + NO_SUCH_PROCEDURE = u"wamp.error.no_such_procedure" + """ + A Dealer could not perform a call, since not procedure is currently registered + under the given URI. + """ + + PROCEDURE_ALREADY_EXISTS = u"wamp.error.procedure_already_exists" + """ + A procedure could not be registered, since a procedure with the given URI is + already registered. + """ + + PROCEDURE_EXISTS_INVOCATION_POLICY_CONFLICT = u"wamp.error.procedure_exists_with_different_invocation_policy" + """ + A procedure could not be registered, since a procedure with the given URI is + already registered, and the registration has a conflicting invocation policy. + """ + + NO_SUCH_REGISTRATION = u"wamp.error.no_such_registration" + """ + A Dealer could not perform a unregister, since the given registration is not active. + """ + + NO_SUCH_SUBSCRIPTION = u"wamp.error.no_such_subscription" + """ + A Broker could not perform a unsubscribe, since the given subscription is not active. + """ + + NO_SUCH_SESSION = u"wamp.error.no_such_session" + """ + A router could not perform an operation, since a session ID specified was non-existant. + """ + + INVALID_ARGUMENT = u"wamp.error.invalid_argument" + """ + A call failed, since the given argument types or values are not acceptable to the + called procedure - in which case the *Callee* may throw this error. Or a Router + performing *payload validation* checked the payload (``args`` / ``kwargs``) of a call, + call result, call error or publish, and the payload did not conform. + """ + + # FIXME: this currently isn't used neither in Autobahn nor Crossbar. Check! + SYSTEM_SHUTDOWN = u"wamp.error.system_shutdown" + """ + The *Peer* is shutting down completely - used as a ``GOODBYE`` (or ``ABORT``) reason. + """ + + # FIXME: this currently isn't used neither in Autobahn nor Crossbar. Check! + CLOSE_REALM = u"wamp.error.close_realm" + """ + The *Peer* want to leave the realm - used as a ``GOODBYE`` reason. + """ + + # FIXME: this currently isn't used neither in Autobahn nor Crossbar. Check! + GOODBYE_AND_OUT = u"wamp.error.goodbye_and_out" + """ + A *Peer* acknowledges ending of a session - used as a ``GOOBYE`` reply reason. + """ + + NOT_AUTHORIZED = u"wamp.error.not_authorized" + """ + A call, register, publish or subscribe failed, since the session is not authorized + to perform the operation. + """ + + AUTHORIZATION_FAILED = u"wamp.error.authorization_failed" + """ + A Dealer or Broker could not determine if the *Peer* is authorized to perform + a join, call, register, publish or subscribe, since the authorization operation + *itself* failed. E.g. a custom authorizer did run into an error. + """ + + AUTHENTICATION_FAILED = u"wamp.error.authentication_failed" + """ + Something failed with the authentication itself, that is, authentication could + not run to end. + """ + + NO_AUTH_METHOD = u"wamp.error.no_auth_method" + """ + No authentication method the peer offered is available or active. + """ + + NO_SUCH_REALM = u"wamp.error.no_such_realm" + """ + Peer wanted to join a non-existing realm (and the *Router* did not allow to auto-create + the realm). + """ + + NO_SUCH_ROLE = u"wamp.error.no_such_role" + """ + A *Peer* was to be authenticated under a Role that does not (or no longer) exists on the Router. + For example, the *Peer* was successfully authenticated, but the Role configured does not + exists - hence there is some misconfiguration in the Router. + """ + + NO_SUCH_PRINCIPAL = u"wamp.error.no_such_principal" + """ + A *Peer* was authenticated for an authid that does not or longer exists. + """ + + CANCELED = u"wamp.error.canceled" + """ + A Dealer or Callee canceled a call previously issued (WAMP AP). + """ + + TIMEOUT = u"wamp.error.timeout" + """ + A pending (in-flight) call was timed out. + """ + + # FIXME: this currently isn't used neither in Autobahn nor Crossbar. Check! + NO_ELIGIBLE_CALLEE = u"wamp.error.no_eligible_callee" + """ + A *Dealer* could not perform a call, since a procedure with the given URI is registered, + but *Callee Black- and Whitelisting* and/or *Caller Exclusion* lead to the + exclusion of (any) *Callee* providing the procedure (WAMP AP). + """ + + ENC_NO_PAYLOAD_CODEC = u"wamp.error.no_payload_codec" + """ + WAMP message in payload transparency mode received, but no codec set + or codec did not decode the payload. + """ + + ENC_TRUSTED_URI_MISMATCH = u"wamp.error.encryption.trusted_uri_mismatch" + """ + WAMP-cryptobox application payload end-to-end encryption error. + """ + + ENC_DECRYPT_ERROR = u"wamp.error.encryption.decrypt_error" + """ + WAMP-cryptobox application payload end-to-end encryption error. + """ + + def __init__(self, error, *args, **kwargs): + """ + + :param error: The URI of the error that occurred, e.g. ``wamp.error.not_authorized``. + :type error: str + """ + Exception.__init__(self, *args) + self.kwargs = kwargs + self.error = error + self.enc_algo = kwargs.pop('enc_algo', None) + self.callee = kwargs.pop('callee', None) + self.callee_authid = kwargs.pop('callee_authid', None) + self.callee_authrole = kwargs.pop('callee_authrole', None) + self.forward_for = kwargs.pop('forward_for', None) + + @public + def error_message(self): + """ + Get the error message of this exception. + + :returns: The error message. + :rtype: str + """ + return u'{0}: {1}'.format( + self.error, + u' '.join([six.text_type(a) for a in self.args]), + ) + + def __unicode__(self): + if self.kwargs and 'traceback' in self.kwargs: + tb = u':\n' + u'\n'.join(self.kwargs.pop('traceback')) + u'\n' + self.kwargs['traceback'] = u'...' + else: + tb = u'' + return u"ApplicationError(error=<{0}>, args={1}, kwargs={2}, enc_algo={3}, callee={4}, callee_authid={5}, callee_authrole={6}, forward_for={7}){8}".format( + self.error, list(self.args), self.kwargs, self.enc_algo, self.callee, self.callee_authid, self.callee_authrole, self.forward_for, tb) + + def __str__(self): + if six.PY3: + return self.__unicode__() + else: + return self.__unicode__().encode('utf8') + + +@error(ApplicationError.NOT_AUTHORIZED) +class NotAuthorized(Exception): + """ + Not authorized to perform the respective action. + """ + + +@error(ApplicationError.INVALID_URI) +class InvalidUri(Exception): + """ + The URI for a topic, procedure or error is not a valid WAMP URI. + """ + + +@error(ApplicationError.INVALID_PAYLOAD) +class InvalidPayload(Exception): + """ + The URI for a topic, procedure or error is not a valid WAMP URI. + """ diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/schema/session.bfbs b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/schema/session.bfbs new file mode 100644 index 0000000..23cbacb Binary files /dev/null and b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/schema/session.bfbs differ diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Map.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Map.py new file mode 100644 index 0000000..a77996f --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Map.py @@ -0,0 +1,38 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: wamp + +import flatbuffers + +class Map(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsMap(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Map() + x.Init(buf, n + offset) + return x + + # Map + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Map + def Key(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Map + def Value(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + +def MapStart(builder): builder.StartObject(2) +def MapAddKey(builder, key): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(key), 0) +def MapAddValue(builder, value): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(value), 0) +def MapEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Void.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Void.py new file mode 100644 index 0000000..ec74fc6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/Void.py @@ -0,0 +1,22 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: wamp + +import flatbuffers + +class Void(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsVoid(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Void() + x.Init(buf, n + offset) + return x + + # Void + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + +def VoidStart(builder): builder.StartObject(0) +def VoidEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthFactor.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthFactor.py new file mode 100644 index 0000000..b90df61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthFactor.py @@ -0,0 +1,11 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class AuthFactor(object): + NONE = 0 + AuthTicketRequest = 1 + AuthCraRequest = 2 + AuthScramRequest = 3 + AuthCryptosignRequest = 4 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthMode.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthMode.py new file mode 100644 index 0000000..5515f8a --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthMode.py @@ -0,0 +1,8 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class AuthMode(object): + FIRST = 0 + MULTIFACTOR = 1 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketChallenge.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketChallenge.py new file mode 100644 index 0000000..4c7ce58 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketChallenge.py @@ -0,0 +1,22 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class AuthTicketChallenge(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsAuthTicketChallenge(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = AuthTicketChallenge() + x.Init(buf, n + offset) + return x + + # AuthTicketChallenge + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + +def AuthTicketChallengeStart(builder): builder.StartObject(0) +def AuthTicketChallengeEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketRequest.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketRequest.py new file mode 100644 index 0000000..363aa9b --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/AuthTicketRequest.py @@ -0,0 +1,22 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class AuthTicketRequest(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsAuthTicketRequest(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = AuthTicketRequest() + x.Init(buf, n + offset) + return x + + # AuthTicketRequest + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + +def AuthTicketRequestStart(builder): builder.StartObject(0) +def AuthTicketRequestEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CalleeFeatures.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CalleeFeatures.py new file mode 100644 index 0000000..9c49627 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CalleeFeatures.py @@ -0,0 +1,102 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class CalleeFeatures(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsCalleeFeatures(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = CalleeFeatures() + x.Init(buf, n + offset) + return x + + # CalleeFeatures + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # CalleeFeatures + def CallerIdentification(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def CallTrustlevels(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def CallTimeout(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def CallCanceling(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def ProgressiveCallResults(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def RegistrationRevocation(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def PatternBasedRegistration(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def SharedRegistration(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def PayloadTransparency(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CalleeFeatures + def PayloadEncryptionCryptobox(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def CalleeFeaturesStart(builder): builder.StartObject(10) +def CalleeFeaturesAddCallerIdentification(builder, callerIdentification): builder.PrependBoolSlot(0, callerIdentification, 0) +def CalleeFeaturesAddCallTrustlevels(builder, callTrustlevels): builder.PrependBoolSlot(1, callTrustlevels, 0) +def CalleeFeaturesAddCallTimeout(builder, callTimeout): builder.PrependBoolSlot(2, callTimeout, 0) +def CalleeFeaturesAddCallCanceling(builder, callCanceling): builder.PrependBoolSlot(3, callCanceling, 0) +def CalleeFeaturesAddProgressiveCallResults(builder, progressiveCallResults): builder.PrependBoolSlot(4, progressiveCallResults, 0) +def CalleeFeaturesAddRegistrationRevocation(builder, registrationRevocation): builder.PrependBoolSlot(5, registrationRevocation, 0) +def CalleeFeaturesAddPatternBasedRegistration(builder, patternBasedRegistration): builder.PrependBoolSlot(6, patternBasedRegistration, 0) +def CalleeFeaturesAddSharedRegistration(builder, sharedRegistration): builder.PrependBoolSlot(7, sharedRegistration, 0) +def CalleeFeaturesAddPayloadTransparency(builder, payloadTransparency): builder.PrependBoolSlot(8, payloadTransparency, 0) +def CalleeFeaturesAddPayloadEncryptionCryptobox(builder, payloadEncryptionCryptobox): builder.PrependBoolSlot(9, payloadEncryptionCryptobox, 0) +def CalleeFeaturesEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CallerFeatures.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CallerFeatures.py new file mode 100644 index 0000000..e9abbd6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CallerFeatures.py @@ -0,0 +1,70 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class CallerFeatures(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsCallerFeatures(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = CallerFeatures() + x.Init(buf, n + offset) + return x + + # CallerFeatures + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # CallerFeatures + def CallerIdentification(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CallerFeatures + def CallTimeout(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CallerFeatures + def CallCanceling(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CallerFeatures + def ProgressiveCallResults(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CallerFeatures + def PayloadTransparency(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # CallerFeatures + def PayloadEncryptionCryptobox(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def CallerFeaturesStart(builder): builder.StartObject(6) +def CallerFeaturesAddCallerIdentification(builder, callerIdentification): builder.PrependBoolSlot(0, callerIdentification, 0) +def CallerFeaturesAddCallTimeout(builder, callTimeout): builder.PrependBoolSlot(1, callTimeout, 0) +def CallerFeaturesAddCallCanceling(builder, callCanceling): builder.PrependBoolSlot(2, callCanceling, 0) +def CallerFeaturesAddProgressiveCallResults(builder, progressiveCallResults): builder.PrependBoolSlot(3, progressiveCallResults, 0) +def CallerFeaturesAddPayloadTransparency(builder, payloadTransparency): builder.PrependBoolSlot(4, payloadTransparency, 0) +def CallerFeaturesAddPayloadEncryptionCryptobox(builder, payloadEncryptionCryptobox): builder.PrependBoolSlot(5, payloadEncryptionCryptobox, 0) +def CallerFeaturesEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CancelMode.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CancelMode.py new file mode 100644 index 0000000..e0a2b90 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/CancelMode.py @@ -0,0 +1,9 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class CancelMode(object): + SKIP = 0 + ABORT = 1 + KILL = 2 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Challenge.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Challenge.py new file mode 100644 index 0000000..2919be2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Challenge.py @@ -0,0 +1,42 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Challenge(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsChallenge(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Challenge() + x.Init(buf, n + offset) + return x + + # Challenge + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Challenge + def Method(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Challenge + def Extra(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + x = self._tab.Indirect(o + self._tab.Pos) + from .Map import Map + obj = Map() + obj.Init(self._tab.Bytes, x) + return obj + return None + +def ChallengeStart(builder): builder.StartObject(2) +def ChallengeAddMethod(builder, method): builder.PrependUint8Slot(0, method, 0) +def ChallengeAddExtra(builder, extra): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(extra), 0) +def ChallengeEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/ChannelBinding.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/ChannelBinding.py new file mode 100644 index 0000000..753d323 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/ChannelBinding.py @@ -0,0 +1,8 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class ChannelBinding(object): + NONE = 0 + TLS_UNIQUE = 1 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/DealerFeatures.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/DealerFeatures.py new file mode 100644 index 0000000..7729cee --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/DealerFeatures.py @@ -0,0 +1,126 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class DealerFeatures(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsDealerFeatures(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = DealerFeatures() + x.Init(buf, n + offset) + return x + + # DealerFeatures + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # DealerFeatures + def CallerIdentification(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def CallTrustlevels(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def CallTimeout(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def CallCanceling(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def ProgressiveCallResults(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def RegistrationRevocation(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def PatternBasedRegistration(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def SharedRegistration(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def SessionMetaApi(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def RegistrationMetaApi(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def TestamentMetaApi(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def PayloadTransparency(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # DealerFeatures + def PayloadEncryptionCryptobox(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def DealerFeaturesStart(builder): builder.StartObject(13) +def DealerFeaturesAddCallerIdentification(builder, callerIdentification): builder.PrependBoolSlot(0, callerIdentification, 0) +def DealerFeaturesAddCallTrustlevels(builder, callTrustlevels): builder.PrependBoolSlot(1, callTrustlevels, 0) +def DealerFeaturesAddCallTimeout(builder, callTimeout): builder.PrependBoolSlot(2, callTimeout, 0) +def DealerFeaturesAddCallCanceling(builder, callCanceling): builder.PrependBoolSlot(3, callCanceling, 0) +def DealerFeaturesAddProgressiveCallResults(builder, progressiveCallResults): builder.PrependBoolSlot(4, progressiveCallResults, 0) +def DealerFeaturesAddRegistrationRevocation(builder, registrationRevocation): builder.PrependBoolSlot(5, registrationRevocation, 0) +def DealerFeaturesAddPatternBasedRegistration(builder, patternBasedRegistration): builder.PrependBoolSlot(6, patternBasedRegistration, 0) +def DealerFeaturesAddSharedRegistration(builder, sharedRegistration): builder.PrependBoolSlot(7, sharedRegistration, 0) +def DealerFeaturesAddSessionMetaApi(builder, sessionMetaApi): builder.PrependBoolSlot(8, sessionMetaApi, 0) +def DealerFeaturesAddRegistrationMetaApi(builder, registrationMetaApi): builder.PrependBoolSlot(9, registrationMetaApi, 0) +def DealerFeaturesAddTestamentMetaApi(builder, testamentMetaApi): builder.PrependBoolSlot(10, testamentMetaApi, 0) +def DealerFeaturesAddPayloadTransparency(builder, payloadTransparency): builder.PrependBoolSlot(11, payloadTransparency, 0) +def DealerFeaturesAddPayloadEncryptionCryptobox(builder, payloadEncryptionCryptobox): builder.PrependBoolSlot(12, payloadEncryptionCryptobox, 0) +def DealerFeaturesEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Error.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Error.py new file mode 100644 index 0000000..81dbcae --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Error.py @@ -0,0 +1,110 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Error(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsError(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Error() + x.Init(buf, n + offset) + return x + + # Error + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Error + def RequestType(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint16Flags, o + self._tab.Pos) + return 0 + + # Error + def Request(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Error + def Error(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Error + def Payload(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Error + def PayloadAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Error + def PayloadLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Error + def EncAlgo(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Error + def EncSerializer(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Error + def EncKey(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Error + def EncKeyAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Error + def EncKeyLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def ErrorStart(builder): builder.StartObject(7) +def ErrorAddRequestType(builder, requestType): builder.PrependUint16Slot(0, requestType, 0) +def ErrorAddRequest(builder, request): builder.PrependUint64Slot(1, request, 0) +def ErrorAddError(builder, error): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(error), 0) +def ErrorAddPayload(builder, payload): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(payload), 0) +def ErrorStartPayloadVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def ErrorAddEncAlgo(builder, encAlgo): builder.PrependUint8Slot(4, encAlgo, 0) +def ErrorAddEncSerializer(builder, encSerializer): builder.PrependUint8Slot(5, encSerializer, 0) +def ErrorAddEncKey(builder, encKey): builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(encKey), 0) +def ErrorStartEncKeyVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def ErrorEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Event.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Event.py new file mode 100644 index 0000000..0177986 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Event.py @@ -0,0 +1,223 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Event(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsEvent(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Event() + x.Init(buf, n + offset) + return x + + # Event + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Event + def Subscription(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Event + def Publication(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + +# /// Positional values for application-defined event payload. + # Event + def Args(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Event + def ArgsAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Event + def ArgsLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +# /// Keyword values for application-defined event payload. + # Event + def Kwargs(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Event + def KwargsAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Event + def KwargsLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +# /// Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + # Event + def Payload(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Event + def PayloadAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Event + def PayloadLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Event + def EncAlgo(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Event + def EncSerializer(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Event + def EncKey(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Event + def EncKeyAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Event + def EncKeyLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Event + def Publisher(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Event + def PublisherAuthid(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(22)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Event + def PublisherAuthrole(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(24)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Event + def Topic(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(26)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Event + def Retained(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(28)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # Event + def Acknowledge(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(30)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # Event + def ForwardFor(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + from .Principal import Principal + obj = Principal() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Event + def ForwardForLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(32)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def EventStart(builder): builder.StartObject(15) +def EventAddSubscription(builder, subscription): builder.PrependUint64Slot(0, subscription, 0) +def EventAddPublication(builder, publication): builder.PrependUint64Slot(1, publication, 0) +def EventAddArgs(builder, args): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(args), 0) +def EventStartArgsVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventAddKwargs(builder, kwargs): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(kwargs), 0) +def EventStartKwargsVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventAddPayload(builder, payload): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(payload), 0) +def EventStartPayloadVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventAddEncAlgo(builder, encAlgo): builder.PrependUint8Slot(5, encAlgo, 0) +def EventAddEncSerializer(builder, encSerializer): builder.PrependUint8Slot(6, encSerializer, 0) +def EventAddEncKey(builder, encKey): builder.PrependUOffsetTRelativeSlot(7, flatbuffers.number_types.UOffsetTFlags.py_type(encKey), 0) +def EventStartEncKeyVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventAddPublisher(builder, publisher): builder.PrependUint64Slot(8, publisher, 0) +def EventAddPublisherAuthid(builder, publisherAuthid): builder.PrependUOffsetTRelativeSlot(9, flatbuffers.number_types.UOffsetTFlags.py_type(publisherAuthid), 0) +def EventAddPublisherAuthrole(builder, publisherAuthrole): builder.PrependUOffsetTRelativeSlot(10, flatbuffers.number_types.UOffsetTFlags.py_type(publisherAuthrole), 0) +def EventAddTopic(builder, topic): builder.PrependUOffsetTRelativeSlot(11, flatbuffers.number_types.UOffsetTFlags.py_type(topic), 0) +def EventAddRetained(builder, retained): builder.PrependBoolSlot(12, retained, 0) +def EventAddAcknowledge(builder, acknowledge): builder.PrependBoolSlot(13, acknowledge, 0) +def EventAddForwardFor(builder, forwardFor): builder.PrependUOffsetTRelativeSlot(14, flatbuffers.number_types.UOffsetTFlags.py_type(forwardFor), 0) +def EventStartForwardForVector(builder, numElems): return builder.StartVector(4, numElems, 4) +def EventEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/EventReceived.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/EventReceived.py new file mode 100644 index 0000000..c5ec69e --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/EventReceived.py @@ -0,0 +1,94 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class EventReceived(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsEventReceived(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = EventReceived() + x.Init(buf, n + offset) + return x + + # EventReceived + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # EventReceived + def Publication(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # EventReceived + def Payload(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # EventReceived + def PayloadAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # EventReceived + def PayloadLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # EventReceived + def EncAlgo(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # EventReceived + def EncSerializer(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # EventReceived + def EncKey(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # EventReceived + def EncKeyAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # EventReceived + def EncKeyLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def EventReceivedStart(builder): builder.StartObject(5) +def EventReceivedAddPublication(builder, publication): builder.PrependUint64Slot(0, publication, 0) +def EventReceivedAddPayload(builder, payload): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(payload), 0) +def EventReceivedStartPayloadVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventReceivedAddEncAlgo(builder, encAlgo): builder.PrependUint8Slot(2, encAlgo, 0) +def EventReceivedAddEncSerializer(builder, encSerializer): builder.PrependUint8Slot(3, encSerializer, 0) +def EventReceivedAddEncKey(builder, encKey): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(encKey), 0) +def EventReceivedStartEncKeyVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def EventReceivedEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Hello.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Hello.py new file mode 100644 index 0000000..cee368f --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Hello.py @@ -0,0 +1,118 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Hello(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsHello(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Hello() + x.Init(buf, n + offset) + return x + + # Hello + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Hello + def Roles(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + x = self._tab.Indirect(o + self._tab.Pos) + from .ClientRoles import ClientRoles + obj = ClientRoles() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Hello + def Realm(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Hello + def Authmethods(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Hello + def AuthmethodsAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Hello + def AuthmethodsLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Hello + def Authid(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Hello + def Authrole(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + + # Hello + def Authextra(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + x = self._tab.Indirect(o + self._tab.Pos) + from .Map import Map + obj = Map() + obj.Init(self._tab.Bytes, x) + return obj + return None + + # Hello + def Resumable(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # Hello + def ResumeSession(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(18)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Hello + def ResumeToken(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(20)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + return None + +def HelloStart(builder): builder.StartObject(9) +def HelloAddRoles(builder, roles): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(roles), 0) +def HelloAddRealm(builder, realm): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(realm), 0) +def HelloAddAuthmethods(builder, authmethods): builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(authmethods), 0) +def HelloStartAuthmethodsVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def HelloAddAuthid(builder, authid): builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(authid), 0) +def HelloAddAuthrole(builder, authrole): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(authrole), 0) +def HelloAddAuthextra(builder, authextra): builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(authextra), 0) +def HelloAddResumable(builder, resumable): builder.PrependBoolSlot(6, resumable, 0) +def HelloAddResumeSession(builder, resumeSession): builder.PrependUint64Slot(7, resumeSession, 0) +def HelloAddResumeToken(builder, resumeToken): builder.PrependUOffsetTRelativeSlot(8, flatbuffers.number_types.UOffsetTFlags.py_type(resumeToken), 0) +def HelloEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Interrupt.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Interrupt.py new file mode 100644 index 0000000..9f77f3d --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Interrupt.py @@ -0,0 +1,38 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Interrupt(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsInterrupt(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Interrupt() + x.Init(buf, n + offset) + return x + + # Interrupt + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Interrupt + def Request(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Interrupt + def Mode(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 1 + +def InterruptStart(builder): builder.StartObject(2) +def InterruptAddRequest(builder, request): builder.PrependUint64Slot(0, request, 0) +def InterruptAddMode(builder, mode): builder.PrependUint8Slot(1, mode, 1) +def InterruptEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Kdf.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Kdf.py new file mode 100644 index 0000000..da420a1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Kdf.py @@ -0,0 +1,9 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class Kdf(object): + NONE = 0 + PBKDF2 = 1 + ARGON2 = 2 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Match.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Match.py new file mode 100644 index 0000000..cbe3d69 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Match.py @@ -0,0 +1,9 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class Match(object): + EXACT = 0 + PREFIX = 1 + WILDCARD = 2 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/PublisherFeatures.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/PublisherFeatures.py new file mode 100644 index 0000000..35a6d0f --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/PublisherFeatures.py @@ -0,0 +1,70 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class PublisherFeatures(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsPublisherFeatures(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = PublisherFeatures() + x.Init(buf, n + offset) + return x + + # PublisherFeatures + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # PublisherFeatures + def PublisherIdentification(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # PublisherFeatures + def PublisherExclusion(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # PublisherFeatures + def SubscriberBlackwhiteListing(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # PublisherFeatures + def AcknowledgeEventReceived(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # PublisherFeatures + def PayloadTransparency(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + # PublisherFeatures + def PayloadEncryptionCryptobox(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + +def PublisherFeaturesStart(builder): builder.StartObject(6) +def PublisherFeaturesAddPublisherIdentification(builder, publisherIdentification): builder.PrependBoolSlot(0, publisherIdentification, 0) +def PublisherFeaturesAddPublisherExclusion(builder, publisherExclusion): builder.PrependBoolSlot(1, publisherExclusion, 0) +def PublisherFeaturesAddSubscriberBlackwhiteListing(builder, subscriberBlackwhiteListing): builder.PrependBoolSlot(2, subscriberBlackwhiteListing, 0) +def PublisherFeaturesAddAcknowledgeEventReceived(builder, acknowledgeEventReceived): builder.PrependBoolSlot(3, acknowledgeEventReceived, 0) +def PublisherFeaturesAddPayloadTransparency(builder, payloadTransparency): builder.PrependBoolSlot(4, payloadTransparency, 0) +def PublisherFeaturesAddPayloadEncryptionCryptobox(builder, payloadEncryptionCryptobox): builder.PrependBoolSlot(5, payloadEncryptionCryptobox, 0) +def PublisherFeaturesEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Serializer.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Serializer.py new file mode 100644 index 0000000..c3c5b9d --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Serializer.py @@ -0,0 +1,13 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +class Serializer(object): + TRANSPORT = 0 + JSON = 1 + MSGPACK = 2 + CBOR = 3 + UBJSON = 4 + OPAQUE = 5 + FLATBUFFERS = 6 + diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Yield.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Yield.py new file mode 100644 index 0000000..0a0fac9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/Yield.py @@ -0,0 +1,94 @@ +# automatically generated by the FlatBuffers compiler, do not modify + +# namespace: proto + +import flatbuffers + +class Yield(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAsYield(cls, buf, offset): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Yield() + x.Init(buf, n + offset) + return x + + # Yield + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + # Yield + def Request(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint64Flags, o + self._tab.Pos) + return 0 + + # Yield + def Payload(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Yield + def PayloadAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Yield + def PayloadLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + # Yield + def EncAlgo(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Yield + def EncSerializer(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + # Yield + def EncKey(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + a = self._tab.Vector(o) + return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1)) + return 0 + + # Yield + def EncKeyAsNumpy(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o) + return 0 + + # Yield + def EncKeyLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + +def YieldStart(builder): builder.StartObject(5) +def YieldAddRequest(builder, request): builder.PrependUint64Slot(0, request, 0) +def YieldAddPayload(builder, payload): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(payload), 0) +def YieldStartPayloadVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def YieldAddEncAlgo(builder, encAlgo): builder.PrependUint8Slot(2, encAlgo, 0) +def YieldAddEncSerializer(builder, encSerializer): builder.PrependUint8Slot(3, encSerializer, 0) +def YieldAddEncKey(builder, encKey): builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(encKey), 0) +def YieldStartEncKeyVector(builder, numElems): return builder.StartVector(1, numElems, 1) +def YieldEnd(builder): return builder.EndObject() diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/__init__.py b/venv/lib/python3.7/site-packages/autobahn/wamp/gen/wamp/proto/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/message.py b/venv/lib/python3.7/site-packages/autobahn/wamp/message.py new file mode 100644 index 0000000..6541288 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/message.py @@ -0,0 +1,5947 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import re +import binascii + +import six + +import autobahn +from autobahn.wamp.exception import ProtocolError, InvalidUriError +from autobahn.wamp.role import ROLE_NAME_TO_CLASS + +try: + import cbor + import flatbuffers + from autobahn.wamp import message_fbs +except ImportError: + _HAS_WAMP_FLATBUFFERS = False +else: + _HAS_WAMP_FLATBUFFERS = True + +__all__ = ('Message', + 'Hello', + 'Welcome', + 'Abort', + 'Challenge', + 'Authenticate', + 'Goodbye', + 'Error', + 'Publish', + 'Published', + 'Subscribe', + 'Subscribed', + 'Unsubscribe', + 'Unsubscribed', + 'Event', + 'Call', + 'Cancel', + 'Result', + 'Register', + 'Registered', + 'Unregister', + 'Unregistered', + 'Invocation', + 'Interrupt', + 'Yield', + 'check_or_raise_uri', + 'check_or_raise_id', + 'is_valid_enc_algo', + 'is_valid_enc_serializer', + 'PAYLOAD_ENC_CRYPTO_BOX', + 'PAYLOAD_ENC_MQTT', + 'PAYLOAD_ENC_STANDARD_IDENTIFIERS') + + +# strict URI check allowing empty URI components +_URI_PAT_STRICT_EMPTY = re.compile(r"^(([0-9a-z_]+\.)|\.)*([0-9a-z_]+)?$") + +# loose URI check allowing empty URI components +_URI_PAT_LOOSE_EMPTY = re.compile(r"^(([^\s\.#]+\.)|\.)*([^\s\.#]+)?$") + +# strict URI check disallowing empty URI components +_URI_PAT_STRICT_NON_EMPTY = re.compile(r"^([0-9a-z_]+\.)*([0-9a-z_]+)$") + +# loose URI check disallowing empty URI components +_URI_PAT_LOOSE_NON_EMPTY = re.compile(r"^([^\s\.#]+\.)*([^\s\.#]+)$") + +# strict URI check disallowing empty URI components in all but the last component +_URI_PAT_STRICT_LAST_EMPTY = re.compile(r"^([0-9a-z_]+\.)*([0-9a-z_]*)$") + +# loose URI check disallowing empty URI components in all but the last component +_URI_PAT_LOOSE_LAST_EMPTY = re.compile(r"^([^\s\.#]+\.)*([^\s\.#]*)$") + +# custom (=implementation specific) WAMP attributes (used in WAMP message details/options) +_CUSTOM_ATTRIBUTE = re.compile(r"^x_([a-z][0-9a-z_]+)?$") + +# Value for algo attribute in end-to-end encrypted messages using cryptobox, which +# is a scheme based on Curve25519, SHA512, Salsa20 and Poly1305. +# See: http://cr.yp.to/highspeed/coolnacl-20120725.pdf +PAYLOAD_ENC_CRYPTO_BOX = u'cryptobox' + +# Payload transparency identifier for MQTT payloads (which are arbitrary binary). +PAYLOAD_ENC_MQTT = u'mqtt' + +# Payload transparency identifier for XBR payloads +PAYLOAD_ENC_XBR = u'xbr' + +# Payload transparency algorithm identifiers from the WAMP spec. +PAYLOAD_ENC_STANDARD_IDENTIFIERS = [PAYLOAD_ENC_CRYPTO_BOX, PAYLOAD_ENC_MQTT, PAYLOAD_ENC_XBR] + +# Payload transparency serializer identifiers from the WAMP spec. +PAYLOAD_ENC_STANDARD_SERIALIZERS = [u'json', u'msgpack', u'cbor', u'ubjson', u'flatbuffers'] + +ENC_ALGO_NONE = 0 +ENC_ALGO_CRYPTOBOX = 1 +ENC_ALGO_MQTT = 2 +ENC_ALGO_XBR = 3 + +ENC_ALGOS = { + ENC_ALGO_NONE: u'null', + ENC_ALGO_CRYPTOBOX: u'cryptobox', + ENC_ALGO_MQTT: u'mqtt', + ENC_ALGO_XBR: u'xbr', +} + +ENC_ALGOS_FROMSTR = {key: value for value, key in ENC_ALGOS.items()} + +ENC_SER_NONE = 0 +ENC_SER_JSON = 1 +ENC_SER_MSGPACK = 2 +ENC_SER_CBOR = 3 +ENC_SER_UBJSON = 4 +ENC_SER_OPAQUE = 5 +ENC_SER_FLATBUFFERS = 6 + +ENC_SERS = { + ENC_SER_NONE: u'null', + ENC_SER_JSON: u'json', + ENC_SER_MSGPACK: u'msgpack', + ENC_SER_CBOR: u'cbor', + ENC_SER_UBJSON: u'ubjson', + ENC_SER_OPAQUE: u'opaque', + ENC_SER_FLATBUFFERS: u'flatbuffers', +} + +ENC_SERS_FROMSTR = {key: value for value, key in ENC_SERS.items()} + + +def is_valid_enc_algo(enc_algo): + """ + For WAMP payload transparency mode, check if the provided ``enc_algo`` + identifier in the WAMP message is a valid one. + + Currently defined standard identifiers are: + + * ``"cryptobox"`` + * ``"mqtt"`` + * ``"xbr"`` + + Users can select arbitrary identifiers too, but these MUST start with ``u"x_"``. + + :param enc_algo: The payload transparency algorithm identifier to check. + :type enc_algo: str + + :returns: Returns ``True`` if and only if the payload transparency + algorithm identifier is valid. + :rtype: bool + """ + return type(enc_algo) == six.text_type and (enc_algo in PAYLOAD_ENC_STANDARD_IDENTIFIERS or _CUSTOM_ATTRIBUTE.match(enc_algo)) + + +def is_valid_enc_serializer(enc_serializer): + """ + For WAMP payload transparency mode, check if the provided ``enc_serializer`` + identifier in the WAMP message is a valid one. + + Currently, the only standard defined identifier are + + * ``"json"`` + * ``"msgpack"`` + * ``"cbor"`` + * ``"ubjson"`` + * ``"flatbuffers"`` + + Users can select arbitrary identifiers too, but these MUST start with ``u"x_"``. + + :param enc_serializer: The payload transparency serializer identifier to check. + :type enc_serializer: str + + :returns: Returns ``True`` if and only if the payload transparency + serializer identifier is valid. + :rtype: bool + """ + return type(enc_serializer) == six.text_type and (enc_serializer in PAYLOAD_ENC_STANDARD_SERIALIZERS or _CUSTOM_ATTRIBUTE.match(enc_serializer)) + + +def b2a(data, max_len=40): + if type(data) == six.text_type: + s = data + elif type(data) == six.binary_type: + s = binascii.b2a_hex(data).decode('ascii') + elif data is None: + s = u'-' + else: + s = u'{}'.format(data) + if len(s) > max_len: + return s[:max_len] + u'..' + else: + return s + + +def check_or_raise_uri(value, message=u"WAMP message invalid", strict=False, allow_empty_components=False, allow_last_empty=False, allow_none=False): + """ + Check a value for being a valid WAMP URI. + + If the value is not a valid WAMP URI is invalid, raises :class:`autobahn.wamp.exception.ProtocolError`. + Otherwise return the value. + + :param value: The value to check. + :type value: str or None + + :param message: Prefix for message in exception raised when value is invalid. + :type message: str + + :param strict: If ``True``, do a strict check on the URI (the WAMP spec SHOULD behavior). + :type strict: bool + + :param allow_empty_components: If ``True``, allow empty URI components (for pattern based + subscriptions and registrations). + :type allow_empty_components: bool + + :param allow_none: If ``True``, allow ``None`` for URIs. + :type allow_none: bool + + :returns: The URI value (if valid). + :rtype: str + + :raises: instance of :class:`autobahn.wamp.exception.ProtocolError` + """ + if value is None: + if allow_none: + return + else: + raise InvalidUriError(u"{0}: URI cannot be null".format(message)) + + if type(value) != six.text_type: + if not (value is None and allow_none): + raise InvalidUriError(u"{0}: invalid type {1} for URI".format(message, type(value))) + + if strict: + if allow_last_empty: + pat = _URI_PAT_STRICT_LAST_EMPTY + elif allow_empty_components: + pat = _URI_PAT_STRICT_EMPTY + else: + pat = _URI_PAT_STRICT_NON_EMPTY + else: + if allow_last_empty: + pat = _URI_PAT_LOOSE_LAST_EMPTY + elif allow_empty_components: + pat = _URI_PAT_LOOSE_EMPTY + else: + pat = _URI_PAT_LOOSE_NON_EMPTY + + if not pat.match(value): + raise InvalidUriError(u'{0}: invalid value "{1}" for URI (did not match pattern "{2}" with options strict={3}, allow_empty_components={4}, allow_last_empty={5}, allow_none={6})'.format(message, value, pat.pattern, strict, allow_empty_components, allow_last_empty, allow_none)) + else: + return value + + +def check_or_raise_id(value, message=u"WAMP message invalid"): + """ + Check a value for being a valid WAMP ID. + + If the value is not a valid WAMP ID, raises :class:`autobahn.wamp.exception.ProtocolError`. + Otherwise return the value. + + :param value: The value to check. + :type value: int + + :param message: Prefix for message in exception raised when value is invalid. + :type message: str + + :returns: The ID value (if valid). + :rtype: int + + :raises: instance of :class:`autobahn.wamp.exception.ProtocolError` + """ + if type(value) not in six.integer_types: + raise ProtocolError(u"{0}: invalid type {1} for ID".format(message, type(value))) + # the value 0 for WAMP IDs is possible in certain WAMP messages, e.g. UNREGISTERED with + # router revocation signaling! + if value < 0 or value > 9007199254740992: # 2**53 + raise ProtocolError(u"{0}: invalid value {1} for ID".format(message, value)) + return value + + +def check_or_raise_extra(value, message=u"WAMP message invalid"): + """ + Check a value for being a valid WAMP extra dictionary. + + If the value is not a valid WAMP extra dictionary, raises :class:`autobahn.wamp.exception.ProtocolError`. + Otherwise return the value. + + :param value: The value to check. + :type value: dict + + :param message: Prefix for message in exception raised when value is invalid. + :type message: str + + :returns: The extra dictionary (if valid). + :rtype: dict + + :raises: instance of :class:`autobahn.wamp.exception.ProtocolError` + """ + if type(value) != dict: + raise ProtocolError(u"{0}: invalid type {1} for WAMP extra".format(message, type(value))) + for k in value.keys(): + if not isinstance(k, six.text_type): + raise ProtocolError(u"{0}: invalid type {1} for key in WAMP extra ('{2}')".format(message, type(k), k)) + return value + + +def _validate_kwargs(kwargs, message=u"WAMP message invalid"): + """ + Check a value for being a valid WAMP kwargs dictionary. + + If the value is not a valid WAMP kwargs dictionary, + raises :class:`autobahn.wamp.exception.ProtocolError`. + Otherwise return the kwargs. + + The WAMP spec requires that the keys in kwargs are proper + strings (unicode), not bytes. Note that the WAMP spec + says nothing about keys in application payload. Key in the + latter can be potentially of other type (if that is really + wanted). + + :param kwargs: The keyword arguments to check. + :type kwargs: dict + + :param message: Prefix for message in exception raised when + value is invalid. + :type message: str + + :returns: The kwargs dictionary (if valid). + :rtype: dict + + :raises: instance of + :class:`autobahn.wamp.exception.ProtocolError` + """ + if kwargs is not None: + if type(kwargs) != dict: + raise ProtocolError(u"{0}: invalid type {1} for WAMP kwargs".format(message, type(kwargs))) + for k in kwargs.keys(): + if not isinstance(k, six.text_type): + raise ProtocolError(u"{0}: invalid type {1} for key in WAMP kwargs ('{2}')".format(message, type(k), k)) + return kwargs + + +class Message(object): + """ + WAMP message base class. + + .. note:: This is not supposed to be instantiated, but subclassed only. + """ + + MESSAGE_TYPE = None + """ + WAMP message type code. + """ + + __slots__ = ( + '_from_fbs', + '_serialized', + '_correlation_id', + '_correlation_uri', + '_correlation_is_anchor', + '_correlation_is_last', + ) + + def __init__(self, from_fbs=None): + # only filled in case this object has flatbuffers underlying + self._from_fbs = from_fbs + + # serialization cache: mapping from ISerializer instances to serialized bytes + self._serialized = {} + + # user attributes for message correlation (mainly for message tracing) + self._correlation_id = None + self._correlation_uri = None + self._correlation_is_anchor = None + self._correlation_is_last = None + + @property + def correlation_id(self): + return self._correlation_id + + @correlation_id.setter + def correlation_id(self, value): + assert(value is None or type(value) == six.text_type) + self._correlation_id = value + + @property + def correlation_uri(self): + return self._correlation_uri + + @correlation_uri.setter + def correlation_uri(self, value): + assert(value is None or type(value) == six.text_type) + self._correlation_uri = value + + @property + def correlation_is_anchor(self): + return self._correlation_is_anchor + + @correlation_is_anchor.setter + def correlation_is_anchor(self, value): + assert(value is None or type(value) == bool) + self._correlation_is_anchor = value + + @property + def correlation_is_last(self): + return self._correlation_is_last + + @correlation_is_last.setter + def correlation_is_last(self, value): + assert(value is None or type(value) == bool) + self._correlation_is_last = value + + def __eq__(self, other): + """ + Compare this message to another message for equality. + + :param other: The other message to compare with. + :type other: obj + + :returns: ``True`` iff the messages are equal. + :rtype: bool + """ + if not isinstance(other, self.__class__): + return False + # we only want the actual message data attributes (not eg _serialize) + for k in self.__slots__: + if k not in ['_serialized', + '_correlation_id', + '_correlation_uri', + '_correlation_is_anchor', + '_correlation_is_last'] and not k.startswith('_'): + if not getattr(self, k) == getattr(other, k): + return False + return True + + def __ne__(self, other): + """ + Compare this message to another message for inequality. + + :param other: The other message to compare with. + :type other: obj + + :returns: ``True`` iff the messages are not equal. + :rtype: bool + """ + return not self.__eq__(other) + + @staticmethod + def parse(wmsg): + """ + Factory method that parses a unserialized raw message (as returned byte + :func:`autobahn.interfaces.ISerializer.unserialize`) into an instance + of this class. + + :returns: An instance of this class. + :rtype: obj + """ + raise NotImplementedError() + + def marshal(self): + raise NotImplementedError() + + @staticmethod + def cast(buf): + raise NotImplementedError() + + def build(self, builder): + raise NotImplementedError() + + def uncache(self): + """ + Resets the serialization cache. + """ + self._serialized = {} + + def serialize(self, serializer): + """ + Serialize this object into a wire level bytes representation and cache + the resulting bytes. If the cache already contains an entry for the given + serializer, return the cached representation directly. + + :param serializer: The wire level serializer to use. + :type serializer: An instance that implements :class:`autobahn.interfaces.ISerializer` + + :returns: The serialized bytes. + :rtype: bytes + """ + # only serialize if not cached .. + if serializer not in self._serialized: + if serializer.NAME == u'flatbuffers': + # flatbuffers get special treatment .. + builder = flatbuffers.Builder(1024) + + # this is the core method writing out this message (self) to a (new) flatbuffer + # FIXME: implement this method for all classes derived from Message + obj = self.build(builder) + + builder.Finish(obj) + buf = builder.Output() + self._serialized[serializer] = bytes(buf) + else: + # all other serializers first marshal() the object and then serialize the latter + self._serialized[serializer] = serializer.serialize(self.marshal()) + + # cache is filled now: return serialized, cached bytes + return self._serialized[serializer] + + +class Hello(Message): + """ + A WAMP ``HELLO`` message. + + Format: ``[HELLO, Realm|uri, Details|dict]`` + """ + + MESSAGE_TYPE = 1 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'realm', + 'roles', + 'authmethods', + 'authid', + 'authrole', + 'authextra', + 'resumable', + 'resume_session', + 'resume_token', + ) + + def __init__(self, + realm, + roles, + authmethods=None, + authid=None, + authrole=None, + authextra=None, + resumable=None, + resume_session=None, + resume_token=None): + """ + + :param realm: The URI of the WAMP realm to join. + :type realm: str + + :param roles: The WAMP session roles and features to announce. + :type roles: dict of :class:`autobahn.wamp.role.RoleFeatures` + + :param authmethods: The authentication methods to announce. + :type authmethods: list of str or None + + :param authid: The authentication ID to announce. + :type authid: str or None + + :param authrole: The authentication role to announce. + :type authrole: str or None + + :param authextra: Application-specific "extra data" to be forwarded to the client. + :type authextra: dict or None + + :param resumable: Whether the client wants this to be a session that can be later resumed. + :type resumable: bool or None + + :param resume_session: The session the client would like to resume. + :type resume_session: int or None + + :param resume_token: The secure authorisation token to resume the session. + :type resume_token: str or None + """ + assert(realm is None or isinstance(realm, six.text_type)) + assert(type(roles) == dict) + assert(len(roles) > 0) + for role in roles: + assert(role in [u'subscriber', u'publisher', u'caller', u'callee']) + assert(isinstance(roles[role], autobahn.wamp.role.ROLE_NAME_TO_CLASS[role])) + if authmethods: + assert(type(authmethods) == list) + for authmethod in authmethods: + assert(type(authmethod) == six.text_type) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authextra is None or type(authextra) == dict) + assert(resumable is None or type(resumable) == bool) + assert(resume_session is None or type(resume_session) == int) + assert(resume_token is None or type(resume_token) == six.text_type) + + Message.__init__(self) + self.realm = realm + self.roles = roles + self.authmethods = authmethods + self.authid = authid + self.authrole = authrole + self.authextra = authextra + self.resumable = resumable + self.resume_session = resume_session + self.resume_token = resume_token + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Hello.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for HELLO".format(len(wmsg))) + + realm = check_or_raise_uri(wmsg[1], u"'realm' in HELLO", allow_none=True) + details = check_or_raise_extra(wmsg[2], u"'details' in HELLO") + + roles = {} + + if u'roles' not in details: + raise ProtocolError(u"missing mandatory roles attribute in options in HELLO") + + details_roles = check_or_raise_extra(details[u'roles'], u"'roles' in 'details' in HELLO") + + if len(details_roles) == 0: + raise ProtocolError(u"empty 'roles' in 'details' in HELLO") + + for role in details_roles: + if role not in [u'subscriber', u'publisher', u'caller', u'callee']: + raise ProtocolError("invalid role '{0}' in 'roles' in 'details' in HELLO".format(role)) + + role_cls = ROLE_NAME_TO_CLASS[role] + + details_role = check_or_raise_extra(details_roles[role], "role '{0}' in 'roles' in 'details' in HELLO".format(role)) + + if u'features' in details_role: + check_or_raise_extra(details_role[u'features'], "'features' in role '{0}' in 'roles' in 'details' in HELLO".format(role)) + + role_features = role_cls(**details_role[u'features']) + + else: + role_features = role_cls() + + roles[role] = role_features + + authmethods = None + if u'authmethods' in details: + details_authmethods = details[u'authmethods'] + if type(details_authmethods) != list: + raise ProtocolError("invalid type {0} for 'authmethods' detail in HELLO".format(type(details_authmethods))) + + for auth_method in details_authmethods: + if type(auth_method) != six.text_type: + raise ProtocolError("invalid type {0} for item in 'authmethods' detail in HELLO".format(type(auth_method))) + + authmethods = details_authmethods + + authid = None + if u'authid' in details: + details_authid = details[u'authid'] + if type(details_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'authid' detail in HELLO".format(type(details_authid))) + + authid = details_authid + + authrole = None + if u'authrole' in details: + details_authrole = details[u'authrole'] + if type(details_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'authrole' detail in HELLO".format(type(details_authrole))) + + authrole = details_authrole + + authextra = None + if u'authextra' in details: + details_authextra = details[u'authextra'] + if type(details_authextra) != dict: + raise ProtocolError("invalid type {0} for 'authextra' detail in HELLO".format(type(details_authextra))) + + authextra = details_authextra + + resumable = None + if u'resumable' in details: + resumable = details[u'resumable'] + if type(resumable) != bool: + raise ProtocolError("invalid type {0} for 'resumable' detail in HELLO".format(type(resumable))) + + resume_session = None + if u'resume-session' in details: + resume_session = details[u'resume-session'] + if type(resume_session) != int: + raise ProtocolError("invalid type {0} for 'resume-session' detail in HELLO".format(type(resume_session))) + + resume_token = None + if u'resume-token' in details: + resume_token = details[u'resume-token'] + if type(resume_token) != six.text_type: + raise ProtocolError("invalid type {0} for 'resume-token' detail in HELLO".format(type(resume_token))) + else: + if resume_session: + raise ProtocolError("resume-token must be provided if resume-session is provided in HELLO") + + obj = Hello(realm, roles, authmethods, authid, authrole, authextra, resumable, resume_session, resume_token) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {u'roles': {}} + for role in self.roles.values(): + details[u'roles'][role.ROLE] = {} + for feature in role.__dict__: + if not feature.startswith('_') and feature != 'ROLE' and getattr(role, feature) is not None: + if u'features' not in details[u'roles'][role.ROLE]: + details[u'roles'][role.ROLE] = {u'features': {}} + details[u'roles'][role.ROLE][u'features'][six.u(feature)] = getattr(role, feature) + + if self.authmethods is not None: + details[u'authmethods'] = self.authmethods + + if self.authid is not None: + details[u'authid'] = self.authid + + if self.authrole is not None: + details[u'authrole'] = self.authrole + + if self.authextra is not None: + details[u'authextra'] = self.authextra + + if self.resumable is not None: + details[u'resumable'] = self.resumable + + if self.resume_session is not None: + details[u'resume-session'] = self.resume_session + + if self.resume_token is not None: + details[u'resume-token'] = self.resume_token + + return [Hello.MESSAGE_TYPE, self.realm, details] + + def __str__(self): + """ + Return a string representation of this message. + """ + return u"Hello(realm={}, roles={}, authmethods={}, authid={}, authrole={}, authextra={}, resumable={}, resume_session={}, resume_token={})".format(self.realm, self.roles, self.authmethods, self.authid, self.authrole, self.authextra, self.resumable, self.resume_session, self.resume_token) + + +class Welcome(Message): + """ + A WAMP ``WELCOME`` message. + + Format: ``[WELCOME, Session|id, Details|dict]`` + """ + + MESSAGE_TYPE = 2 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'session', + 'roles', + 'realm', + 'authid', + 'authrole', + 'authmethod', + 'authprovider', + 'authextra', + 'resumed', + 'resumable', + 'resume_token', + 'custom', + ) + + def __init__(self, + session, + roles, + realm=None, + authid=None, + authrole=None, + authmethod=None, + authprovider=None, + authextra=None, + resumed=None, + resumable=None, + resume_token=None, + custom=None): + """ + + :param session: The WAMP session ID the other peer is assigned. + :type session: int + + :param roles: The WAMP roles to announce. + :type roles: dict of :class:`autobahn.wamp.role.RoleFeatures` + + :param realm: The effective realm the session is joined on. + :type realm: str or None + + :param authid: The authentication ID assigned. + :type authid: str or None + + :param authrole: The authentication role assigned. + :type authrole: str or None + + :param authmethod: The authentication method in use. + :type authmethod: str or None + + :param authprovider: The authentication provided in use. + :type authprovider: str or None + + :param authextra: Application-specific "extra data" to be forwarded to the client. + :type authextra: arbitrary or None + + :param resumed: Whether the session is a resumed one. + :type resumed: bool or None + + :param resumable: Whether this session can be resumed later. + :type resumable: bool or None + + :param resume_token: The secure authorisation token to resume the session. + :type resume_token: str or None + + :param custom: Implementation-specific "custom attributes" (`x_my_impl_attribute`) to be set. + :type custom: dict or None + """ + assert(type(session) in six.integer_types) + assert(type(roles) == dict) + assert(len(roles) > 0) + for role in roles: + assert(role in [u'broker', u'dealer']) + assert(isinstance(roles[role], autobahn.wamp.role.ROLE_NAME_TO_CLASS[role])) + assert(realm is None or type(realm) == six.text_type) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authmethod is None or type(authmethod) == six.text_type) + assert(authprovider is None or type(authprovider) == six.text_type) + assert(authextra is None or type(authextra) == dict) + assert(resumed is None or type(resumed) == bool) + assert(resumable is None or type(resumable) == bool) + assert(resume_token is None or type(resume_token) == six.text_type) + assert(custom is None or type(custom) == dict) + if custom: + for k in custom: + assert(_CUSTOM_ATTRIBUTE.match(k)) + + Message.__init__(self) + self.session = session + self.roles = roles + self.realm = realm + self.authid = authid + self.authrole = authrole + self.authmethod = authmethod + self.authprovider = authprovider + self.authextra = authextra + self.resumed = resumed + self.resumable = resumable + self.resume_token = resume_token + self.custom = custom or {} + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Welcome.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for WELCOME".format(len(wmsg))) + + session = check_or_raise_id(wmsg[1], u"'session' in WELCOME") + details = check_or_raise_extra(wmsg[2], u"'details' in WELCOME") + + # FIXME: tigher value checking (types, URIs etc) + realm = details.get(u'realm', None) + authid = details.get(u'authid', None) + authrole = details.get(u'authrole', None) + authmethod = details.get(u'authmethod', None) + authprovider = details.get(u'authprovider', None) + authextra = details.get(u'authextra', None) + + resumed = None + if u'resumed' in details: + resumed = details[u'resumed'] + if not type(resumed) == bool: + raise ProtocolError("invalid type {0} for 'resumed' detail in WELCOME".format(type(resumed))) + + resumable = None + if u'resumable' in details: + resumable = details[u'resumable'] + if not type(resumable) == bool: + raise ProtocolError("invalid type {0} for 'resumable' detail in WELCOME".format(type(resumable))) + + resume_token = None + if u'resume_token' in details: + resume_token = details[u'resume_token'] + if not type(resume_token) == six.text_type: + raise ProtocolError("invalid type {0} for 'resume_token' detail in WELCOME".format(type(resume_token))) + elif resumable: + raise ProtocolError("resume_token required when resumable is given in WELCOME") + + roles = {} + + if u'roles' not in details: + raise ProtocolError(u"missing mandatory roles attribute in options in WELCOME") + + details_roles = check_or_raise_extra(details['roles'], u"'roles' in 'details' in WELCOME") + + if len(details_roles) == 0: + raise ProtocolError(u"empty 'roles' in 'details' in WELCOME") + + for role in details_roles: + if role not in [u'broker', u'dealer']: + raise ProtocolError("invalid role '{0}' in 'roles' in 'details' in WELCOME".format(role)) + + role_cls = ROLE_NAME_TO_CLASS[role] + + details_role = check_or_raise_extra(details_roles[role], "role '{0}' in 'roles' in 'details' in WELCOME".format(role)) + + if u'features' in details_role: + check_or_raise_extra(details_role[u'features'], "'features' in role '{0}' in 'roles' in 'details' in WELCOME".format(role)) + + role_features = role_cls(**details_roles[role][u'features']) + + else: + role_features = role_cls() + + roles[role] = role_features + + custom = {} + for k in details: + if _CUSTOM_ATTRIBUTE.match(k): + custom[k] = details[k] + + obj = Welcome(session, roles, realm, authid, authrole, authmethod, authprovider, authextra, resumed, resumable, resume_token, custom) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + details.update(self.custom) + + if self.realm: + details[u'realm'] = self.realm + + if self.authid: + details[u'authid'] = self.authid + + if self.authrole: + details[u'authrole'] = self.authrole + + if self.authrole: + details[u'authmethod'] = self.authmethod + + if self.authprovider: + details[u'authprovider'] = self.authprovider + + if self.authextra: + details[u'authextra'] = self.authextra + + if self.resumed: + details[u'resumed'] = self.resumed + + if self.resumable: + details[u'resumable'] = self.resumable + + if self.resume_token: + details[u'resume_token'] = self.resume_token + + details[u'roles'] = {} + for role in self.roles.values(): + details[u'roles'][role.ROLE] = {} + for feature in role.__dict__: + if not feature.startswith('_') and feature != 'ROLE' and getattr(role, feature) is not None: + if u'features' not in details[u'roles'][role.ROLE]: + details[u'roles'][role.ROLE] = {u'features': {}} + details[u'roles'][role.ROLE][u'features'][six.u(feature)] = getattr(role, feature) + + return [Welcome.MESSAGE_TYPE, self.session, details] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Welcome(session={}, roles={}, realm={}, authid={}, authrole={}, authmethod={}, authprovider={}, authextra={}, resumed={}, resumable={}, resume_token={})".format(self.session, self.roles, self.realm, self.authid, self.authrole, self.authmethod, self.authprovider, self.authextra, self.resumed, self.resumable, self.resume_token) + + +class Abort(Message): + """ + A WAMP ``ABORT`` message. + + Format: ``[ABORT, Details|dict, Reason|uri]`` + """ + + MESSAGE_TYPE = 3 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'reason', + 'message', + ) + + def __init__(self, reason, message=None): + """ + + :param reason: WAMP or application error URI for aborting reason. + :type reason: str + + :param message: Optional human-readable closing message, e.g. for logging purposes. + :type message: str or None + """ + assert(type(reason) == six.text_type) + assert(message is None or type(message) == six.text_type) + + Message.__init__(self) + self.reason = reason + self.message = message + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Abort.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for ABORT".format(len(wmsg))) + + details = check_or_raise_extra(wmsg[1], u"'details' in ABORT") + reason = check_or_raise_uri(wmsg[2], u"'reason' in ABORT") + + message = None + + if u'message' in details: + + details_message = details[u'message'] + if type(details_message) != six.text_type: + raise ProtocolError("invalid type {0} for 'message' detail in ABORT".format(type(details_message))) + + message = details_message + + obj = Abort(reason, message) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + if self.message: + details[u'message'] = self.message + + return [Abort.MESSAGE_TYPE, details, self.reason] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Abort(message={0}, reason={1})".format(self.message, self.reason) + + +class Challenge(Message): + """ + A WAMP ``CHALLENGE`` message. + + Format: ``[CHALLENGE, Method|string, Extra|dict]`` + """ + + MESSAGE_TYPE = 4 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'method', + 'extra', + ) + + def __init__(self, method, extra=None): + """ + + :param method: The authentication method. + :type method: str + + :param extra: Authentication method specific information. + :type extra: dict or None + """ + assert(type(method) == six.text_type) + assert(extra is None or type(extra) == dict) + + Message.__init__(self) + self.method = method + self.extra = extra or {} + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Challenge.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for CHALLENGE".format(len(wmsg))) + + method = wmsg[1] + if type(method) != six.text_type: + raise ProtocolError("invalid type {0} for 'method' in CHALLENGE".format(type(method))) + + extra = check_or_raise_extra(wmsg[2], u"'extra' in CHALLENGE") + + obj = Challenge(method, extra) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Challenge.MESSAGE_TYPE, self.method, self.extra] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Challenge(method={0}, extra={1})".format(self.method, self.extra) + + +class Authenticate(Message): + """ + A WAMP ``AUTHENTICATE`` message. + + Format: ``[AUTHENTICATE, Signature|string, Extra|dict]`` + """ + + MESSAGE_TYPE = 5 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'signature', + 'extra', + ) + + def __init__(self, signature, extra=None): + """ + + :param signature: The signature for the authentication challenge. + :type signature: str + + :param extra: Authentication method specific information. + :type extra: dict or None + """ + assert(type(signature) == six.text_type) + assert(extra is None or type(extra) == dict) + + Message.__init__(self) + self.signature = signature + self.extra = extra or {} + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Authenticate.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for AUTHENTICATE".format(len(wmsg))) + + signature = wmsg[1] + if type(signature) != six.text_type: + raise ProtocolError("invalid type {0} for 'signature' in AUTHENTICATE".format(type(signature))) + + extra = check_or_raise_extra(wmsg[2], u"'extra' in AUTHENTICATE") + + obj = Authenticate(signature, extra) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Authenticate.MESSAGE_TYPE, self.signature, self.extra] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Authenticate(signature={0}, extra={1})".format(self.signature, self.extra) + + +class Goodbye(Message): + """ + A WAMP ``GOODBYE`` message. + + Format: ``[GOODBYE, Details|dict, Reason|uri]`` + """ + + MESSAGE_TYPE = 6 + """ + The WAMP message code for this type of message. + """ + + DEFAULT_REASON = u"wamp.close.normal" + """ + Default WAMP closing reason. + """ + + __slots__ = ( + 'reason', + 'message', + 'resumable', + ) + + def __init__(self, reason=DEFAULT_REASON, message=None, resumable=None): + """ + + :param reason: Optional WAMP or application error URI for closing reason. + :type reason: str + + :param message: Optional human-readable closing message, e.g. for logging purposes. + :type message: str or None + + :param resumable: From the server: Whether the session is able to be resumed (true) or destroyed (false). From the client: Whether it should be resumable (true) or destroyed (false). + :type resumable: bool or None + """ + assert(type(reason) == six.text_type) + assert(message is None or type(message) == six.text_type) + assert(resumable is None or type(resumable) == bool) + + Message.__init__(self) + self.reason = reason + self.message = message + self.resumable = resumable + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Goodbye.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for GOODBYE".format(len(wmsg))) + + details = check_or_raise_extra(wmsg[1], u"'details' in GOODBYE") + reason = check_or_raise_uri(wmsg[2], u"'reason' in GOODBYE") + + message = None + resumable = None + + if u'message' in details: + + details_message = details[u'message'] + if type(details_message) != six.text_type: + raise ProtocolError("invalid type {0} for 'message' detail in GOODBYE".format(type(details_message))) + + message = details_message + + if u'resumable' in details: + resumable = details[u'resumable'] + if type(resumable) != bool: + raise ProtocolError("invalid type {0} for 'resumable' detail in GOODBYE".format(type(resumable))) + + obj = Goodbye(reason=reason, + message=message, + resumable=resumable) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + if self.message: + details[u'message'] = self.message + + if self.resumable: + details[u'resumable'] = self.resumable + + return [Goodbye.MESSAGE_TYPE, details, self.reason] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Goodbye(message={}, reason={}, resumable={})".format(self.message, self.reason, self.resumable) + + +class Error(Message): + """ + A WAMP ``ERROR`` message. + + Formats: + + * ``[ERROR, REQUEST.Type|int, REQUEST.Request|id, Details|dict, Error|uri]`` + * ``[ERROR, REQUEST.Type|int, REQUEST.Request|id, Details|dict, Error|uri, Arguments|list]`` + * ``[ERROR, REQUEST.Type|int, REQUEST.Request|id, Details|dict, Error|uri, Arguments|list, ArgumentsKw|dict]`` + * ``[ERROR, REQUEST.Type|int, REQUEST.Request|id, Details|dict, Error|uri, Payload|binary]`` + """ + + MESSAGE_TYPE = 8 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request_type', + 'request', + 'error', + 'args', + 'kwargs', + 'payload', + 'enc_algo', + 'enc_key', + 'enc_serializer', + 'callee', + 'callee_authid', + 'callee_authrole', + 'forward_for', + ) + + def __init__(self, + request_type, + request, + error, + args=None, + kwargs=None, + payload=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + callee=None, + callee_authid=None, + callee_authrole=None, + forward_for=None): + """ + + :param request_type: The WAMP message type code for the original request. + :type request_type: int + + :param request: The WAMP request ID of the original request (`Call`, `Subscribe`, ...) this error occurred for. + :type request: int + + :param error: The WAMP or application error URI for the error that occurred. + :type error: str + + :param args: Positional values for application-defined exception. + Must be serializable using any serializers in use. + :type args: list or None + + :param kwargs: Keyword values for application-defined exception. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param callee: The WAMP session ID of the effective callee that responded with the error. Only filled if callee is disclosed. + :type callee: None or int + + :param callee_authid: The WAMP authid of the responding callee. Only filled if callee is disclosed. + :type callee_authid: None or unicode + + :param callee_authrole: The WAMP authrole of the responding callee. Only filled if callee is disclosed. + :type callee_authrole: None or unicode + + :param forward_for: When this Error is forwarded for a client/callee (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request_type) in six.integer_types) + assert(type(request) in six.integer_types) + assert(type(error) == six.text_type) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + + assert(callee is None or type(callee) in six.integer_types) + assert(callee_authid is None or type(callee_authid) == six.text_type) + assert(callee_authrole is None or type(callee_authrole) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request_type = request_type + self.request = request + self.error = error + self.args = args + self.kwargs = _validate_kwargs(kwargs) + self.payload = payload + + # payload transparency related knobs + self.enc_algo = enc_algo + self.enc_key = enc_key + self.enc_serializer = enc_serializer + + # effective callee that responded with the error + self.callee = callee + self.callee_authid = callee_authid + self.callee_authrole = callee_authrole + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Error.MESSAGE_TYPE) + + if len(wmsg) not in (5, 6, 7): + raise ProtocolError("invalid message length {0} for ERROR".format(len(wmsg))) + + request_type = wmsg[1] + if type(request_type) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'request_type' in ERROR".format(request_type)) + + if request_type not in [Subscribe.MESSAGE_TYPE, + Unsubscribe.MESSAGE_TYPE, + Publish.MESSAGE_TYPE, + Register.MESSAGE_TYPE, + Unregister.MESSAGE_TYPE, + Call.MESSAGE_TYPE, + Invocation.MESSAGE_TYPE]: + raise ProtocolError("invalid value {0} for 'request_type' in ERROR".format(request_type)) + + request = check_or_raise_id(wmsg[2], u"'request' in ERROR") + details = check_or_raise_extra(wmsg[3], u"'details' in ERROR") + error = check_or_raise_uri(wmsg[4], u"'error' in ERROR") + + args = None + kwargs = None + payload = None + enc_algo = None + enc_key = None + enc_serializer = None + callee = None + callee_authid = None + callee_authrole = None + forward_for = None + + if len(wmsg) == 6 and type(wmsg[5]) == six.binary_type: + + payload = wmsg[5] + + enc_algo = details.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in EVENT".format(enc_algo)) + + enc_key = details.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in EVENT".format(type(enc_key))) + + enc_serializer = details.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in EVENT".format(enc_serializer)) + + else: + if len(wmsg) > 5: + args = wmsg[5] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in ERROR".format(type(args))) + + if len(wmsg) > 6: + kwargs = wmsg[6] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in ERROR".format(type(kwargs))) + + if u'callee' in details: + + detail_callee = details[u'callee'] + if type(detail_callee) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'callee' detail in ERROR".format(type(detail_callee))) + + callee = detail_callee + + if u'callee_authid' in details: + + detail_callee_authid = details[u'callee_authid'] + if type(detail_callee_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authid' detail in ERROR".format(type(detail_callee_authid))) + + callee_authid = detail_callee_authid + + if u'callee_authrole' in details: + + detail_callee_authrole = details[u'callee_authrole'] + if type(detail_callee_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authrole' detail in ERROR".format(type(detail_callee_authrole))) + + callee_authrole = detail_callee_authrole + + if u'forward_for' in details: + forward_for = details[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in ERROR") + + obj = Error(request_type, + request, + error, + args=args, + kwargs=kwargs, + payload=payload, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + callee=callee, + callee_authid=callee_authid, + callee_authrole=callee_authrole, + forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + + if self.callee is not None: + details[u'callee'] = self.callee + if self.callee_authid is not None: + details[u'callee_authid'] = self.callee_authid + if self.callee_authrole is not None: + details[u'callee_authrole'] = self.callee_authrole + if self.forward_for is not None: + details[u'forward_for'] = self.forward_for + + if self.payload: + if self.enc_algo is not None: + details[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + details[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + details[u'enc_serializer'] = self.enc_serializer + return [self.MESSAGE_TYPE, self.request_type, self.request, details, self.error, self.payload] + else: + if self.kwargs: + return [self.MESSAGE_TYPE, self.request_type, self.request, details, self.error, self.args, self.kwargs] + elif self.args: + return [self.MESSAGE_TYPE, self.request_type, self.request, details, self.error, self.args] + else: + return [self.MESSAGE_TYPE, self.request_type, self.request, details, self.error] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Error(request_type={0}, request={1}, error={2}, args={3}, kwargs={4}, enc_algo={5}, enc_key={6}, enc_serializer={7}, payload={8}, callee={9}, callee_authid={10}, callee_authrole={11}, forward_for={12})".format(self.request_type, self.request, self.error, self.args, self.kwargs, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.callee, self.callee_authid, self.callee_authrole, self.forward_for) + + +class Publish(Message): + """ + A WAMP ``PUBLISH`` message. + + Formats: + + * ``[PUBLISH, Request|id, Options|dict, Topic|uri]`` + * ``[PUBLISH, Request|id, Options|dict, Topic|uri, Arguments|list]`` + * ``[PUBLISH, Request|id, Options|dict, Topic|uri, Arguments|list, ArgumentsKw|dict]`` + * ``[PUBLISH, Request|id, Options|dict, Topic|uri, Payload|binary]`` + """ + + MESSAGE_TYPE = 16 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + # uint64 (key) + '_request', + + # string (required, uri) + '_topic', + + # [uint8] + '_args', + + # [uint8] + '_kwargs', + + # [uint8] + '_payload', + + # Payload => uint8 + '_enc_algo', + + # Serializer => uint8 + '_enc_serializer', + + # [uint8] + '_enc_key', + + # bool + '_acknowledge', + + # bool + '_exclude_me', + + # [uint64] + '_exclude', + + # [string] (principal) + '_exclude_authid', + + # [string] (principal) + '_exclude_authrole', + + # [uint64] + '_eligible', + + # [string] (principal) + '_eligible_authid', + + # [string] (principal) + '_eligible_authrole', + + # bool + '_retain', + + # [Principal] + '_forward_for', + ) + + def __init__(self, + request=None, + topic=None, + args=None, + kwargs=None, + payload=None, + acknowledge=None, + exclude_me=None, + exclude=None, + exclude_authid=None, + exclude_authrole=None, + eligible=None, + eligible_authid=None, + eligible_authrole=None, + retain=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + forward_for=None, + from_fbs=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param topic: The WAMP or application URI of the PubSub topic the event should + be published to. + :type topic: str + + :param args: Positional values for application-defined event payload. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined event payload. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param acknowledge: If True, acknowledge the publication with a success or + error response. + :type acknowledge: bool or None + + :param exclude_me: If ``True``, exclude the publisher from receiving the event, even + if he is subscribed (and eligible). + :type exclude_me: bool or None + + :param exclude: List of WAMP session IDs to exclude from receiving this event. + :type exclude: list of int or None + + :param exclude_authid: List of WAMP authids to exclude from receiving this event. + :type exclude_authid: list of str or None + + :param exclude_authrole: List of WAMP authroles to exclude from receiving this event. + :type exclude_authrole: list of str or None + + :param eligible: List of WAMP session IDs eligible to receive this event. + :type eligible: list of int or None + + :param eligible_authid: List of WAMP authids eligible to receive this event. + :type eligible_authid: list of str or None + + :param eligible_authrole: List of WAMP authroles eligible to receive this event. + :type eligible_authrole: list of str or None + + :param retain: If ``True``, request the broker retain this event. + :type retain: bool or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None or None + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(request is None or type(request) in six.integer_types) + assert(topic is None or type(topic) == six.text_type) + assert(args is None or type(args) in [list, tuple, six.text_type, six.binary_type]) + assert(kwargs is None or type(kwargs) in [dict, six.text_type, six.binary_type]) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(acknowledge is None or type(acknowledge) == bool) + assert(retain is None or type(retain) == bool) + + # publisher exlusion and black-/whitelisting + assert(exclude_me is None or type(exclude_me) == bool) + + assert(exclude is None or type(exclude) == list) + if exclude: + for sessionid in exclude: + assert(type(sessionid) in six.integer_types) + + assert(exclude_authid is None or type(exclude_authid) == list) + if exclude_authid: + for authid in exclude_authid: + assert(type(authid) == six.text_type) + + assert(exclude_authrole is None or type(exclude_authrole) == list) + if exclude_authrole: + for authrole in exclude_authrole: + assert(type(authrole) == six.text_type) + + assert(eligible is None or type(eligible) == list) + if eligible: + for sessionid in eligible: + assert(type(sessionid) in six.integer_types) + + assert(eligible_authid is None or type(eligible_authid) == list) + if eligible_authid: + for authid in eligible_authid: + assert(type(authid) == six.text_type) + + assert(eligible_authrole is None or type(eligible_authrole) == list) + if eligible_authrole: + for authrole in eligible_authrole: + assert(type(authrole) == six.text_type) + + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self, from_fbs=from_fbs) + self._request = request + self._topic = topic + self._args = args + self._kwargs = _validate_kwargs(kwargs) + self._payload = payload + self._acknowledge = acknowledge + + # publisher exlusion and black-/whitelisting + self._exclude_me = exclude_me + self._exclude = exclude + self._exclude_authid = exclude_authid + self._exclude_authrole = exclude_authrole + self._eligible = eligible + self._eligible_authid = eligible_authid + self._eligible_authrole = eligible_authrole + + # event retention + self._retain = retain + + # payload transparency related knobs + self._enc_algo = enc_algo + self._enc_key = enc_key + self._enc_serializer = enc_serializer + + # message forwarding + self._forward_for = forward_for + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if not Message.__eq__(self, other): + return False + if other.request != self.request: + return False + if other.topic != self.topic: + return False + if other.args != self.args: + return False + if other.kwargs != self.kwargs: + return False + if other.payload != self.payload: + return False + if other.acknowledge != self.acknowledge: + return False + if other.exclude_me != self.exclude_me: + return False + if other.exclude != self.exclude: + return False + if other.exclude_authid != self.exclude_authid: + return False + if other.exclude_authrole != self.exclude_authrole: + return False + if other.eligible != self.eligible: + return False + if other.eligible_authid != self.eligible_authid: + return False + if other.eligible_authrole != self.eligible_authrole: + return False + if other.retain != self.retain: + return False + if other.enc_algo != self.enc_algo: + return False + if other.enc_key != self.enc_key: + return False + if other.enc_serializer != self.enc_serializer: + return False + if other.forward_for != self.forward_for: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + @property + def request(self): + if self._request is None and self._from_fbs: + self._request = self._from_fbs.Request() + return self._request + + @request.setter + def request(self, value): + assert(value is None or type(value) in six.integer_types) + self._request = value + + @property + def topic(self): + if self._topic is None and self._from_fbs: + s = self._from_fbs.Topic() + if s: + self._topic = s.decode('utf8') + return self._topic + + @topic.setter + def topic(self, value): + assert value is None or type(value) == str + self._topic = value + + @property + def args(self): + if self._args is None and self._from_fbs: + if self._from_fbs.ArgsLength(): + self._args = cbor.loads(bytes(self._from_fbs.ArgsAsBytes())) + return self._args + + @args.setter + def args(self, value): + assert(value is None or type(value) in [list, tuple]) + self._args = value + + @property + def kwargs(self): + if self._kwargs is None and self._from_fbs: + if self._from_fbs.KwargsLength(): + self._kwargs = cbor.loads(bytes(self._from_fbs.KwargsAsBytes())) + return self._kwargs + + @kwargs.setter + def kwargs(self, value): + assert(value is None or type(value) == dict) + self._kwargs = value + + @property + def payload(self): + if self._payload is None and self._from_fbs: + if self._from_fbs.PayloadLength(): + self._payload = self._from_fbs.PayloadAsBytes() + return self._payload + + @payload.setter + def payload(self, value): + assert value is None or type(value) == bytes + self._payload = value + + @property + def acknowledge(self): + if self._acknowledge is None and self._from_fbs: + acknowledge = self._from_fbs.Acknowledge() + if acknowledge: + self._acknowledge = acknowledge + return self._acknowledge + + @acknowledge.setter + def acknowledge(self, value): + assert value is None or type(value) == bool + self._acknowledge = value + + @property + def exclude_me(self): + if self._exclude_me is None and self._from_fbs: + exclude_me = self._from_fbs.ExcludeMe() + if exclude_me is False: + self._exclude_me = exclude_me + return self._exclude_me + + @exclude_me.setter + def exclude_me(self, value): + assert value is None or type(value) == bool + self._exclude_me = value + + @property + def exclude(self): + if self._exclude is None and self._from_fbs: + if self._from_fbs.ExcludeLength(): + exclude = [] + for j in range(self._from_fbs.ExcludeLength()): + exclude.append(self._from_fbs.Exclude(j)) + self._exclude = exclude + return self._exclude + + @exclude.setter + def exclude(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == int + self._exclude = value + + @property + def exclude_authid(self): + if self._exclude_authid is None and self._from_fbs: + if self._from_fbs.ExcludeAuthidLength(): + exclude_authid = [] + for j in range(self._from_fbs.ExcludeAuthidLength()): + exclude_authid.append(self._from_fbs.ExcludeAuthid(j).decode('utf8')) + self._exclude_authid = exclude_authid + return self._exclude_authid + + @exclude_authid.setter + def exclude_authid(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == str + self._exclude_authid = value + + @property + def exclude_authrole(self): + if self._exclude_authrole is None and self._from_fbs: + if self._from_fbs.ExcludeAuthroleLength(): + exclude_authrole = [] + for j in range(self._from_fbs.ExcludeAuthroleLength()): + exclude_authrole.append(self._from_fbs.ExcludeAuthrole(j).decode('utf8')) + self._exclude_authrole = exclude_authrole + return self._exclude_authrole + + @exclude_authrole.setter + def exclude_authrole(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == str + self._exclude_authrole = value + + @property + def eligible(self): + if self._eligible is None and self._from_fbs: + if self._from_fbs.EligibleLength(): + eligible = [] + for j in range(self._from_fbs.EligibleLength()): + eligible.append(self._from_fbs.Eligible(j)) + self._eligible = eligible + return self._eligible + + @eligible.setter + def eligible(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == int + self._eligible = value + + @property + def eligible_authid(self): + if self._eligible_authid is None and self._from_fbs: + if self._from_fbs.EligibleAuthidLength(): + eligible_authid = [] + for j in range(self._from_fbs.EligibleAuthidLength()): + eligible_authid.append(self._from_fbs.EligibleAuthid(j).decode('utf8')) + self._eligible_authid = eligible_authid + return self._eligible_authid + + @eligible_authid.setter + def eligible_authid(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == str + self._eligible_authid = value + + @property + def eligible_authrole(self): + if self._eligible_authrole is None and self._from_fbs: + if self._from_fbs.EligibleAuthroleLength(): + eligible_authrole = [] + for j in range(self._from_fbs.EligibleAuthroleLength()): + eligible_authrole.append(self._from_fbs.EligibleAuthrole(j).decode('utf8')) + self._eligible_authrole = eligible_authrole + return self._eligible_authrole + + @eligible_authrole.setter + def eligible_authrole(self, value): + assert value is None or type(value) == list + if value: + for x in value: + assert type(x) == str + self._eligible_authrole = value + + @property + def retain(self): + if self._retain is None and self._from_fbs: + retain = self._from_fbs.Retain() + if retain: + self._retain = retain + return self._retain + + @retain.setter + def retain(self, value): + assert value is None or type(value) == bool + self._retain = value + + @property + def enc_algo(self): + if self._enc_algo is None and self._from_fbs: + enc_algo = self._from_fbs.EncAlgo() + if enc_algo: + self._enc_algo = enc_algo + return self._enc_algo + + @enc_algo.setter + def enc_algo(self, value): + assert value is None or value in [ENC_ALGO_CRYPTOBOX, ENC_ALGO_MQTT, ENC_ALGO_XBR] + self._enc_algo = value + + @property + def enc_key(self): + if self._enc_key is None and self._from_fbs: + if self._from_fbs.EncKeyLength(): + self._enc_key = self._from_fbs.EncKeyAsBytes() + return self._enc_key + + @enc_key.setter + def enc_key(self, value): + assert value is None or type(value) == bytes + self._enc_key = value + + @property + def enc_serializer(self): + if self._enc_serializer is None and self._from_fbs: + enc_serializer = self._from_fbs.EncSerializer() + if enc_serializer: + self._enc_serializer = enc_serializer + return self._enc_serializer + + @enc_serializer.setter + def enc_serializer(self, value): + assert value is None or value in [ENC_SER_JSON, ENC_SER_MSGPACK, ENC_SER_CBOR, ENC_SER_UBJSON] + self._enc_serializer = value + + @property + def forward_for(self): + # FIXME + return self._forward_for + + @forward_for.setter + def forward_for(self, value): + # FIXME + self._forward_for = value + + @staticmethod + def cast(buf): + return Publish(from_fbs=message_fbs.Publish.GetRootAsPublish(buf, 0)) + + def build(self, builder): + + args = self.args + if args: + args = builder.CreateByteVector(cbor.dumps(args)) + + kwargs = self.kwargs + if kwargs: + kwargs = builder.CreateByteVector(cbor.dumps(kwargs)) + + payload = self.payload + if payload: + payload = builder.CreateByteVector(payload) + + topic = self.topic + if topic: + topic = builder.CreateString(topic) + + enc_key = self.enc_key + if enc_key: + enc_key = builder.CreateByteVector(enc_key) + + # exclude: [int] + exclude = self.exclude + if exclude: + message_fbs.PublishGen.PublishStartExcludeAuthidVector(builder, len(exclude)) + for session in reversed(exclude): + builder.PrependUint64(session) + exclude = builder.EndVector(len(exclude)) + + # exclude_authid: [string] + exclude_authid = self.exclude_authid + if exclude_authid: + _exclude_authid = [] + for authid in exclude_authid: + _exclude_authid.append(builder.CreateString(authid)) + message_fbs.PublishGen.PublishStartExcludeAuthidVector(builder, len(_exclude_authid)) + for o in reversed(_exclude_authid): + builder.PrependUOffsetTRelative(o) + exclude_authid = builder.EndVector(len(_exclude_authid)) + + # exclude_authrole: [string] + exclude_authrole = self.exclude_authrole + if exclude_authid: + _exclude_authrole = [] + for authrole in exclude_authrole: + _exclude_authrole.append(builder.CreateString(authrole)) + message_fbs.PublishGen.PublishStartExcludeAuthroleVector(builder, len(_exclude_authrole)) + for o in reversed(_exclude_authrole): + builder.PrependUOffsetTRelative(o) + exclude_authrole = builder.EndVector(len(_exclude_authrole)) + + # eligible: [int] + eligible = self.eligible + if eligible: + message_fbs.PublishGen.PublishStartEligibleAuthidVector(builder, len(eligible)) + for session in reversed(eligible): + builder.PrependUint64(session) + eligible = builder.EndVector(len(eligible)) + + # eligible_authid: [string] + eligible_authid = self.eligible_authid + if eligible_authid: + _eligible_authid = [] + for authid in eligible_authid: + _eligible_authid.append(builder.CreateString(authid)) + message_fbs.PublishGen.PublishStartEligibleAuthidVector(builder, len(_eligible_authid)) + for o in reversed(_eligible_authid): + builder.PrependUOffsetTRelative(o) + eligible_authid = builder.EndVector(len(_eligible_authid)) + + # eligible_authrole: [string] + eligible_authrole = self.eligible_authrole + if eligible_authrole: + _eligible_authrole = [] + for authrole in eligible_authrole: + _eligible_authrole.append(builder.CreateString(authrole)) + message_fbs.PublishGen.PublishStartEligibleAuthroleVector(builder, len(_eligible_authrole)) + for o in reversed(_eligible_authrole): + builder.PrependUOffsetTRelative(o) + eligible_authrole = builder.EndVector(len(_eligible_authrole)) + + # now start and build a new object .. + message_fbs.PublishGen.PublishStart(builder) + + if self.request is not None: + message_fbs.PublishGen.PublishAddRequest(builder, self.request) + + if topic: + message_fbs.PublishGen.PublishAddTopic(builder, topic) + + if args: + message_fbs.PublishGen.PublishAddArgs(builder, args) + if kwargs: + message_fbs.PublishGen.PublishAddKwargs(builder, kwargs) + if payload: + message_fbs.PublishGen.PublishAddPayload(builder, payload) + + if self.acknowledge is not None: + message_fbs.PublishGen.PublishAddAcknowledge(builder, self.acknowledge) + if self.retain is not None: + message_fbs.PublishGen.PublishAddRetain(builder, self.retain) + if self.exclude_me is not None: + message_fbs.PublishGen.PublishAddExcludeMe(builder, self.exclude_me) + + if exclude: + message_fbs.PublishGen.PublishAddExclude(builder, exclude) + if exclude_authid: + message_fbs.PublishGen.PublishAddExcludeAuthid(builder, exclude_authid) + if exclude_authrole: + message_fbs.PublishGen.PublishAddExcludeAuthrole(builder, exclude_authrole) + + if eligible: + message_fbs.PublishGen.PublishAddEligible(builder, eligible) + if eligible_authid: + message_fbs.PublishGen.PublishAddEligibleAuthid(builder, eligible_authid) + if eligible_authrole: + message_fbs.PublishGen.PublishAddEligibleAuthrole(builder, eligible_authrole) + + if self.enc_algo: + message_fbs.PublishGen.PublishAddEncAlgo(builder, self.enc_algo) + if enc_key: + message_fbs.PublishGen.PublishAddEncKey(builder, enc_key) + if self.enc_serializer: + message_fbs.PublishGen.PublishAddEncSerializer(builder, self.enc_serializer) + + # FIXME: add forward_for + + msg = message_fbs.PublishGen.PublishEnd(builder) + + message_fbs.Message.MessageStart(builder) + message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.PUBLISH) + message_fbs.Message.MessageAddMsg(builder, msg) + union_msg = message_fbs.Message.MessageEnd(builder) + + return union_msg + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Publish.MESSAGE_TYPE) + + if len(wmsg) not in (4, 5, 6): + raise ProtocolError("invalid message length {0} for PUBLISH".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in PUBLISH") + options = check_or_raise_extra(wmsg[2], u"'options' in PUBLISH") + topic = check_or_raise_uri(wmsg[3], u"'topic' in PUBLISH") + + args = None + kwargs = None + payload = None + + if len(wmsg) == 5 and type(wmsg[4]) in [six.text_type, six.binary_type]: + + payload = wmsg[4] + + enc_algo = options.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' option in PUBLISH".format(enc_algo)) + + enc_key = options.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' option in PUBLISH".format(type(enc_key))) + + enc_serializer = options.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' option in PUBLISH".format(enc_serializer)) + + else: + if len(wmsg) > 4: + args = wmsg[4] + if type(args) not in [list, six.text_type, six.binary_type]: + raise ProtocolError("invalid type {0} for 'args' in PUBLISH".format(type(args))) + + if len(wmsg) > 5: + kwargs = wmsg[5] + if type(kwargs) not in [dict, six.text_type, six.binary_type]: + raise ProtocolError("invalid type {0} for 'kwargs' in PUBLISH".format(type(kwargs))) + + enc_algo = None + enc_key = None + enc_serializer = None + + acknowledge = None + exclude_me = None + exclude = None + exclude_authid = None + exclude_authrole = None + eligible = None + eligible_authid = None + eligible_authrole = None + retain = None + forward_for = None + + if u'acknowledge' in options: + + option_acknowledge = options[u'acknowledge'] + if type(option_acknowledge) != bool: + raise ProtocolError("invalid type {0} for 'acknowledge' option in PUBLISH".format(type(option_acknowledge))) + + acknowledge = option_acknowledge + + if u'exclude_me' in options: + + option_exclude_me = options[u'exclude_me'] + if type(option_exclude_me) != bool: + raise ProtocolError("invalid type {0} for 'exclude_me' option in PUBLISH".format(type(option_exclude_me))) + + exclude_me = option_exclude_me + + if u'exclude' in options: + + option_exclude = options[u'exclude'] + if type(option_exclude) != list: + raise ProtocolError("invalid type {0} for 'exclude' option in PUBLISH".format(type(option_exclude))) + + for _sessionid in option_exclude: + if type(_sessionid) not in six.integer_types: + raise ProtocolError("invalid type {0} for value in 'exclude' option in PUBLISH".format(type(_sessionid))) + + exclude = option_exclude + + if u'exclude_authid' in options: + + option_exclude_authid = options[u'exclude_authid'] + if type(option_exclude_authid) != list: + raise ProtocolError("invalid type {0} for 'exclude_authid' option in PUBLISH".format(type(option_exclude_authid))) + + for _authid in option_exclude_authid: + if type(_authid) != six.text_type: + raise ProtocolError("invalid type {0} for value in 'exclude_authid' option in PUBLISH".format(type(_authid))) + + exclude_authid = option_exclude_authid + + if u'exclude_authrole' in options: + + option_exclude_authrole = options[u'exclude_authrole'] + if type(option_exclude_authrole) != list: + raise ProtocolError("invalid type {0} for 'exclude_authrole' option in PUBLISH".format(type(option_exclude_authrole))) + + for _authrole in option_exclude_authrole: + if type(_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for value in 'exclude_authrole' option in PUBLISH".format(type(_authrole))) + + exclude_authrole = option_exclude_authrole + + if u'eligible' in options: + + option_eligible = options[u'eligible'] + if type(option_eligible) != list: + raise ProtocolError("invalid type {0} for 'eligible' option in PUBLISH".format(type(option_eligible))) + + for sessionId in option_eligible: + if type(sessionId) not in six.integer_types: + raise ProtocolError("invalid type {0} for value in 'eligible' option in PUBLISH".format(type(sessionId))) + + eligible = option_eligible + + if u'eligible_authid' in options: + + option_eligible_authid = options[u'eligible_authid'] + if type(option_eligible_authid) != list: + raise ProtocolError("invalid type {0} for 'eligible_authid' option in PUBLISH".format(type(option_eligible_authid))) + + for _authid in option_eligible_authid: + if type(_authid) != six.text_type: + raise ProtocolError("invalid type {0} for value in 'eligible_authid' option in PUBLISH".format(type(_authid))) + + eligible_authid = option_eligible_authid + + if u'eligible_authrole' in options: + + option_eligible_authrole = options[u'eligible_authrole'] + if type(option_eligible_authrole) != list: + raise ProtocolError("invalid type {0} for 'eligible_authrole' option in PUBLISH".format(type(option_eligible_authrole))) + + for _authrole in option_eligible_authrole: + if type(_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for value in 'eligible_authrole' option in PUBLISH".format(type(_authrole))) + + eligible_authrole = option_eligible_authrole + + if u'retain' in options: + retain = options[u'retain'] + if type(retain) != bool: + raise ProtocolError("invalid type {0} for 'retain' option in PUBLISH".format(type(retain))) + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in PUBLISH") + + obj = Publish(request, + topic, + args=args, + kwargs=kwargs, + payload=payload, + acknowledge=acknowledge, + exclude_me=exclude_me, + exclude=exclude, + exclude_authid=exclude_authid, + exclude_authrole=exclude_authrole, + eligible=eligible, + eligible_authid=eligible_authid, + eligible_authrole=eligible_authrole, + retain=retain, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + forward_for=forward_for) + + return obj + + def marshal_options(self): + options = {} + + if self.acknowledge is not None: + options[u'acknowledge'] = self.acknowledge + + if self.exclude_me is not None: + options[u'exclude_me'] = self.exclude_me + if self.exclude is not None: + options[u'exclude'] = self.exclude + if self.exclude_authid is not None: + options[u'exclude_authid'] = self.exclude_authid + if self.exclude_authrole is not None: + options[u'exclude_authrole'] = self.exclude_authrole + if self.eligible is not None: + options[u'eligible'] = self.eligible + if self.eligible_authid is not None: + options[u'eligible_authid'] = self.eligible_authid + if self.eligible_authrole is not None: + options[u'eligible_authrole'] = self.eligible_authrole + if self.retain is not None: + options[u'retain'] = self.retain + + if self.payload: + if self.enc_algo is not None: + options[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + options[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + options[u'enc_serializer'] = self.enc_serializer + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = self.marshal_options() + + if self.payload: + return [Publish.MESSAGE_TYPE, self.request, options, self.topic, self.payload] + else: + if self.kwargs: + return [Publish.MESSAGE_TYPE, self.request, options, self.topic, self.args, self.kwargs] + elif self.args: + return [Publish.MESSAGE_TYPE, self.request, options, self.topic, self.args] + else: + return [Publish.MESSAGE_TYPE, self.request, options, self.topic] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Publish(request={}, topic={}, args={}, kwargs={}, acknowledge={}, exclude_me={}, exclude={}, exclude_authid={}, exclude_authrole={}, eligible={}, eligible_authid={}, eligible_authrole={}, retain={}, enc_algo={}, enc_key={}, enc_serializer={}, payload={}, forward_for={})".format(self.request, self.topic, self.args, self.kwargs, self.acknowledge, self.exclude_me, self.exclude, self.exclude_authid, self.exclude_authrole, self.eligible, self.eligible_authid, self.eligible_authrole, self.retain, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.forward_for) + + +class Published(Message): + """ + A WAMP ``PUBLISHED`` message. + + Format: ``[PUBLISHED, PUBLISH.Request|id, Publication|id]`` + """ + + MESSAGE_TYPE = 17 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'publication', + ) + + def __init__(self, request, publication): + """ + + :param request: The request ID of the original `PUBLISH` request. + :type request: int + + :param publication: The publication ID for the published event. + :type publication: int + """ + assert(type(request) in six.integer_types) + assert(type(publication) in six.integer_types) + + Message.__init__(self) + self.request = request + self.publication = publication + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Published.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for PUBLISHED".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in PUBLISHED") + publication = check_or_raise_id(wmsg[2], u"'publication' in PUBLISHED") + + obj = Published(request, publication) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Published.MESSAGE_TYPE, self.request, self.publication] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Published(request={0}, publication={1})".format(self.request, self.publication) + + +class Subscribe(Message): + """ + A WAMP ``SUBSCRIBE`` message. + + Format: ``[SUBSCRIBE, Request|id, Options|dict, Topic|uri]`` + """ + + MESSAGE_TYPE = 32 + """ + The WAMP message code for this type of message. + """ + + MATCH_EXACT = u'exact' + MATCH_PREFIX = u'prefix' + MATCH_WILDCARD = u'wildcard' + + __slots__ = ( + 'request', + 'topic', + 'match', + 'get_retained', + 'forward_for', + ) + + def __init__(self, + request, + topic, + match=None, + get_retained=None, + forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param topic: The WAMP or application URI of the PubSub topic to subscribe to. + :type topic: str + + :param match: The topic matching method to be used for the subscription. + :type match: str + + :param get_retained: Whether the client wants the retained message we may have along with the subscription. + :type get_retained: bool or None + + :param forward_for: When this Subscribe is forwarded over a router-to-router link, + or via an intermediary router. + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(topic) == six.text_type) + assert(match is None or type(match) == six.text_type) + assert(match is None or match in [Subscribe.MATCH_EXACT, Subscribe.MATCH_PREFIX, Subscribe.MATCH_WILDCARD]) + assert(get_retained is None or type(get_retained) is bool) + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.topic = topic + self.match = match or Subscribe.MATCH_EXACT + self.get_retained = get_retained + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Subscribe.MESSAGE_TYPE) + + if len(wmsg) != 4: + raise ProtocolError("invalid message length {0} for SUBSCRIBE".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in SUBSCRIBE") + options = check_or_raise_extra(wmsg[2], u"'options' in SUBSCRIBE") + topic = check_or_raise_uri(wmsg[3], u"'topic' in SUBSCRIBE", allow_empty_components=True) + + match = Subscribe.MATCH_EXACT + get_retained = None + forward_for = None + + if u'match' in options: + + option_match = options[u'match'] + if type(option_match) != six.text_type: + raise ProtocolError("invalid type {0} for 'match' option in SUBSCRIBE".format(type(option_match))) + + if option_match not in [Subscribe.MATCH_EXACT, Subscribe.MATCH_PREFIX, Subscribe.MATCH_WILDCARD]: + raise ProtocolError("invalid value {0} for 'match' option in SUBSCRIBE".format(option_match)) + + match = option_match + + if u'get_retained' in options: + get_retained = options[u'get_retained'] + + if type(get_retained) != bool: + raise ProtocolError("invalid type {0} for 'get_retained' option in SUBSCRIBE".format(type(get_retained))) + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in SUBSCRIBE") + + obj = Subscribe(request, topic, match=match, get_retained=get_retained, forward_for=forward_for) + + return obj + + def marshal_options(self): + options = {} + + if self.match and self.match != Subscribe.MATCH_EXACT: + options[u'match'] = self.match + + if self.get_retained is not None: + options[u'get_retained'] = self.get_retained + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Subscribe.MESSAGE_TYPE, self.request, self.marshal_options(), self.topic] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Subscribe(request={0}, topic={1}, match={2}, get_retained={3}, forward_for={4})".format(self.request, self.topic, self.match, self.get_retained, self.forward_for) + + +class Subscribed(Message): + """ + A WAMP ``SUBSCRIBED`` message. + + Format: ``[SUBSCRIBED, SUBSCRIBE.Request|id, Subscription|id]`` + """ + + MESSAGE_TYPE = 33 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'subscription', + ) + + def __init__(self, request, subscription): + """ + + :param request: The request ID of the original ``SUBSCRIBE`` request. + :type request: int + + :param subscription: The subscription ID for the subscribed topic (or topic pattern). + :type subscription: int + """ + assert(type(request) in six.integer_types) + assert(type(subscription) in six.integer_types) + + Message.__init__(self) + self.request = request + self.subscription = subscription + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Subscribed.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for SUBSCRIBED".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in SUBSCRIBED") + subscription = check_or_raise_id(wmsg[2], u"'subscription' in SUBSCRIBED") + + obj = Subscribed(request, subscription) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Subscribed.MESSAGE_TYPE, self.request, self.subscription] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Subscribed(request={0}, subscription={1})".format(self.request, self.subscription) + + +class Unsubscribe(Message): + """ + A WAMP ``UNSUBSCRIBE`` message. + + Formats: + + * ``[UNSUBSCRIBE, Request|id, SUBSCRIBED.Subscription|id]`` + * ``[UNSUBSCRIBE, Request|id, SUBSCRIBED.Subscription|id, Options|dict]`` + """ + + MESSAGE_TYPE = 34 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'subscription', + 'forward_for', + ) + + def __init__(self, request, subscription, forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param subscription: The subscription ID for the subscription to unsubscribe from. + :type subscription: int + + :param forward_for: When this Unsubscribe is forwarded over a router-to-router link, + or via an intermediary router. + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(subscription) in six.integer_types) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.subscription = subscription + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Unsubscribe.MESSAGE_TYPE) + + if len(wmsg) not in [3, 4]: + raise ProtocolError("invalid message length {0} for WAMP UNSUBSCRIBE".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in UNSUBSCRIBE") + subscription = check_or_raise_id(wmsg[2], u"'subscription' in UNSUBSCRIBE") + + options = None + if len(wmsg) > 3: + options = check_or_raise_extra(wmsg[3], u"'options' in UNSUBSCRIBE") + + forward_for = None + if options and u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in UNSUBSCRIBE") + + obj = Unsubscribe(request, subscription, forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + if self.forward_for: + options = { + u'forward_for': self.forward_for, + } + return [Unsubscribe.MESSAGE_TYPE, self.request, self.subscription, options] + else: + return [Unsubscribe.MESSAGE_TYPE, self.request, self.subscription] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Unsubscribe(request={0}, subscription={1}, forward_for={2})".format(self.request, self.subscription, self.forward_for) + + +class Unsubscribed(Message): + """ + A WAMP ``UNSUBSCRIBED`` message. + + Formats: + + * ``[UNSUBSCRIBED, UNSUBSCRIBE.Request|id]`` + * ``[UNSUBSCRIBED, UNSUBSCRIBE.Request|id, Details|dict]`` + """ + + MESSAGE_TYPE = 35 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'subscription', + 'reason', + ) + + def __init__(self, request, subscription=None, reason=None): + """ + + :param request: The request ID of the original ``UNSUBSCRIBE`` request or + ``0`` is router triggered unsubscribe ("router revocation signaling"). + :type request: int + + :param subscription: If unsubscribe was actively triggered by router, the ID + of the subscription revoked. + :type subscription: int or None + + :param reason: The reason (an URI) for an active (router initiated) revocation. + :type reason: str or None. + """ + assert(type(request) in six.integer_types) + assert(subscription is None or type(subscription) in six.integer_types) + assert(reason is None or type(reason) == six.text_type) + assert((request != 0 and subscription is None) or (request == 0 and subscription != 0)) + + Message.__init__(self) + self.request = request + self.subscription = subscription + self.reason = reason + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Unsubscribed.MESSAGE_TYPE) + + if len(wmsg) not in [2, 3]: + raise ProtocolError("invalid message length {0} for UNSUBSCRIBED".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in UNSUBSCRIBED") + + subscription = None + reason = None + + if len(wmsg) > 2: + + details = check_or_raise_extra(wmsg[2], u"'details' in UNSUBSCRIBED") + + if u"subscription" in details: + details_subscription = details[u"subscription"] + if type(details_subscription) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'subscription' detail in UNSUBSCRIBED".format(type(details_subscription))) + subscription = details_subscription + + if u"reason" in details: + reason = check_or_raise_uri(details[u"reason"], u"'reason' in UNSUBSCRIBED") + + obj = Unsubscribed(request, subscription, reason) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + if self.reason is not None or self.subscription is not None: + details = {} + if self.reason is not None: + details[u"reason"] = self.reason + if self.subscription is not None: + details[u"subscription"] = self.subscription + return [Unsubscribed.MESSAGE_TYPE, self.request, details] + else: + return [Unsubscribed.MESSAGE_TYPE, self.request] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Unsubscribed(request={0}, reason={1}, subscription={2})".format(self.request, self.reason, self.subscription) + + +class Event(Message): + """ + A WAMP ``EVENT`` message. + + Formats: + + * ``[EVENT, SUBSCRIBED.Subscription|id, PUBLISHED.Publication|id, Details|dict]`` + * ``[EVENT, SUBSCRIBED.Subscription|id, PUBLISHED.Publication|id, Details|dict, PUBLISH.Arguments|list]`` + * ``[EVENT, SUBSCRIBED.Subscription|id, PUBLISHED.Publication|id, Details|dict, PUBLISH.Arguments|list, PUBLISH.ArgumentsKw|dict]`` + * ``[EVENT, SUBSCRIBED.Subscription|id, PUBLISHED.Publication|id, Details|dict, PUBLISH.Payload|binary]`` + """ + + MESSAGE_TYPE = 36 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + # uint64 + '_subscription', + + # uint64 + '_publication', + + # [uint8] + '_args', + + # [uint8] + '_kwargs', + + # [uint8] + '_payload', + + # Payload => uint8 + '_enc_algo', + + # Serializer => uint8 + '_enc_serializer', + + # [uint8] + '_enc_key', + + # uint64 + '_publisher', + + # string (principal) + '_publisher_authid', + + # string (principal) + '_publisher_authrole', + + # string (uri) + '_topic', + + # bool + '_retained', + + # bool - FIXME: rename to "acknowledge" + '_x_acknowledged_delivery', + + # [Principal] + '_forward_for', + ) + + def __init__(self, subscription=None, publication=None, args=None, kwargs=None, payload=None, + publisher=None, publisher_authid=None, publisher_authrole=None, topic=None, + retained=None, x_acknowledged_delivery=None, + enc_algo=None, enc_key=None, enc_serializer=None, forward_for=None, + from_fbs=None): + """ + + :param subscription: The subscription ID this event is dispatched under. + :type subscription: int + + :param publication: The publication ID of the dispatched event. + :type publication: int + + :param args: Positional values for application-defined exception. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined exception. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param publisher: The WAMP session ID of the publisher. Only filled if publisher is disclosed. + :type publisher: None or int + + :param publisher_authid: The WAMP authid of the publisher. Only filled if publisher is disclosed. + :type publisher_authid: None or unicode + + :param publisher_authrole: The WAMP authrole of the publisher. Only filled if publisher is disclosed. + :type publisher_authrole: None or unicode + + :param topic: For pattern-based subscriptions, the event MUST contain the actual topic published to. + :type topic: str or None + + :param retained: Whether the message was retained by the broker on the topic, rather than just published. + :type retained: bool or None + + :param x_acknowledged_delivery: Whether this Event should be acknowledged. + :type x_acknowledged_delivery: bool or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param forward_for: When this Event is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(subscription is None or type(subscription) in six.integer_types) + assert(publication is None or type(publication) in six.integer_types) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(publisher is None or type(publisher) in six.integer_types) + assert(publisher_authid is None or type(publisher_authid) == six.text_type) + assert(publisher_authrole is None or type(publisher_authrole) == six.text_type) + assert(topic is None or type(topic) == six.text_type) + assert(retained is None or type(retained) == bool) + assert(x_acknowledged_delivery is None or type(x_acknowledged_delivery) == bool) + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self, from_fbs=from_fbs) + self._subscription = subscription + self._publication = publication + self._args = args + self._kwargs = _validate_kwargs(kwargs) + self._payload = payload + self._publisher = publisher + self._publisher_authid = publisher_authid + self._publisher_authrole = publisher_authrole + self._topic = topic + self._retained = retained + self._x_acknowledged_delivery = x_acknowledged_delivery + self._enc_algo = enc_algo + self._enc_key = enc_key + self._enc_serializer = enc_serializer + self._forward_for = forward_for + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + if not Message.__eq__(self, other): + return False + if other.subscription != self.subscription: + return False + if other.publication != self.publication: + return False + if other.args != self.args: + return False + if other.kwargs != self.kwargs: + return False + if other.payload != self.payload: + return False + if other.publisher != self.publisher: + return False + if other.publisher_authid != self.publisher_authid: + return False + if other.publisher_authrole != self.publisher_authrole: + return False + if other.topic != self.topic: + return False + if other.retained != self.retained: + return False + if other.x_acknowledged_delivery != self.x_acknowledged_delivery: + return False + if other.enc_algo != self.enc_algo: + return False + if other.enc_key != self.enc_key: + return False + if other.enc_serializer != self.enc_serializer: + return False + if other.forward_for != self.forward_for: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + + @property + def subscription(self): + if self._subscription is None and self._from_fbs: + self._subscription = self._from_fbs.Subscription() + return self._subscription + + @subscription.setter + def subscription(self, value): + assert(value is None or type(value) in six.integer_types) + self._subscription = value + + @property + def publication(self): + if self._publication is None and self._from_fbs: + self._publication = self._from_fbs.Publication() + return self._publication + + @publication.setter + def publication(self, value): + assert(value is None or type(value) in six.integer_types) + self._publication = value + + @property + def args(self): + if self._args is None and self._from_fbs: + if self._from_fbs.ArgsLength(): + self._args = cbor.loads(bytes(self._from_fbs.ArgsAsBytes())) + return self._args + + @args.setter + def args(self, value): + assert(value is None or type(value) in [list, tuple]) + self._args = value + + @property + def kwargs(self): + if self._kwargs is None and self._from_fbs: + if self._from_fbs.KwargsLength(): + self._kwargs = cbor.loads(bytes(self._from_fbs.KwargsAsBytes())) + return self._kwargs + + @kwargs.setter + def kwargs(self, value): + assert(value is None or type(value) == dict) + self._kwargs = value + + @property + def payload(self): + if self._payload is None and self._from_fbs: + if self._from_fbs.PayloadLength(): + self._payload = self._from_fbs.PayloadAsBytes() + return self._payload + + @payload.setter + def payload(self, value): + assert value is None or type(value) == bytes + self._payload = value + + @property + def publisher(self): + if self._publisher is None and self._from_fbs: + publisher = self._from_fbs.Publisher() + if publisher: + self._publisher = publisher + return self._publisher + + @publisher.setter + def publisher(self, value): + assert value is None or type(value) == int + self._publisher = value + + @property + def publisher_authid(self): + if self._publisher_authid is None and self._from_fbs: + s = self._from_fbs.PublisherAuthid() + if s: + self._publisher_authid = s.decode('utf8') + return self._publisher_authid + + @publisher_authid.setter + def publisher_authid(self, value): + assert value is None or type(value) == str + self._publisher_authid = value + + @property + def publisher_authrole(self): + if self._publisher_authrole is None and self._from_fbs: + s = self._from_fbs.PublisherAuthrole() + if s: + self._publisher_authrole = s.decode('utf8') + return self._publisher_authrole + + @publisher_authrole.setter + def publisher_authrole(self, value): + assert value is None or type(value) == str + self._publisher_authrole = value + + @property + def topic(self): + if self._topic is None and self._from_fbs: + s = self._from_fbs.Topic() + if s: + self._topic = s.decode('utf8') + return self._topic + + @topic.setter + def topic(self, value): + assert value is None or type(value) == str + self._topic = value + + @property + def retained(self): + if self._retained is None and self._from_fbs: + self._retained = self._from_fbs.Retained() + return self._retained + + @retained.setter + def retained(self, value): + assert value is None or type(value) == bool + self._retained = value + + @property + def x_acknowledged_delivery(self): + if self._x_acknowledged_delivery is None and self._from_fbs: + x_acknowledged_delivery = self._from_fbs.Acknowledge() + if x_acknowledged_delivery: + self._x_acknowledged_delivery = x_acknowledged_delivery + return self._x_acknowledged_delivery + + @x_acknowledged_delivery.setter + def x_acknowledged_delivery(self, value): + assert value is None or type(value) == bool + self._x_acknowledged_delivery = value + + @property + def enc_algo(self): + if self._enc_algo is None and self._from_fbs: + enc_algo = self._from_fbs.EncAlgo() + if enc_algo: + self._enc_algo = enc_algo + return self._enc_algo + + @enc_algo.setter + def enc_algo(self, value): + assert value is None or value in [ENC_ALGO_CRYPTOBOX, ENC_ALGO_MQTT, ENC_ALGO_XBR] + self._enc_algo = value + + @property + def enc_key(self): + if self._enc_key is None and self._from_fbs: + if self._from_fbs.EncKeyLength(): + self._enc_key = self._from_fbs.EncKeyAsBytes() + return self._enc_key + + @enc_key.setter + def enc_key(self, value): + assert value is None or type(value) == bytes + self._enc_key = value + + @property + def enc_serializer(self): + if self._enc_serializer is None and self._from_fbs: + enc_serializer = self._from_fbs.EncSerializer() + if enc_serializer: + self._enc_serializer = enc_serializer + return self._enc_serializer + + @enc_serializer.setter + def enc_serializer(self, value): + assert value is None or value in [ENC_SER_JSON, ENC_SER_MSGPACK, ENC_SER_CBOR, ENC_SER_UBJSON] + self._enc_serializer = value + + @property + def forward_for(self): + # FIXME + return self._forward_for + + @forward_for.setter + def forward_for(self, value): + # FIXME + self._forward_for = value + + @staticmethod + def cast(buf): + return Event(from_fbs=message_fbs.Event.GetRootAsEvent(buf, 0)) + + def build(self, builder): + + args = self.args + if args: + args = builder.CreateByteVector(cbor.dumps(args)) + + kwargs = self.kwargs + if kwargs: + kwargs = builder.CreateByteVector(cbor.dumps(kwargs)) + + payload = self.payload + if payload: + payload = builder.CreateByteVector(payload) + + publisher_authid = self.publisher_authid + if publisher_authid: + publisher_authid = builder.CreateString(publisher_authid) + + publisher_authrole = self.publisher_authrole + if publisher_authrole: + publisher_authrole = builder.CreateString(publisher_authrole) + + topic = self.topic + if topic: + topic = builder.CreateString(topic) + + enc_key = self.enc_key + if enc_key: + enc_key = builder.CreateByteVector(enc_key) + + message_fbs.EventGen.EventStart(builder) + + if self.subscription: + message_fbs.EventGen.EventAddSubscription(builder, self.subscription) + if self.publication: + message_fbs.EventGen.EventAddPublication(builder, self.publication) + + if args: + message_fbs.EventGen.EventAddArgs(builder, args) + if kwargs: + message_fbs.EventGen.EventAddKwargs(builder, kwargs) + if payload: + message_fbs.EventGen.EventAddPayload(builder, payload) + + if self.publisher: + message_fbs.EventGen.EventAddPublisher(builder, self.publisher) + if publisher_authid: + message_fbs.EventGen.EventAddPublisherAuthid(builder, publisher_authid) + if publisher_authrole: + message_fbs.EventGen.EventAddPublisherAuthrole(builder, publisher_authrole) + + if topic: + message_fbs.EventGen.EventAddTopic(builder, topic) + if self.retained is not None: + message_fbs.EventGen.EventAddRetained(builder, self.retained) + if self.x_acknowledged_delivery is not None: + message_fbs.EventGen.EventAddAcknowledge(builder, self.x_acknowledged_delivery) + + if self.enc_algo: + message_fbs.EventGen.EventAddEncAlgo(builder, self.enc_algo) + if enc_key: + message_fbs.EventGen.EventAddEncKey(builder, enc_key) + if self.enc_serializer: + message_fbs.EventGen.EventAddEncSerializer(builder, self.enc_serializer) + + # FIXME: add forward_for + + msg = message_fbs.EventGen.EventEnd(builder) + + message_fbs.Message.MessageStart(builder) + message_fbs.Message.MessageAddMsgType(builder, message_fbs.MessageType.EVENT) + message_fbs.Message.MessageAddMsg(builder, msg) + union_msg = message_fbs.Message.MessageEnd(builder) + + return union_msg + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Event.MESSAGE_TYPE) + + if len(wmsg) not in (4, 5, 6): + raise ProtocolError("invalid message length {0} for EVENT".format(len(wmsg))) + + subscription = check_or_raise_id(wmsg[1], u"'subscription' in EVENT") + publication = check_or_raise_id(wmsg[2], u"'publication' in EVENT") + details = check_or_raise_extra(wmsg[3], u"'details' in EVENT") + + args = None + kwargs = None + payload = None + enc_algo = None + enc_key = None + enc_serializer = None + + if len(wmsg) == 5 and type(wmsg[4]) == six.binary_type: + + payload = wmsg[4] + + enc_algo = details.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in EVENT".format(enc_algo)) + + enc_key = details.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in EVENT".format(type(enc_key))) + + enc_serializer = details.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in EVENT".format(enc_serializer)) + + else: + if len(wmsg) > 4: + args = wmsg[4] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in EVENT".format(type(args))) + if len(wmsg) > 5: + kwargs = wmsg[5] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in EVENT".format(type(kwargs))) + + publisher = None + publisher_authid = None + publisher_authrole = None + topic = None + retained = None + forward_for = None + x_acknowledged_delivery = None + + if u'publisher' in details: + + detail_publisher = details[u'publisher'] + if type(detail_publisher) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'publisher' detail in EVENT".format(type(detail_publisher))) + + publisher = detail_publisher + + if u'publisher_authid' in details: + + detail_publisher_authid = details[u'publisher_authid'] + if type(detail_publisher_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'publisher_authid' detail in EVENT".format(type(detail_publisher_authid))) + + publisher_authid = detail_publisher_authid + + if u'publisher_authrole' in details: + + detail_publisher_authrole = details[u'publisher_authrole'] + if type(detail_publisher_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'publisher_authrole' detail in EVENT".format(type(detail_publisher_authrole))) + + publisher_authrole = detail_publisher_authrole + + if u'topic' in details: + + detail_topic = details[u'topic'] + if type(detail_topic) != six.text_type: + raise ProtocolError("invalid type {0} for 'topic' detail in EVENT".format(type(detail_topic))) + + topic = detail_topic + + if u'retained' in details: + retained = details[u'retained'] + if type(retained) != bool: + raise ProtocolError("invalid type {0} for 'retained' detail in EVENT".format(type(retained))) + + if u'x_acknowledged_delivery' in details: + x_acknowledged_delivery = details[u'x_acknowledged_delivery'] + if type(x_acknowledged_delivery) != bool: + raise ProtocolError("invalid type {0} for 'x_acknowledged_delivery' detail in EVENT".format(type(x_acknowledged_delivery))) + + if u'forward_for' in details: + forward_for = details[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in EVENT") + + obj = Event(subscription, + publication, + args=args, + kwargs=kwargs, + payload=payload, + publisher=publisher, + publisher_authid=publisher_authid, + publisher_authrole=publisher_authrole, + topic=topic, + retained=retained, + x_acknowledged_delivery=x_acknowledged_delivery, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + + if self.publisher is not None: + details[u'publisher'] = self.publisher + + if self.publisher_authid is not None: + details[u'publisher_authid'] = self.publisher_authid + + if self.publisher_authrole is not None: + details[u'publisher_authrole'] = self.publisher_authrole + + if self.topic is not None: + details[u'topic'] = self.topic + + if self.retained is not None: + details[u'retained'] = self.retained + + if self.x_acknowledged_delivery is not None: + details[u'x_acknowledged_delivery'] = self.x_acknowledged_delivery + + if self.forward_for is not None: + details[u'forward_for'] = self.forward_for + + if self.payload: + if self.enc_algo is not None: + details[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + details[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + details[u'enc_serializer'] = self.enc_serializer + return [Event.MESSAGE_TYPE, self.subscription, self.publication, details, self.payload] + else: + if self.kwargs: + return [Event.MESSAGE_TYPE, self.subscription, self.publication, details, self.args, self.kwargs] + elif self.args: + return [Event.MESSAGE_TYPE, self.subscription, self.publication, details, self.args] + else: + return [Event.MESSAGE_TYPE, self.subscription, self.publication, details] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Event(subscription={}, publication={}, args={}, kwargs={}, publisher={}, publisher_authid={}, publisher_authrole={}, topic={}, retained={}, enc_algo={}, enc_key={}, enc_serializer={}, payload={}, forward_for={})".format(self.subscription, self.publication, self.args, self.kwargs, self.publisher, self.publisher_authid, self.publisher_authrole, self.topic, self.retained, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.forward_for) + + +class EventReceived(Message): + """ + A WAMP ``EVENT_RECEIVED`` message. + + Format: ``[EVENT_RECEIVED, EVENT.Publication|id]`` + """ + + # NOTE: Implementation-specific message! Should be 37 on ratification. + MESSAGE_TYPE = 337 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'publication', + ) + + def __init__(self, publication): + """ + + :param publication: The publication ID for the sent event. + :type publication: int + """ + assert(type(publication) in six.integer_types) + + Message.__init__(self) + self.publication = publication + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == EventReceived.MESSAGE_TYPE) + + if len(wmsg) != 2: + raise ProtocolError("invalid message length {0} for EVENT_RECEIVED".format(len(wmsg))) + + publication = check_or_raise_id(wmsg[1], u"'publication' in EVENT_RECEIVED") + + obj = EventReceived(publication) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [EventReceived.MESSAGE_TYPE, self.publication] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"EventReceived(publication={})".format(self.publication) + + +class Call(Message): + """ + A WAMP ``CALL`` message. + + Formats: + + * ``[CALL, Request|id, Options|dict, Procedure|uri]`` + * ``[CALL, Request|id, Options|dict, Procedure|uri, Arguments|list]`` + * ``[CALL, Request|id, Options|dict, Procedure|uri, Arguments|list, ArgumentsKw|dict]`` + * ``[CALL, Request|id, Options|dict, Procedure|uri, Payload|binary]`` + """ + + MESSAGE_TYPE = 48 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'procedure', + 'args', + 'kwargs', + 'payload', + 'timeout', + 'receive_progress', + 'enc_algo', + 'enc_key', + 'enc_serializer', + 'caller', + 'caller_authid', + 'caller_authrole', + 'forward_for', + ) + + def __init__(self, + request, + procedure, + args=None, + kwargs=None, + payload=None, + timeout=None, + receive_progress=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + caller=None, + caller_authid=None, + caller_authrole=None, + forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param procedure: The WAMP or application URI of the procedure which should be called. + :type procedure: str + + :param args: Positional values for application-defined call arguments. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined call arguments. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param timeout: If present, let the callee automatically cancel + the call after this ms. + :type timeout: int or None + + :param receive_progress: If ``True``, indicates that the caller wants to receive + progressive call results. + :type receive_progress: bool or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param caller: The WAMP session ID of the caller. Only filled if caller is disclosed. + :type caller: None or int + + :param caller_authid: The WAMP authid of the caller. Only filled if caller is disclosed. + :type caller_authid: None or unicode + + :param caller_authrole: The WAMP authrole of the caller. Only filled if caller is disclosed. + :type caller_authrole: None or unicode + + :param forward_for: When this Publish is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(procedure) == six.text_type) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(timeout is None or type(timeout) in six.integer_types) + assert(receive_progress is None or type(receive_progress) == bool) + + # payload transparency related knobs + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + + assert(caller is None or type(caller) in six.integer_types) + assert(caller_authid is None or type(caller_authid) == six.text_type) + assert(caller_authrole is None or type(caller_authrole) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.procedure = procedure + self.args = args + self.kwargs = _validate_kwargs(kwargs) + self.payload = payload + self.timeout = timeout + self.receive_progress = receive_progress + + # payload transparency related knobs + self.enc_algo = enc_algo + self.enc_key = enc_key + self.enc_serializer = enc_serializer + + # message forwarding + self.caller = caller + self.caller_authid = caller_authid + self.caller_authrole = caller_authrole + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Call.MESSAGE_TYPE) + + if len(wmsg) not in (4, 5, 6): + raise ProtocolError("invalid message length {0} for CALL".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in CALL") + options = check_or_raise_extra(wmsg[2], u"'options' in CALL") + procedure = check_or_raise_uri(wmsg[3], u"'procedure' in CALL") + + args = None + kwargs = None + payload = None + enc_algo = None + enc_key = None + enc_serializer = None + + if len(wmsg) == 5 and type(wmsg[4]) in [six.text_type, six.binary_type]: + + payload = wmsg[4] + + enc_algo = options.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in CALL".format(enc_algo)) + + enc_key = options.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in CALL".format(type(enc_key))) + + enc_serializer = options.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in CALL".format(enc_serializer)) + + else: + if len(wmsg) > 4: + args = wmsg[4] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in CALL".format(type(args))) + + if len(wmsg) > 5: + kwargs = wmsg[5] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in CALL".format(type(kwargs))) + + timeout = None + receive_progress = None + caller = None + caller_authid = None + caller_authrole = None + forward_for = None + + if u'timeout' in options: + + option_timeout = options[u'timeout'] + if type(option_timeout) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'timeout' option in CALL".format(type(option_timeout))) + + if option_timeout < 0: + raise ProtocolError("invalid value {0} for 'timeout' option in CALL".format(option_timeout)) + + timeout = option_timeout + + if u'receive_progress' in options: + + option_receive_progress = options[u'receive_progress'] + if type(option_receive_progress) != bool: + raise ProtocolError("invalid type {0} for 'receive_progress' option in CALL".format(type(option_receive_progress))) + + receive_progress = option_receive_progress + + if u'caller' in options: + + option_caller = options[u'caller'] + if type(option_caller) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'caller' detail in CALL".format(type(option_caller))) + + caller = option_caller + + if u'caller_authid' in options: + + option_caller_authid = options[u'caller_authid'] + if type(option_caller_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'caller_authid' detail in CALL".format(type(option_caller_authid))) + + caller_authid = option_caller_authid + + if u'caller_authrole' in options: + + option_caller_authrole = options[u'caller_authrole'] + if type(option_caller_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'caller_authrole' detail in CALL".format(type(option_caller_authrole))) + + caller_authrole = option_caller_authrole + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in CALL") + + obj = Call(request, + procedure, + args=args, + kwargs=kwargs, + payload=payload, + timeout=timeout, + receive_progress=receive_progress, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + caller=caller, + caller_authid=caller_authid, + caller_authrole=caller_authrole, + forward_for=forward_for) + + return obj + + def marshal_options(self): + options = {} + + if self.timeout is not None: + options[u'timeout'] = self.timeout + + if self.receive_progress is not None: + options[u'receive_progress'] = self.receive_progress + + if self.payload: + if self.enc_algo is not None: + options[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + options[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + options[u'enc_serializer'] = self.enc_serializer + + if self.caller is not None: + options[u'caller'] = self.caller + if self.caller_authid is not None: + options[u'caller_authid'] = self.caller_authid + if self.caller_authrole is not None: + options[u'caller_authrole'] = self.caller_authrole + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = self.marshal_options() + + if self.payload: + return [Call.MESSAGE_TYPE, self.request, options, self.procedure, self.payload] + else: + if self.kwargs: + return [Call.MESSAGE_TYPE, self.request, options, self.procedure, self.args, self.kwargs] + elif self.args: + return [Call.MESSAGE_TYPE, self.request, options, self.procedure, self.args] + else: + return [Call.MESSAGE_TYPE, self.request, options, self.procedure] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Call(request={}, procedure={}, args={}, kwargs={}, timeout={}, receive_progress={}, enc_algo={}, enc_key={}, enc_serializer={}, payload={}, caller={}, caller_authid={}, caller_authrole={}, forward_for={})".format(self.request, self.procedure, self.args, self.kwargs, self.timeout, self.receive_progress, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.caller, self.caller_authid, self.caller_authrole, self.forward_for) + + +class Cancel(Message): + """ + A WAMP ``CANCEL`` message. + + Format: ``[CANCEL, CALL.Request|id, Options|dict]`` + + See: https://wamp-proto.org/static/rfc/draft-oberstet-hybi-crossbar-wamp.html#rfc.section.14.3.4 + """ + + MESSAGE_TYPE = 49 + """ + The WAMP message code for this type of message. + """ + + SKIP = u'skip' + KILL = u'kill' + KILLNOWAIT = u'killnowait' + + __slots__ = ( + 'request', + 'mode', + 'forward_for', + ) + + def __init__(self, request, mode=None, forward_for=None): + """ + + :param request: The WAMP request ID of the original `CALL` to cancel. + :type request: int + + :param mode: Specifies how to cancel the call (``"skip"``, ``"killnowait"`` or ``"kill"``). + :type mode: str or None + + :param forward_for: When this Cancel is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(mode is None or type(mode) == six.text_type) + assert(mode in [None, self.SKIP, self.KILLNOWAIT, self.KILL]) + assert(forward_for is None or type(forward_for) == list) + + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.mode = mode + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Cancel.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for CANCEL".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in CANCEL") + options = check_or_raise_extra(wmsg[2], u"'options' in CANCEL") + + # options + # + mode = None + forward_for = None + + if u'mode' in options: + + option_mode = options[u'mode'] + if type(option_mode) != six.text_type: + raise ProtocolError("invalid type {0} for 'mode' option in CANCEL".format(type(option_mode))) + + if option_mode not in [Cancel.SKIP, Cancel.KILLNOWAIT, Cancel.KILL]: + raise ProtocolError("invalid value '{0}' for 'mode' option in CANCEL".format(option_mode)) + + mode = option_mode + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in CANCEL") + + obj = Cancel(request, mode=mode, forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = {} + + if self.mode is not None: + options[u'mode'] = self.mode + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return [Cancel.MESSAGE_TYPE, self.request, options] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Cancel(request={0}, mode={1})".format(self.request, self.mode) + + +class Result(Message): + """ + A WAMP ``RESULT`` message. + + Formats: + + * ``[RESULT, CALL.Request|id, Details|dict]`` + * ``[RESULT, CALL.Request|id, Details|dict, YIELD.Arguments|list]`` + * ``[RESULT, CALL.Request|id, Details|dict, YIELD.Arguments|list, YIELD.ArgumentsKw|dict]`` + * ``[RESULT, CALL.Request|id, Details|dict, Payload|binary]`` + """ + + MESSAGE_TYPE = 50 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'args', + 'kwargs', + 'payload', + 'progress', + 'enc_algo', + 'enc_key', + 'enc_serializer', + 'callee', + 'callee_authid', + 'callee_authrole', + 'forward_for', + ) + + def __init__(self, + request, + args=None, + kwargs=None, + payload=None, + progress=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + callee=None, + callee_authid=None, + callee_authrole=None, + forward_for=None): + """ + + :param request: The request ID of the original `CALL` request. + :type request: int + + :param args: Positional values for application-defined event payload. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined event payload. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param progress: If ``True``, this result is a progressive call result, and subsequent + results (or a final error) will follow. + :type progress: bool or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param callee: The WAMP session ID of the effective callee that responded with the result. Only filled if callee is disclosed. + :type callee: None or int + + :param callee_authid: The WAMP authid of the responding callee. Only filled if callee is disclosed. + :type callee_authid: None or unicode + + :param callee_authrole: The WAMP authrole of the responding callee. Only filled if callee is disclosed. + :type callee_authrole: None or unicode + + :param forward_for: When this Result is forwarded for a client/callee (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(progress is None or type(progress) == bool) + + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + + assert(callee is None or type(callee) in six.integer_types) + assert(callee_authid is None or type(callee_authid) == six.text_type) + assert(callee_authrole is None or type(callee_authrole) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.args = args + self.kwargs = _validate_kwargs(kwargs) + self.payload = payload + self.progress = progress + + # payload transparency related knobs + self.enc_algo = enc_algo + self.enc_key = enc_key + self.enc_serializer = enc_serializer + + # effective callee that responded with the result + self.callee = callee + self.callee_authid = callee_authid + self.callee_authrole = callee_authrole + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Result.MESSAGE_TYPE) + + if len(wmsg) not in (3, 4, 5): + raise ProtocolError("invalid message length {0} for RESULT".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in RESULT") + details = check_or_raise_extra(wmsg[2], u"'details' in RESULT") + + args = None + kwargs = None + payload = None + progress = None + enc_algo = None + enc_key = None + enc_serializer = None + callee = None + callee_authid = None + callee_authrole = None + forward_for = None + + if len(wmsg) == 4 and type(wmsg[3]) in [six.text_type, six.binary_type]: + + payload = wmsg[3] + + enc_algo = details.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in RESULT".format(enc_algo)) + + enc_key = details.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in RESULT".format(type(enc_key))) + + enc_serializer = details.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in RESULT".format(enc_serializer)) + + else: + if len(wmsg) > 3: + args = wmsg[3] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in RESULT".format(type(args))) + + if len(wmsg) > 4: + kwargs = wmsg[4] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in RESULT".format(type(kwargs))) + + if u'progress' in details: + + detail_progress = details[u'progress'] + if type(detail_progress) != bool: + raise ProtocolError("invalid type {0} for 'progress' option in RESULT".format(type(detail_progress))) + + progress = detail_progress + + if u'callee' in details: + + detail_callee = details[u'callee'] + if type(detail_callee) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'callee' detail in RESULT".format(type(detail_callee))) + + callee = detail_callee + + if u'callee_authid' in details: + + detail_callee_authid = details[u'callee_authid'] + if type(detail_callee_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authid' detail in RESULT".format(type(detail_callee_authid))) + + callee_authid = detail_callee_authid + + if u'callee_authrole' in details: + + detail_callee_authrole = details[u'callee_authrole'] + if type(detail_callee_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authrole' detail in RESULT".format(type(detail_callee_authrole))) + + callee_authrole = detail_callee_authrole + + if u'forward_for' in details: + forward_for = details[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in RESULT") + + obj = Result(request, + args=args, + kwargs=kwargs, + payload=payload, + progress=progress, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + callee=callee, + callee_authid=callee_authid, + callee_authrole=callee_authrole, + forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + details = {} + + if self.progress is not None: + details[u'progress'] = self.progress + + if self.callee is not None: + details[u'callee'] = self.callee + if self.callee_authid is not None: + details[u'callee_authid'] = self.callee_authid + if self.callee_authrole is not None: + details[u'callee_authrole'] = self.callee_authrole + if self.forward_for is not None: + details[u'forward_for'] = self.forward_for + + if self.payload: + if self.enc_algo is not None: + details[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + details[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + details[u'enc_serializer'] = self.enc_serializer + return [Result.MESSAGE_TYPE, self.request, details, self.payload] + else: + if self.kwargs: + return [Result.MESSAGE_TYPE, self.request, details, self.args, self.kwargs] + elif self.args: + return [Result.MESSAGE_TYPE, self.request, details, self.args] + else: + return [Result.MESSAGE_TYPE, self.request, details] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Result(request={0}, args={1}, kwargs={2}, progress={3}, enc_algo={4}, enc_key={5}, enc_serializer={6}, payload={7}, callee={8}, callee_authid={9}, callee_authrole={10}, forward_for={11})".format(self.request, self.args, self.kwargs, self.progress, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.callee, self.callee_authid, self.callee_authrole, self.forward_for) + + +class Register(Message): + """ + A WAMP ``REGISTER`` message. + + Format: ``[REGISTER, Request|id, Options|dict, Procedure|uri]`` + """ + + MESSAGE_TYPE = 64 + """ + The WAMP message code for this type of message. + """ + + MATCH_EXACT = u'exact' + MATCH_PREFIX = u'prefix' + MATCH_WILDCARD = u'wildcard' + + INVOKE_SINGLE = u'single' + INVOKE_FIRST = u'first' + INVOKE_LAST = u'last' + INVOKE_ROUNDROBIN = u'roundrobin' + INVOKE_RANDOM = u'random' + INVOKE_ALL = u'all' + + __slots__ = ( + 'request', + 'procedure', + 'match', + 'invoke', + 'concurrency', + 'force_reregister', + 'forward_for', + ) + + def __init__(self, + request, + procedure, + match=None, + invoke=None, + concurrency=None, + force_reregister=None, + forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param procedure: The WAMP or application URI of the RPC endpoint provided. + :type procedure: str + + :param match: The procedure matching policy to be used for the registration. + :type match: str + + :param invoke: The procedure invocation policy to be used for the registration. + :type invoke: str + + :param concurrency: The (maximum) concurrency to be used for the registration. + :type concurrency: int + + :param forward_for: When this Register is forwarded over a router-to-router link, + or via an intermediary router. + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(procedure) == six.text_type) + assert(match is None or type(match) == six.text_type) + assert(match is None or match in [Register.MATCH_EXACT, Register.MATCH_PREFIX, Register.MATCH_WILDCARD]) + assert(invoke is None or type(invoke) == six.text_type) + assert(invoke is None or invoke in [Register.INVOKE_SINGLE, Register.INVOKE_FIRST, Register.INVOKE_LAST, Register.INVOKE_ROUNDROBIN, Register.INVOKE_RANDOM]) + assert(concurrency is None or (type(concurrency) in six.integer_types and concurrency > 0)) + assert force_reregister in [None, True, False] + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.procedure = procedure + self.match = match or Register.MATCH_EXACT + self.invoke = invoke or Register.INVOKE_SINGLE + self.concurrency = concurrency + self.force_reregister = force_reregister + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Register.MESSAGE_TYPE) + + if len(wmsg) != 4: + raise ProtocolError("invalid message length {0} for REGISTER".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in REGISTER") + options = check_or_raise_extra(wmsg[2], u"'options' in REGISTER") + + match = Register.MATCH_EXACT + invoke = Register.INVOKE_SINGLE + concurrency = None + force_reregister = None + forward_for = None + + if u'match' in options: + + option_match = options[u'match'] + if type(option_match) != six.text_type: + raise ProtocolError("invalid type {0} for 'match' option in REGISTER".format(type(option_match))) + + if option_match not in [Register.MATCH_EXACT, Register.MATCH_PREFIX, Register.MATCH_WILDCARD]: + raise ProtocolError("invalid value {0} for 'match' option in REGISTER".format(option_match)) + + match = option_match + + if match == Register.MATCH_EXACT: + allow_empty_components = False + allow_last_empty = False + + elif match == Register.MATCH_PREFIX: + allow_empty_components = False + allow_last_empty = True + + elif match == Register.MATCH_WILDCARD: + allow_empty_components = True + allow_last_empty = False + + else: + raise Exception("logic error") + + procedure = check_or_raise_uri(wmsg[3], u"'procedure' in REGISTER", allow_empty_components=allow_empty_components, allow_last_empty=allow_last_empty) + + if u'invoke' in options: + + option_invoke = options[u'invoke'] + if type(option_invoke) != six.text_type: + raise ProtocolError("invalid type {0} for 'invoke' option in REGISTER".format(type(option_invoke))) + + if option_invoke not in [Register.INVOKE_SINGLE, Register.INVOKE_FIRST, Register.INVOKE_LAST, Register.INVOKE_ROUNDROBIN, Register.INVOKE_RANDOM]: + raise ProtocolError("invalid value {0} for 'invoke' option in REGISTER".format(option_invoke)) + + invoke = option_invoke + + if u'concurrency' in options: + + options_concurrency = options[u'concurrency'] + if type(options_concurrency) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'concurrency' option in REGISTER".format(type(options_concurrency))) + + if options_concurrency < 1: + raise ProtocolError("invalid value {0} for 'concurrency' option in REGISTER".format(options_concurrency)) + + concurrency = options_concurrency + + options_reregister = options.get(u'force_reregister', None) + if options_reregister not in [True, False, None]: + raise ProtocolError( + "invalid type {0} for 'force_reregister option in REGISTER".format( + type(options_reregister) + ) + ) + if options_reregister is not None: + force_reregister = options_reregister + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in REGISTER") + + obj = Register(request, procedure, match=match, invoke=invoke, concurrency=concurrency, + force_reregister=force_reregister, forward_for=forward_for) + + return obj + + def marshal_options(self): + options = {} + + if self.match and self.match != Register.MATCH_EXACT: + options[u'match'] = self.match + + if self.invoke and self.invoke != Register.INVOKE_SINGLE: + options[u'invoke'] = self.invoke + + if self.concurrency: + options[u'concurrency'] = self.concurrency + + if self.force_reregister is not None: + options[u'force_reregister'] = self.force_reregister + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Register.MESSAGE_TYPE, self.request, self.marshal_options(), self.procedure] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Register(request={0}, procedure={1}, match={2}, invoke={3}, concurrency={4}, force_reregister={5}, forward_for={6})".format(self.request, self.procedure, self.match, self.invoke, self.concurrency, self.force_reregister, self.forward_for) + + +class Registered(Message): + """ + A WAMP ``REGISTERED`` message. + + Format: ``[REGISTERED, REGISTER.Request|id, Registration|id]`` + """ + + MESSAGE_TYPE = 65 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'registration', + ) + + def __init__(self, request, registration): + """ + + :param request: The request ID of the original ``REGISTER`` request. + :type request: int + + :param registration: The registration ID for the registered procedure (or procedure pattern). + :type registration: int + """ + assert(type(request) in six.integer_types) + assert(type(registration) in six.integer_types) + + Message.__init__(self) + self.request = request + self.registration = registration + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Registered.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for REGISTERED".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in REGISTERED") + registration = check_or_raise_id(wmsg[2], u"'registration' in REGISTERED") + + obj = Registered(request, registration) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + return [Registered.MESSAGE_TYPE, self.request, self.registration] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Registered(request={0}, registration={1})".format(self.request, self.registration) + + +class Unregister(Message): + """ + A WAMP `UNREGISTER` message. + + Formats: + + * ``[UNREGISTER, Request|id, REGISTERED.Registration|id]`` + * ``[UNREGISTER, Request|id, REGISTERED.Registration|id, Options|dict]`` + """ + + MESSAGE_TYPE = 66 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'registration', + 'forward_for', + ) + + def __init__(self, request, registration, forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param registration: The registration ID for the registration to unregister. + :type registration: int + + :param forward_for: When this Unregister is forwarded over a router-to-router link, + or via an intermediary router. + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(registration) in six.integer_types) + + Message.__init__(self) + self.request = request + self.registration = registration + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Unregister.MESSAGE_TYPE) + + if len(wmsg) not in [3, 4]: + raise ProtocolError("invalid message length {0} for WAMP UNREGISTER".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in UNREGISTER") + registration = check_or_raise_id(wmsg[2], u"'registration' in UNREGISTER") + + options = None + if len(wmsg) > 3: + options = check_or_raise_extra(wmsg[3], u"'options' in UNREGISTER") + + forward_for = None + if options and u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in UNREGISTER") + + obj = Unregister(request, registration, forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + if self.forward_for: + options = { + u'forward_for': self.forward_for, + } + return [Unregister.MESSAGE_TYPE, self.request, self.registration, options] + else: + return [Unregister.MESSAGE_TYPE, self.request, self.registration] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Unregister(request={0}, registration={1})".format(self.request, self.registration) + + +class Unregistered(Message): + """ + A WAMP ``UNREGISTERED`` message. + + Formats: + + * ``[UNREGISTERED, UNREGISTER.Request|id]`` + * ``[UNREGISTERED, UNREGISTER.Request|id, Details|dict]`` + """ + + MESSAGE_TYPE = 67 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'registration', + 'reason', + ) + + def __init__(self, request, registration=None, reason=None): + """ + + :param request: The request ID of the original ``UNREGISTER`` request. + :type request: int + + :param registration: If unregister was actively triggered by router, the ID + of the registration revoked. + :type registration: int or None + + :param reason: The reason (an URI) for revocation. + :type reason: str or None. + """ + assert(type(request) in six.integer_types) + assert(registration is None or type(registration) in six.integer_types) + assert(reason is None or type(reason) == six.text_type) + assert((request != 0 and registration is None) or (request == 0 and registration != 0)) + + Message.__init__(self) + self.request = request + self.registration = registration + self.reason = reason + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Unregistered.MESSAGE_TYPE) + + if len(wmsg) not in [2, 3]: + raise ProtocolError("invalid message length {0} for UNREGISTERED".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in UNREGISTERED") + + registration = None + reason = None + + if len(wmsg) > 2: + + details = check_or_raise_extra(wmsg[2], u"'details' in UNREGISTERED") + + if u"registration" in details: + details_registration = details[u"registration"] + if type(details_registration) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'registration' detail in UNREGISTERED".format(type(details_registration))) + registration = details_registration + + if u"reason" in details: + reason = check_or_raise_uri(details[u"reason"], u"'reason' in UNREGISTERED") + + obj = Unregistered(request, registration, reason) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + if self.reason is not None or self.registration is not None: + details = {} + if self.reason is not None: + details[u"reason"] = self.reason + if self.registration is not None: + details[u"registration"] = self.registration + return [Unregistered.MESSAGE_TYPE, self.request, details] + else: + return [Unregistered.MESSAGE_TYPE, self.request] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Unregistered(request={0}, reason={1}, registration={2})".format(self.request, self.reason, self.registration) + + +class Invocation(Message): + """ + A WAMP ``INVOCATION`` message. + + Formats: + + * ``[INVOCATION, Request|id, REGISTERED.Registration|id, Details|dict]`` + * ``[INVOCATION, Request|id, REGISTERED.Registration|id, Details|dict, CALL.Arguments|list]`` + * ``[INVOCATION, Request|id, REGISTERED.Registration|id, Details|dict, CALL.Arguments|list, CALL.ArgumentsKw|dict]`` + * ``[INVOCATION, Request|id, REGISTERED.Registration|id, Details|dict, Payload|binary]`` + """ + + MESSAGE_TYPE = 68 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'registration', + 'args', + 'kwargs', + 'payload', + 'timeout', + 'receive_progress', + 'caller', + 'caller_authid', + 'caller_authrole', + 'procedure', + 'enc_algo', + 'enc_key', + 'enc_serializer', + 'forward_for', + ) + + def __init__(self, + request, + registration, + args=None, + kwargs=None, + payload=None, + timeout=None, + receive_progress=None, + caller=None, + caller_authid=None, + caller_authrole=None, + procedure=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + forward_for=None): + """ + + :param request: The WAMP request ID of this request. + :type request: int + + :param registration: The registration ID of the endpoint to be invoked. + :type registration: int + + :param args: Positional values for application-defined event payload. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined event payload. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param timeout: If present, let the callee automatically cancels + the invocation after this ms. + :type timeout: int or None + + :param receive_progress: Indicates if the callee should produce progressive results. + :type receive_progress: bool or None + + :param caller: The WAMP session ID of the caller. Only filled if caller is disclosed. + :type caller: None or int + + :param caller_authid: The WAMP authid of the caller. Only filled if caller is disclosed. + :type caller_authid: None or unicode + + :param caller_authrole: The WAMP authrole of the caller. Only filled if caller is disclosed. + :type caller_authrole: None or unicode + + :param procedure: For pattern-based registrations, the invocation MUST include the actual procedure being called. + :type procedure: str or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(type(registration) in six.integer_types) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(timeout is None or type(timeout) in six.integer_types) + assert(receive_progress is None or type(receive_progress) == bool) + assert(caller is None or type(caller) in six.integer_types) + assert(caller_authid is None or type(caller_authid) == six.text_type) + assert(caller_authrole is None or type(caller_authrole) == six.text_type) + assert(procedure is None or type(procedure) == six.text_type) + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.registration = registration + self.args = args + self.kwargs = _validate_kwargs(kwargs) + self.payload = payload + self.timeout = timeout + self.receive_progress = receive_progress + self.caller = caller + self.caller_authid = caller_authid + self.caller_authrole = caller_authrole + self.procedure = procedure + self.enc_algo = enc_algo + self.enc_key = enc_key + self.enc_serializer = enc_serializer + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Invocation.MESSAGE_TYPE) + + if len(wmsg) not in (4, 5, 6): + raise ProtocolError("invalid message length {0} for INVOCATION".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in INVOCATION") + registration = check_or_raise_id(wmsg[2], u"'registration' in INVOCATION") + details = check_or_raise_extra(wmsg[3], u"'details' in INVOCATION") + + args = None + kwargs = None + payload = None + enc_algo = None + enc_key = None + enc_serializer = None + + if len(wmsg) == 5 and type(wmsg[4]) == six.binary_type: + + payload = wmsg[4] + + enc_algo = details.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in INVOCATION".format(enc_algo)) + + enc_key = details.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in INVOCATION".format(type(enc_key))) + + enc_serializer = details.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in INVOCATION".format(enc_serializer)) + + else: + if len(wmsg) > 4: + args = wmsg[4] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in INVOCATION".format(type(args))) + + if len(wmsg) > 5: + kwargs = wmsg[5] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in INVOCATION".format(type(kwargs))) + + timeout = None + receive_progress = None + caller = None + caller_authid = None + caller_authrole = None + procedure = None + forward_for = None + + if u'timeout' in details: + + detail_timeout = details[u'timeout'] + if type(detail_timeout) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'timeout' detail in INVOCATION".format(type(detail_timeout))) + + if detail_timeout < 0: + raise ProtocolError("invalid value {0} for 'timeout' detail in INVOCATION".format(detail_timeout)) + + timeout = detail_timeout + + if u'receive_progress' in details: + + detail_receive_progress = details[u'receive_progress'] + if type(detail_receive_progress) != bool: + raise ProtocolError("invalid type {0} for 'receive_progress' detail in INVOCATION".format(type(detail_receive_progress))) + + receive_progress = detail_receive_progress + + if u'caller' in details: + + detail_caller = details[u'caller'] + if type(detail_caller) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'caller' detail in INVOCATION".format(type(detail_caller))) + + caller = detail_caller + + if u'caller_authid' in details: + + detail_caller_authid = details[u'caller_authid'] + if type(detail_caller_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'caller_authid' detail in INVOCATION".format(type(detail_caller_authid))) + + caller_authid = detail_caller_authid + + if u'caller_authrole' in details: + + detail_caller_authrole = details[u'caller_authrole'] + if type(detail_caller_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'caller_authrole' detail in INVOCATION".format(type(detail_caller_authrole))) + + caller_authrole = detail_caller_authrole + + if u'procedure' in details: + + detail_procedure = details[u'procedure'] + if type(detail_procedure) != six.text_type: + raise ProtocolError("invalid type {0} for 'procedure' detail in INVOCATION".format(type(detail_procedure))) + + procedure = detail_procedure + + if u'forward_for' in details: + forward_for = details[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in INVOCATION") + + obj = Invocation(request, + registration, + args=args, + kwargs=kwargs, + payload=payload, + timeout=timeout, + receive_progress=receive_progress, + caller=caller, + caller_authid=caller_authid, + caller_authrole=caller_authrole, + procedure=procedure, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = {} + + if self.timeout is not None: + options[u'timeout'] = self.timeout + + if self.receive_progress is not None: + options[u'receive_progress'] = self.receive_progress + + if self.caller is not None: + options[u'caller'] = self.caller + + if self.caller_authid is not None: + options[u'caller_authid'] = self.caller_authid + + if self.caller_authrole is not None: + options[u'caller_authrole'] = self.caller_authrole + + if self.procedure is not None: + options[u'procedure'] = self.procedure + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + if self.payload: + if self.enc_algo is not None: + options[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + options[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + options[u'enc_serializer'] = self.enc_serializer + return [Invocation.MESSAGE_TYPE, self.request, self.registration, options, self.payload] + else: + if self.kwargs: + return [Invocation.MESSAGE_TYPE, self.request, self.registration, options, self.args, self.kwargs] + elif self.args: + return [Invocation.MESSAGE_TYPE, self.request, self.registration, options, self.args] + else: + return [Invocation.MESSAGE_TYPE, self.request, self.registration, options] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Invocation(request={0}, registration={1}, args={2}, kwargs={3}, timeout={4}, receive_progress={5}, caller={6}, caller_authid={7}, caller_authrole={8}, procedure={9}, enc_algo={10}, enc_key={11}, enc_serializer={12}, payload={13})".format(self.request, self.registration, self.args, self.kwargs, self.timeout, self.receive_progress, self.caller, self.caller_authid, self.caller_authrole, self.procedure, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload)) + + +class Interrupt(Message): + """ + A WAMP ``INTERRUPT`` message. + + Format: ``[INTERRUPT, INVOCATION.Request|id, Options|dict]`` + + See: https://wamp-proto.org/static/rfc/draft-oberstet-hybi-crossbar-wamp.html#rfc.section.14.3.4 + """ + + MESSAGE_TYPE = 69 + """ + The WAMP message code for this type of message. + """ + + KILL = u'kill' + KILLNOWAIT = u'killnowait' + + __slots__ = ( + 'request', + 'mode', + 'reason', + 'forward_for', + ) + + def __init__(self, request, mode=None, reason=None, forward_for=None): + """ + + :param request: The WAMP request ID of the original ``INVOCATION`` to interrupt. + :type request: int + + :param mode: Specifies how to interrupt the invocation (``"killnowait"`` or ``"kill"``). + With ``"kill"``, the router will wait for the callee to return an ERROR before + proceeding (sending back an ERROR to the original caller). With ``"killnowait"`` the + router will immediately proceed (on the caller side returning an ERROR) - but still + expects the callee to send an ERROR to conclude the message exchange for the inflight + call. + :type mode: str or None + + :param reason: The reason (an URI) for the invocation interrupt, eg actively + triggered by the caller (``"wamp.error.canceled"`` - ApplicationError.CANCELED) or + passively because of timeout (``"wamp.error.timeout"`` - ApplicationError.TIMEOUT). + :type reason: str or None. + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(mode is None or type(mode) == six.text_type) + assert(mode is None or mode in [self.KILL, self.KILLNOWAIT]) + assert(reason is None or type(reason) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.mode = mode + self.reason = reason + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Interrupt.MESSAGE_TYPE) + + if len(wmsg) != 3: + raise ProtocolError("invalid message length {0} for INTERRUPT".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in INTERRUPT") + options = check_or_raise_extra(wmsg[2], u"'options' in INTERRUPT") + + # options + # + mode = None + reason = None + forward_for = None + + if u'mode' in options: + + option_mode = options[u'mode'] + if type(option_mode) != six.text_type: + raise ProtocolError("invalid type {0} for 'mode' option in INTERRUPT".format(type(option_mode))) + + if option_mode not in [Interrupt.KILL, Interrupt.KILLNOWAIT]: + raise ProtocolError("invalid value '{0}' for 'mode' option in INTERRUPT".format(option_mode)) + + mode = option_mode + + if u'reason' in options: + reason = check_or_raise_uri(options[u'reason'], u'"reason" in INTERRUPT') + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in INTERRUPT") + + obj = Interrupt(request, mode=mode, reason=reason, forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = {} + + if self.mode is not None: + options[u'mode'] = self.mode + + if self.reason is not None: + options[u'reason'] = self.reason + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return [Interrupt.MESSAGE_TYPE, self.request, options] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Interrupt(request={0}, mode={1}, reason={2})".format(self.request, self.mode, self.reason) + + +class Yield(Message): + """ + A WAMP ``YIELD`` message. + + Formats: + + * ``[YIELD, INVOCATION.Request|id, Options|dict]`` + * ``[YIELD, INVOCATION.Request|id, Options|dict, Arguments|list]`` + * ``[YIELD, INVOCATION.Request|id, Options|dict, Arguments|list, ArgumentsKw|dict]`` + * ``[YIELD, INVOCATION.Request|id, Options|dict, Payload|binary]`` + """ + + MESSAGE_TYPE = 70 + """ + The WAMP message code for this type of message. + """ + + __slots__ = ( + 'request', + 'args', + 'kwargs', + 'payload', + 'progress', + 'enc_algo', + 'enc_key', + 'enc_serializer', + 'callee', + 'callee_authid', + 'callee_authrole', + 'forward_for', + ) + + def __init__(self, + request, + args=None, + kwargs=None, + payload=None, + progress=None, + enc_algo=None, + enc_key=None, + enc_serializer=None, + callee=None, + callee_authid=None, + callee_authrole=None, + forward_for=None): + """ + + :param request: The WAMP request ID of the original call. + :type request: int + + :param args: Positional values for application-defined event payload. + Must be serializable using any serializers in use. + :type args: list or tuple or None + + :param kwargs: Keyword values for application-defined event payload. + Must be serializable using any serializers in use. + :type kwargs: dict or None + + :param payload: Alternative, transparent payload. If given, ``args`` and ``kwargs`` must be left unset. + :type payload: bytes or None + + :param progress: If ``True``, this result is a progressive invocation result, and subsequent + results (or a final error) will follow. + :type progress: bool or None + + :param enc_algo: If using payload transparency, the encoding algorithm that was used to encode the payload. + :type enc_algo: str or None + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + + :param enc_serializer: If using payload transparency, the payload object serializer that was used encoding the payload. + :type enc_serializer: str or None + + :param callee: The WAMP session ID of the effective callee that responded with the error. Only filled if callee is disclosed. + :type callee: None or int + + :param callee_authid: The WAMP authid of the responding callee. Only filled if callee is disclosed. + :type callee_authid: None or unicode + + :param callee_authrole: The WAMP authrole of the responding callee. Only filled if callee is disclosed. + :type callee_authrole: None or unicode + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(type(request) in six.integer_types) + assert(args is None or type(args) in [list, tuple]) + assert(kwargs is None or type(kwargs) == dict) + assert(payload is None or type(payload) == six.binary_type) + assert(payload is None or (payload is not None and args is None and kwargs is None)) + assert(progress is None or type(progress) == bool) + assert(enc_algo is None or is_valid_enc_algo(enc_algo)) + assert((enc_algo is None and enc_key is None and enc_serializer is None) or (payload is not None and enc_algo is not None)) + assert(enc_key is None or type(enc_key) == six.text_type) + assert(enc_serializer is None or is_valid_enc_serializer(enc_serializer)) + + assert(callee is None or type(callee) in six.integer_types) + assert(callee_authid is None or type(callee_authid) == six.text_type) + assert(callee_authrole is None or type(callee_authrole) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + Message.__init__(self) + self.request = request + self.args = args + self.kwargs = _validate_kwargs(kwargs) + self.payload = payload + self.progress = progress + self.enc_algo = enc_algo + self.enc_key = enc_key + self.enc_serializer = enc_serializer + + # effective callee that responded with the result + self.callee = callee + self.callee_authid = callee_authid + self.callee_authrole = callee_authrole + + # message forwarding + self.forward_for = forward_for + + @staticmethod + def parse(wmsg): + """ + Verifies and parses an unserialized raw message into an actual WAMP message instance. + + :param wmsg: The unserialized raw message. + :type wmsg: list + + :returns: An instance of this class. + """ + # this should already be verified by WampSerializer.unserialize + assert(len(wmsg) > 0 and wmsg[0] == Yield.MESSAGE_TYPE) + + if len(wmsg) not in (3, 4, 5): + raise ProtocolError("invalid message length {0} for YIELD".format(len(wmsg))) + + request = check_or_raise_id(wmsg[1], u"'request' in YIELD") + options = check_or_raise_extra(wmsg[2], u"'options' in YIELD") + + args = None + kwargs = None + payload = None + enc_algo = None + enc_key = None + enc_serializer = None + + if len(wmsg) == 4 and type(wmsg[3]) == six.binary_type: + + payload = wmsg[3] + + enc_algo = options.get(u'enc_algo', None) + if enc_algo and not is_valid_enc_algo(enc_algo): + raise ProtocolError("invalid value {0} for 'enc_algo' detail in YIELD".format(enc_algo)) + + enc_key = options.get(u'enc_key', None) + if enc_key and type(enc_key) != six.text_type: + raise ProtocolError("invalid type {0} for 'enc_key' detail in YIELD".format(type(enc_key))) + + enc_serializer = options.get(u'enc_serializer', None) + if enc_serializer and not is_valid_enc_serializer(enc_serializer): + raise ProtocolError("invalid value {0} for 'enc_serializer' detail in YIELD".format(enc_serializer)) + + else: + if len(wmsg) > 3: + args = wmsg[3] + if args is not None and type(args) != list: + raise ProtocolError("invalid type {0} for 'args' in YIELD".format(type(args))) + + if len(wmsg) > 4: + kwargs = wmsg[4] + if type(kwargs) != dict: + raise ProtocolError("invalid type {0} for 'kwargs' in YIELD".format(type(kwargs))) + + progress = None + callee = None + callee_authid = None + callee_authrole = None + forward_for = None + + if u'progress' in options: + + option_progress = options[u'progress'] + if type(option_progress) != bool: + raise ProtocolError("invalid type {0} for 'progress' option in YIELD".format(type(option_progress))) + + progress = option_progress + + if u'callee' in options: + + option_callee = options[u'callee'] + if type(option_callee) not in six.integer_types: + raise ProtocolError("invalid type {0} for 'callee' detail in YIELD".format(type(option_callee))) + + callee = option_callee + + if u'callee_authid' in options: + + option_callee_authid = options[u'callee_authid'] + if type(option_callee_authid) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authid' detail in YIELD".format(type(option_callee_authid))) + + callee_authid = option_callee_authid + + if u'callee_authrole' in options: + + option_callee_authrole = options[u'callee_authrole'] + if type(option_callee_authrole) != six.text_type: + raise ProtocolError("invalid type {0} for 'callee_authrole' detail in YIELD".format(type(option_callee_authrole))) + + callee_authrole = option_callee_authrole + + if u'forward_for' in options: + forward_for = options[u'forward_for'] + valid = False + if type(forward_for) == list: + for ff in forward_for: + if type(ff) != dict: + break + if 'session' not in ff or type(ff['session']) not in six.integer_types: + break + if 'authid' not in ff or type(ff['authid']) != six.text_type: + break + if 'authrole' not in ff or type(ff['authrole']) != six.text_type: + break + valid = True + + if not valid: + raise ProtocolError("invalid type/value {0} for/within 'forward_for' option in YIELD") + + obj = Yield(request, + args=args, + kwargs=kwargs, + payload=payload, + progress=progress, + enc_algo=enc_algo, + enc_key=enc_key, + enc_serializer=enc_serializer, + callee=callee, + callee_authid=callee_authid, + callee_authrole=callee_authrole, + forward_for=forward_for) + + return obj + + def marshal(self): + """ + Marshal this object into a raw message for subsequent serialization to bytes. + + :returns: The serialized raw message. + :rtype: list + """ + options = {} + + if self.progress is not None: + options[u'progress'] = self.progress + + if self.callee is not None: + options[u'callee'] = self.callee + if self.callee_authid is not None: + options[u'callee_authid'] = self.callee_authid + if self.callee_authrole is not None: + options[u'callee_authrole'] = self.callee_authrole + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + if self.payload: + if self.enc_algo is not None: + options[u'enc_algo'] = self.enc_algo + if self.enc_key is not None: + options[u'enc_key'] = self.enc_key + if self.enc_serializer is not None: + options[u'enc_serializer'] = self.enc_serializer + return [Yield.MESSAGE_TYPE, self.request, options, self.payload] + else: + if self.kwargs: + return [Yield.MESSAGE_TYPE, self.request, options, self.args, self.kwargs] + elif self.args: + return [Yield.MESSAGE_TYPE, self.request, options, self.args] + else: + return [Yield.MESSAGE_TYPE, self.request, options] + + def __str__(self): + """ + Returns string representation of this message. + """ + return u"Yield(request={0}, args={1}, kwargs={2}, progress={3}, enc_algo={4}, enc_key={5}, enc_serializer={6}, payload={7}, callee={8}, callee_authid={9}, callee_authrole={10}, forward_for={11})".format(self.request, self.args, self.kwargs, self.progress, self.enc_algo, self.enc_key, self.enc_serializer, b2a(self.payload), self.callee, self.callee_authid, self.callee_authrole, self.forward_for) diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/protocol.py b/venv/lib/python3.7/site-packages/autobahn/wamp/protocol.py new file mode 100644 index 0000000..fb326df --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/protocol.py @@ -0,0 +1,1958 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import six +import txaio +import inspect +from functools import reduce + +from autobahn import wamp +from autobahn.util import public, IdGenerator, ObservableMixin +from autobahn.wamp import uri +from autobahn.wamp import message +from autobahn.wamp import types +from autobahn.wamp import role +from autobahn.wamp import exception +from autobahn.wamp.exception import ApplicationError, ProtocolError, SessionNotReady, SerializationError +from autobahn.wamp.interfaces import ISession, IPayloadCodec, IAuthenticator # noqa +from autobahn.wamp.types import SessionDetails, CloseDetails, EncodedPayload +from autobahn.exception import PayloadExceededError +from autobahn.wamp.request import \ + Publication, \ + Subscription, \ + Handler, \ + Registration, \ + Endpoint, \ + PublishRequest, \ + SubscribeRequest, \ + UnsubscribeRequest, \ + CallRequest, \ + InvocationRequest, \ + RegisterRequest, \ + UnregisterRequest + + +def is_method_or_function(f): + return inspect.ismethod(f) or inspect.isfunction(f) + + +class BaseSession(ObservableMixin): + """ + WAMP session base class. + + This class implements :class:`autobahn.wamp.interfaces.ISession`. + """ + + log = txaio.make_logger() + + def __init__(self): + """ + + """ + self.set_valid_events( + valid_events=[ + 'join', # right before onJoin runs + 'leave', # after onLeave has run + 'ready', # after onJoin and all 'join' listeners have completed + 'connect', # right before onConnect + 'disconnect', # right after onDisconnect + ] + ) + + # this is for marshalling traceback from exceptions thrown in user + # code within WAMP error messages (that is, when invoking remoted + # procedures) + self.traceback_app = False + + # mapping of exception classes to WAMP error URIs + self._ecls_to_uri_pat = {} + + # mapping of WAMP error URIs to exception classes + self._uri_to_ecls = { + ApplicationError.INVALID_PAYLOAD: SerializationError, + ApplicationError.PAYLOAD_SIZE_EXCEEDED: PayloadExceededError, + } + + # session authentication information + self._realm = None + self._session_id = None + self._authid = None + self._authrole = None + self._authmethod = None + self._authprovider = None + + # payload transparency codec + self._payload_codec = None + + # generator for WAMP request IDs + self._request_id_gen = IdGenerator() + + @property + def realm(self): + return self._realm + + @property + def session_id(self): + return self._session_id + + @property + def authid(self): + return self._authid + + @property + def authrole(self): + return self._authrole + + @property + def authmethod(self): + return self._authmethod + + @property + def authprovider(self): + return self._authprovider + + def define(self, exception, error=None): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.define` + """ + if error is None: + assert(hasattr(exception, '_wampuris')) + self._ecls_to_uri_pat[exception] = exception._wampuris + self._uri_to_ecls[exception._wampuris[0].uri()] = exception + else: + assert(not hasattr(exception, '_wampuris')) + self._ecls_to_uri_pat[exception] = [uri.Pattern(six.u(error), uri.Pattern.URI_TARGET_HANDLER)] + self._uri_to_ecls[six.u(error)] = exception + + def _message_from_exception(self, request_type, request, exc, tb=None, enc_algo=None): + """ + Create a WAMP error message from an exception. + + :param request_type: The request type this WAMP error message is for. + :type request_type: int + + :param request: The request ID this WAMP error message is for. + :type request: int + + :param exc: The exception. + :type exc: Instance of :class:`Exception` or subclass thereof. + + :param tb: Optional traceback. If present, it'll be included with the WAMP error message. + :type tb: list or None + """ + args = None + if hasattr(exc, 'args'): + args = list(exc.args) # make sure tuples are made into lists + + kwargs = None + if hasattr(exc, 'kwargs'): + kwargs = exc.kwargs + + if kwargs and six.PY2: + kwargs = { + k.decode('utf8'): v + for k, v in kwargs.iteritems() + } + + if tb: + if kwargs: + kwargs[u'traceback'] = tb + else: + kwargs = {u'traceback': tb} + + if isinstance(exc, exception.ApplicationError): + error = exc.error if type(exc.error) == six.text_type else six.u(exc.error) + else: + if exc.__class__ in self._ecls_to_uri_pat: + error = self._ecls_to_uri_pat[exc.__class__][0]._uri + else: + error = u"wamp.error.runtime_error" + + encoded_payload = None + if self._payload_codec: + encoded_payload = self._payload_codec.encode(False, error, args, kwargs) + + if encoded_payload: + msg = message.Error(request_type, + request, + error, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer) + else: + msg = message.Error(request_type, + request, + error, + args, + kwargs) + + return msg + + def _exception_from_message(self, msg): + """ + Create a user (or generic) exception from a WAMP error message. + + :param msg: A WAMP error message. + :type msg: instance of :class:`autobahn.wamp.message.Error` + """ + + # FIXME: + # 1. map to ecls based on error URI wildcard/prefix + # 2. extract additional args/kwargs from error URI + + exc = None + enc_err = None + + if msg.enc_algo: + + if not self._payload_codec: + log_msg = u"received encoded payload, but no payload codec active" + self.log.warn(log_msg) + enc_err = ApplicationError(ApplicationError.ENC_NO_PAYLOAD_CODEC, log_msg, enc_algo=msg.enc_algo) + else: + try: + encoded_payload = EncodedPayload(msg.payload, msg.enc_algo, msg.enc_serializer, msg.enc_key) + decrypted_error, msg.args, msg.kwargs = self._payload_codec.decode(True, msg.error, encoded_payload) + except Exception as e: + self.log.warn("failed to decrypt application payload 1: {err}", err=e) + enc_err = ApplicationError( + ApplicationError.ENC_DECRYPT_ERROR, + u"failed to decrypt application payload 1: {}".format(e), + enc_algo=msg.enc_algo, + ) + else: + if msg.error != decrypted_error: + self.log.warn( + u"URI within encrypted payload ('{decrypted_error}') does not match the envelope ('{error}')", + decrypted_error=decrypted_error, + error=msg.error, + ) + enc_err = ApplicationError( + ApplicationError.ENC_TRUSTED_URI_MISMATCH, + u"URI within encrypted payload ('{}') does not match the envelope ('{}')".format(decrypted_error, msg.error), + enc_algo=msg.enc_algo, + ) + + if enc_err: + return enc_err + + if msg.error in self._uri_to_ecls: + ecls = self._uri_to_ecls[msg.error] + try: + # the following might fail, eg. TypeError when + # signature of exception constructor is incompatible + # with args/kwargs or when the exception constructor raises + if msg.kwargs: + if msg.args: + exc = ecls(*msg.args, **msg.kwargs) + else: + exc = ecls(**msg.kwargs) + else: + if msg.args: + exc = ecls(*msg.args) + else: + exc = ecls() + except Exception: + try: + self.onUserError( + txaio.create_failure(), + "While re-constructing exception", + ) + except: + pass + + if not exc: + # the following ctor never fails .. + if msg.kwargs: + if msg.args: + exc = exception.ApplicationError(msg.error, *msg.args, **msg.kwargs) + else: + exc = exception.ApplicationError(msg.error, **msg.kwargs) + else: + if msg.args: + exc = exception.ApplicationError(msg.error, *msg.args) + else: + exc = exception.ApplicationError(msg.error) + + # FIXME: cleanup and integate into ctors above + if hasattr(exc, 'enc_algo'): + exc.enc_algo = msg.enc_algo + if hasattr(exc, 'callee'): + exc.callee = msg.callee + if hasattr(exc, 'callee_authid'): + exc.callee_authid = msg.callee_authid + if hasattr(exc, 'callee_authrole'): + exc.callee_authrole = msg.callee_authrole + if hasattr(exc, 'forward_for'): + exc.forward_for = msg.forward_for + + return exc + + +@public +class ApplicationSession(BaseSession): + """ + WAMP endpoint session. + """ + + def __init__(self, config=None): + """ + Implements :func:`autobahn.wamp.interfaces.ISession` + """ + BaseSession.__init__(self) + self.config = config or types.ComponentConfig(realm=u"realm1") + + # set client role features supported and announced + self._session_roles = role.DEFAULT_CLIENT_ROLES + + self._transport = None + self._session_id = None + self._realm = None + + self._goodbye_sent = False + self._transport_is_closing = False + + # outstanding requests + self._publish_reqs = {} + self._subscribe_reqs = {} + self._unsubscribe_reqs = {} + self._call_reqs = {} + self._register_reqs = {} + self._unregister_reqs = {} + + # subscriptions in place + self._subscriptions = {} + + # registrations in place + self._registrations = {} + + # incoming invocations + self._invocations = {} + + @public + def set_payload_codec(self, payload_codec): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.set_payload_codec` + """ + assert(payload_codec is None or isinstance(payload_codec, IPayloadCodec)) + self._payload_codec = payload_codec + + @public + def get_payload_codec(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.get_payload_codec` + """ + return self._payload_codec + + @public + def onOpen(self, transport): + """ + Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onOpen` + """ + self._transport = transport + d = self.fire('connect', self, transport) + txaio.add_callbacks( + d, None, + lambda fail: self._swallow_error(fail, "While notifying 'connect'") + ) + txaio.add_callbacks( + d, + lambda _: txaio.as_future(self.onConnect), + lambda fail: self._swallow_error(fail, "While calling 'onConnect'") + ) + + @public + def onConnect(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onConnect` + """ + self.join(self.config.realm) + + @public + def join(self, + realm, + authmethods=None, + authid=None, + authrole=None, + authextra=None, + resumable=None, + resume_session=None, + resume_token=None): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.join` + """ + assert(realm is None or type(realm) == six.text_type) + assert(authmethods is None or type(authmethods) == list) + if type(authmethods) == list: + for authmethod in authmethods: + assert(type(authmethod) == six.text_type) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authextra is None or type(authextra) == dict) + + if self._session_id: + raise Exception("already joined") + + # store the realm requested by client, though this might be overwritten later, + # when realm redirection kicks in + self._realm = realm + + # closing handshake state + self._goodbye_sent = False + + # send HELLO message to router + msg = message.Hello(realm=realm, + roles=self._session_roles, + authmethods=authmethods, + authid=authid, + authrole=authrole, + authextra=authextra, + resumable=resumable, + resume_session=resume_session, + resume_token=resume_token) + self._transport.send(msg) + + @public + def disconnect(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.disconnect` + """ + if self._transport: + self._transport.close() + + @public + def is_connected(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.is_connected` + """ + return self._transport is not None + + @public + def is_attached(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.is_attached` + """ + return self._transport is not None and self._session_id is not None + + @public + def onUserError(self, fail, msg): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onUserError` + """ + if isinstance(fail.value, exception.ApplicationError): + self.log.warn('{klass}.onUserError(): "{msg}"', + klass=self.__class__.__name__, + msg=fail.value.error_message()) + else: + self.log.error( + '{klass}.onUserError(): "{msg}"\n{traceback}', + klass=self.__class__.__name__, + msg=msg, + traceback=txaio.failure_format_traceback(fail), + ) + + def _swallow_error(self, fail, msg): + ''' + This is an internal generic error-handler for errors encountered + when calling down to on*() handlers that can reasonably be + expected to be overridden in user code. + + Note that it *cancels* the error, so use with care! + + Specifically, this should *never* be added to the errback + chain for a Deferred/coroutine that will make it out to user + code. + ''' + try: + self.onUserError(fail, msg) + except Exception: + self.log.error( + "Internal error: {tb}", + tb=txaio.failure_format_traceback(txaio.create_failure()), + ) + return None + + def onMessage(self, msg): + """ + Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onMessage` + """ + + if self._session_id is None: + + # the first message must be WELCOME, ABORT or CHALLENGE .. + if isinstance(msg, message.Welcome): + + # before we let user code see the session -- that is, + # before we fire "join" -- we give authentication + # instances a chance to abort the session. Usually + # this would be for "mutual authentication" + # scenarios. For example, WAMP-SCRAM uses this to + # confirm the server-signature + d = txaio.as_future(self.onWelcome, msg) + + def success(res): + if res is not None: + self.log.info("Session denied by onWelcome") + reply = message.Abort( + u"wamp.error.cannot_authenticate", u"{0}".format(res) + ) + self._transport.send(reply) + return + + if msg.realm: + self._realm = msg.realm + self._session_id = msg.session + self._authid = msg.authid + self._authrole = msg.authrole + self._authmethod = msg.authmethod + self._authprovider = msg.authprovider + self._router_roles = msg.roles + + details = SessionDetails( + realm=self._realm, + session=self._session_id, + authid=self._authid, + authrole=self._authrole, + authmethod=self._authmethod, + authprovider=self._authprovider, + authextra=msg.authextra, + serializer=self._transport._serializer.SERIALIZER_ID, + resumed=msg.resumed, + resumable=msg.resumable, + resume_token=msg.resume_token, + ) + # firing 'join' *before* running onJoin, so that + # the idiom where you "do stuff" in onJoin -- + # possibly including self.leave() -- works + # properly. Besides, there's "ready" that fires + # after 'join' and onJoin have all completed... + d = self.fire('join', self, details) + # add a logging errback first, which will ignore any + # errors from fire() + txaio.add_callbacks( + d, None, + lambda e: self._swallow_error(e, "While notifying 'join'") + ) + # this should run regardless + txaio.add_callbacks( + d, + lambda _: txaio.as_future(self.onJoin, details), + None + ) + # ignore any errors from onJoin (XXX or, should that be fatal?) + txaio.add_callbacks( + d, None, + lambda e: self._swallow_error(e, "While firing onJoin") + ) + # this instance is now "ready"... + txaio.add_callbacks( + d, + lambda _: self.fire('ready', self), + None + ) + # ignore any errors from 'ready' + txaio.add_callbacks( + d, None, + lambda e: self._swallow_error(e, "While notifying 'ready'") + ) + + def error(e): + reply = message.Abort( + u"wamp.error.cannot_authenticate", u"Error calling onWelcome handler" + ) + self._transport.send(reply) + return self._swallow_error(e, "While firing onWelcome") + txaio.add_callbacks(d, success, error) + + elif isinstance(msg, message.Abort): + # fire callback and close the transport + details = types.CloseDetails(msg.reason, msg.message) + d = txaio.as_future(self.onLeave, details) + + def success(arg): + # XXX also: handle async + d = self.fire('leave', self, details) + + def return_arg(_): + return arg + + def _error(e): + return self._swallow_error(e, "While firing 'leave' event") + txaio.add_callbacks(d, return_arg, _error) + return d + + def _error(e): + return self._swallow_error(e, "While firing onLeave") + txaio.add_callbacks(d, success, _error) + + elif isinstance(msg, message.Challenge): + + challenge = types.Challenge(msg.method, msg.extra) + d = txaio.as_future(self.onChallenge, challenge) + + def success(signature): + if signature is None: + raise Exception('onChallenge user callback did not return a signature') + if type(signature) == six.binary_type: + signature = signature.decode('utf8') + if type(signature) != six.text_type: + raise Exception('signature must be unicode (was {})'.format(type(signature))) + reply = message.Authenticate(signature) + self._transport.send(reply) + + def error(err): + self.onUserError(err, "Authentication failed") + reply = message.Abort(u"wamp.error.cannot_authenticate", u"{0}".format(err.value)) + self._transport.send(reply) + # fire callback and close the transport + details = types.CloseDetails(reply.reason, reply.message) + d = txaio.as_future(self.onLeave, details) + + def success(arg): + # XXX also: handle async + self.fire('leave', self, details) + return arg + + def _error(e): + return self._swallow_error(e, "While firing onLeave") + txaio.add_callbacks(d, success, _error) + # switching to the callback chain, effectively + # cancelling error (which we've now handled) + return d + + txaio.add_callbacks(d, success, error) + + else: + raise ProtocolError("Received {0} message, and session is not yet established".format(msg.__class__)) + + else: + # self._session_id != None (aka "session established") + if isinstance(msg, message.Goodbye): + if not self._goodbye_sent: + # the peer wants to close: send GOODBYE reply + reply = message.Goodbye() + self._transport.send(reply) + + self._session_id = None + + # fire callback and close the transport + details = types.CloseDetails(msg.reason, msg.message) + d = txaio.as_future(self.onLeave, details) + + def success(arg): + # XXX also: handle async + self.fire('leave', self, details) + return arg + + def _error(e): + errmsg = 'While firing onLeave for reason "{0}" and message "{1}"'.format(msg.reason, msg.message) + return self._swallow_error(e, errmsg) + txaio.add_callbacks(d, success, _error) + + elif isinstance(msg, message.Event): + + if msg.subscription in self._subscriptions: + + # fire all event handlers on subscription .. + for subscription in self._subscriptions[msg.subscription]: + + handler = subscription.handler + topic = msg.topic or subscription.topic + + if msg.enc_algo: + # FIXME: behavior in error cases (no keyring, decrypt issues, URI mismatch, ..) + if not self._payload_codec: + self.log.warn("received encoded payload with enc_algo={enc_algo}, but no payload codec active - ignoring encoded payload!", enc_algo=msg.enc_algo) + return + else: + try: + encoded_payload = EncodedPayload(msg.payload, msg.enc_algo, msg.enc_serializer, msg.enc_key) + decoded_topic, msg.args, msg.kwargs = self._payload_codec.decode(False, topic, encoded_payload) + except Exception as e: + self.log.warn("failed to decode application payload encoded with enc_algo={enc_algo}: {error}", error=e, enc_algo=msg.enc_algo) + return + else: + if topic != decoded_topic: + self.log.warn("envelope topic URI does not match encoded one") + return + + invoke_args = (handler.obj,) if handler.obj else tuple() + if msg.args: + invoke_args = invoke_args + tuple(msg.args) + invoke_kwargs = msg.kwargs if msg.kwargs else dict() + + if handler.details_arg: + invoke_kwargs[handler.details_arg] = types.EventDetails(subscription, msg.publication, publisher=msg.publisher, publisher_authid=msg.publisher_authid, publisher_authrole=msg.publisher_authrole, topic=topic, retained=msg.retained, enc_algo=msg.enc_algo, forward_for=msg.forward_for) + + # FIXME: https://github.com/crossbario/autobahn-python/issues/764 + def _success(_): + # Acknowledged Events -- only if we got the details header and + # the broker advertised it + if msg.x_acknowledged_delivery and self._router_roles["broker"].x_acknowledged_event_delivery: + if self._transport: + response = message.EventReceived(msg.publication) + self._transport.send(response) + else: + self.log.warn("successfully processed event with acknowledged delivery, but could not send ACK, since the transport was lost in the meantime") + + def _error(e): + errmsg = 'While firing {0} subscribed under {1}.'.format( + handler.fn, msg.subscription) + return self._swallow_error(e, errmsg) + + future = txaio.as_future(handler.fn, *invoke_args, **invoke_kwargs) + txaio.add_callbacks(future, _success, _error) + + else: + raise ProtocolError("EVENT received for non-subscribed subscription ID {0}".format(msg.subscription)) + + elif isinstance(msg, message.Published): + + if msg.request in self._publish_reqs: + + # get and pop outstanding publish request + publish_request = self._publish_reqs.pop(msg.request) + + # create a new publication object + publication = Publication(msg.publication, was_encrypted=publish_request.was_encrypted) + + # resolve deferred/future for publishing successfully + txaio.resolve(publish_request.on_reply, publication) + else: + raise ProtocolError("PUBLISHED received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Subscribed): + + if msg.request in self._subscribe_reqs: + + # get and pop outstanding subscribe request + request = self._subscribe_reqs.pop(msg.request) + + # create new handler subscription list for subscription ID if not yet tracked + if msg.subscription not in self._subscriptions: + self._subscriptions[msg.subscription] = [] + + subscription = Subscription(msg.subscription, request.topic, self, request.handler) + + # add handler to existing subscription + self._subscriptions[msg.subscription].append(subscription) + + # resolve deferred/future for subscribing successfully + txaio.resolve(request.on_reply, subscription) + else: + raise ProtocolError("SUBSCRIBED received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Unsubscribed): + + if msg.request in self._unsubscribe_reqs: + + # get and pop outstanding subscribe request + request = self._unsubscribe_reqs.pop(msg.request) + + # if the subscription still exists, mark as inactive and remove .. + if request.subscription_id in self._subscriptions: + for subscription in self._subscriptions[request.subscription_id]: + subscription.active = False + del self._subscriptions[request.subscription_id] + + # resolve deferred/future for unsubscribing successfully + txaio.resolve(request.on_reply, 0) + else: + raise ProtocolError("UNSUBSCRIBED received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Result): + + if msg.request in self._call_reqs: + + call_request = self._call_reqs[msg.request] + proc = call_request.procedure + enc_err = None + + if msg.enc_algo: + + if not self._payload_codec: + log_msg = u"received encoded payload, but no payload codec active" + self.log.warn(log_msg) + enc_err = ApplicationError(ApplicationError.ENC_NO_PAYLOAD_CODEC, log_msg) + else: + try: + encoded_payload = EncodedPayload(msg.payload, msg.enc_algo, msg.enc_serializer, msg.enc_key) + decrypted_proc, msg.args, msg.kwargs = self._payload_codec.decode(True, proc, encoded_payload) + except Exception as e: + self.log.warn( + "failed to decrypt application payload 1: {err}", + err=e, + ) + enc_err = ApplicationError( + ApplicationError.ENC_DECRYPT_ERROR, + u"failed to decrypt application payload 1: {}".format(e), + ) + else: + if proc != decrypted_proc: + self.log.warn( + "URI within encrypted payload ('{decrypted_proc}') does not match the envelope ('{proc}')", + decrypted_proc=decrypted_proc, + proc=proc, + ) + enc_err = ApplicationError( + ApplicationError.ENC_TRUSTED_URI_MISMATCH, + u"URI within encrypted payload ('{}') does not match the envelope ('{}')".format(decrypted_proc, proc), + ) + + if msg.progress: + # process progressive call result + + if call_request.options.on_progress: + if enc_err: + self.onUserError(enc_err, "could not deliver progressive call result, because payload decryption failed") + else: + kw = msg.kwargs or dict() + args = msg.args or tuple() + + def _error(fail): + self.onUserError(fail, "While firing on_progress") + + if call_request.options and call_request.options.details: + prog_d = txaio.as_future(call_request.options.on_progress, + types.CallResult(*msg.args, + callee=msg.callee, + callee_authid=msg.callee_authid, + callee_authrole=msg.callee_authrole, + forward_for=msg.forward_for, + **msg.kwargs)) + else: + prog_d = txaio.as_future(call_request.options.on_progress, + *args, + **kw) + + txaio.add_callbacks(prog_d, None, _error) + + else: + # process final call result + + # drop original request + del self._call_reqs[msg.request] + + # user callback that gets fired + on_reply = call_request.on_reply + + # above might already have rejected, so we guard .. + if enc_err: + txaio.reject(on_reply, enc_err) + else: + if msg.kwargs or (call_request.options and call_request.options.details): + kwargs = msg.kwargs or {} + if msg.args: + res = types.CallResult(*msg.args, + callee=msg.callee, + callee_authid=msg.callee_authid, + callee_authrole=msg.callee_authrole, + forward_for=msg.forward_for, + **kwargs) + else: + res = types.CallResult(callee=msg.callee, + callee_authid=msg.callee_authid, + callee_authrole=msg.callee_authrole, + forward_for=msg.forward_for, + **kwargs) + txaio.resolve(on_reply, res) + else: + if msg.args: + if len(msg.args) > 1: + res = types.CallResult(*msg.args) + txaio.resolve(on_reply, res) + else: + txaio.resolve(on_reply, msg.args[0]) + else: + txaio.resolve(on_reply, None) + else: + raise ProtocolError("RESULT received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Invocation): + + if msg.request in self._invocations: + + raise ProtocolError("INVOCATION received for request ID {0} already invoked".format(msg.request)) + + else: + + if msg.registration not in self._registrations: + + raise ProtocolError("INVOCATION received for non-registered registration ID {0}".format(msg.registration)) + + else: + registration = self._registrations[msg.registration] + endpoint = registration.endpoint + proc = msg.procedure or registration.procedure + enc_err = None + + if msg.enc_algo: + if not self._payload_codec: + log_msg = u"received encrypted INVOCATION payload, but no keyring active" + self.log.warn(log_msg) + enc_err = ApplicationError(ApplicationError.ENC_NO_PAYLOAD_CODEC, log_msg) + else: + try: + encoded_payload = EncodedPayload(msg.payload, msg.enc_algo, msg.enc_serializer, msg.enc_key) + decrypted_proc, msg.args, msg.kwargs = self._payload_codec.decode(False, proc, encoded_payload) + except Exception as e: + self.log.warn( + "failed to decrypt INVOCATION payload: {err}", + err=e, + ) + enc_err = ApplicationError( + ApplicationError.ENC_DECRYPT_ERROR, + "failed to decrypt INVOCATION payload: {}".format(e), + ) + else: + if proc != decrypted_proc: + self.log.warn( + "URI within encrypted INVOCATION payload ('{decrypted_proc}') " + "does not match the envelope ('{proc}')", + decrypted_proc=decrypted_proc, + proc=proc, + ) + enc_err = ApplicationError( + ApplicationError.ENC_TRUSTED_URI_MISMATCH, + u"URI within encrypted INVOCATION payload ('{}') does not match the envelope ('{}')".format(decrypted_proc, proc), + ) + + if enc_err: + # when there was a problem decrypting the INVOCATION payload, we obviously can't invoke + # the endpoint, but return and + reply = self._message_from_exception(message.Invocation.MESSAGE_TYPE, msg.request, enc_err) + self._transport.send(reply) + + else: + + if endpoint.obj is not None: + invoke_args = (endpoint.obj,) + else: + invoke_args = tuple() + + if msg.args: + invoke_args = invoke_args + tuple(msg.args) + + invoke_kwargs = msg.kwargs if msg.kwargs else dict() + + if endpoint.details_arg: + + if msg.receive_progress: + + def progress(*args, **kwargs): + assert(args is None or type(args) in (list, tuple)) + assert(kwargs is None or type(kwargs) == dict) + + if kwargs and six.PY2: + kwargs = { + k.decode('utf8'): v + for k, v in kwargs.iteritems() + } + + encoded_payload = None + if msg.enc_algo: + if not self._payload_codec: + raise Exception(u"trying to send encrypted payload, but no keyring active") + encoded_payload = self._payload_codec.encode(False, proc, args, kwargs) + + if encoded_payload: + progress_msg = message.Yield(msg.request, + payload=encoded_payload.payload, + progress=True, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer) + else: + progress_msg = message.Yield(msg.request, + args=args, + kwargs=kwargs, + progress=True) + + self._transport.send(progress_msg) + else: + progress = None + + invoke_kwargs[endpoint.details_arg] = types.CallDetails(registration, + progress=progress, + caller=msg.caller, + caller_authid=msg.caller_authid, + caller_authrole=msg.caller_authrole, + procedure=proc, + enc_algo=msg.enc_algo) + + on_reply = txaio.as_future(endpoint.fn, *invoke_args, **invoke_kwargs) + + def success(res): + del self._invocations[msg.request] + + encoded_payload = None + if msg.enc_algo: + if not self._payload_codec: + log_msg = u"trying to send encrypted payload, but no keyring active" + self.log.warn(log_msg) + else: + try: + if isinstance(res, types.CallResult): + encoded_payload = self._payload_codec.encode(False, proc, res.results, res.kwresults) + else: + encoded_payload = self._payload_codec.encode(False, proc, [res]) + except Exception as e: + self.log.warn( + "failed to encrypt application payload: {err}", + err=e, + ) + + if encoded_payload: + if isinstance(res, types.CallResult): + reply = message.Yield(msg.request, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer, + callee=res.callee, + callee_authid=res.callee_authid, + callee_authrole=res.callee_authrole, + forward_for=res.forward_for) + else: + reply = message.Yield(msg.request, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer) + else: + if isinstance(res, types.CallResult): + reply = message.Yield(msg.request, + args=res.results, + kwargs=res.kwresults, + callee=res.callee, + callee_authid=res.callee_authid, + callee_authrole=res.callee_authrole, + forward_for=res.forward_for) + else: + reply = message.Yield(msg.request, + args=[res]) + + if self._transport is None: + self.log.debug('Skipping result of "{}", request {} because transport disconnected.'.format(registration.procedure, msg.request)) + return + + try: + self._transport.send(reply) + except SerializationError as e: + # the application-level payload returned from the invoked procedure can't be serialized + reply = message.Error(message.Invocation.MESSAGE_TYPE, msg.request, ApplicationError.INVALID_PAYLOAD, + args=[u'success return value from invoked procedure "{0}" could not be serialized: {1}'.format(registration.procedure, e)]) + self._transport.send(reply) + except PayloadExceededError as e: + # the application-level payload returned from the invoked procedure, when serialized and framed + # for the transport, exceeds the transport message/frame size limit + reply = message.Error(message.Invocation.MESSAGE_TYPE, msg.request, ApplicationError.PAYLOAD_SIZE_EXCEEDED, + args=[u'success return value from invoked procedure "{0}" exceeds transport size limit: {1}'.format(registration.procedure, e)]) + self._transport.send(reply) + + def error(err): + del self._invocations[msg.request] + + errmsg = txaio.failure_message(err) + + try: + self.onUserError(err, errmsg) + except: + pass + + formatted_tb = None + if self.traceback_app: + formatted_tb = txaio.failure_format_traceback(err) + + reply = self._message_from_exception( + message.Invocation.MESSAGE_TYPE, + msg.request, + err.value, + formatted_tb, + msg.enc_algo + ) + + try: + self._transport.send(reply) + except SerializationError as e: + # the application-level payload returned from the invoked procedure can't be serialized + reply = message.Error(message.Invocation.MESSAGE_TYPE, msg.request, ApplicationError.INVALID_PAYLOAD, + args=[u'error return value from invoked procedure "{0}" could not be serialized: {1}'.format(registration.procedure, e)]) + self._transport.send(reply) + except PayloadExceededError as e: + # the application-level payload returned from the invoked procedure, when serialized and framed + # for the transport, exceeds the transport message/frame size limit + reply = message.Error(message.Invocation.MESSAGE_TYPE, msg.request, ApplicationError.PAYLOAD_SIZE_EXCEEDED, + args=[u'success return value from invoked procedure "{0}" exceeds transport size limit: {1}'.format(registration.procedure, e)]) + self._transport.send(reply) + + # we have handled the error, so we eat it + return None + + self._invocations[msg.request] = InvocationRequest(msg.request, on_reply) + + txaio.add_callbacks(on_reply, success, error) + + elif isinstance(msg, message.Interrupt): + + if msg.request not in self._invocations: + # raise ProtocolError("INTERRUPT received for non-pending invocation {0}".format(msg.request)) + self.log.debug('INTERRUPT received for non-pending invocation {request}', request=msg.request) + else: + invoked = self._invocations[msg.request] + # this will result in a CancelledError which will + # be captured by the error handler around line 979 + # to delete the invocation.. + txaio.cancel(invoked.on_reply) + + elif isinstance(msg, message.Registered): + + if msg.request in self._register_reqs: + + # get and pop outstanding register request + request = self._register_reqs.pop(msg.request) + + # create new registration if not yet tracked + if msg.registration not in self._registrations: + registration = Registration(self, msg.registration, request.procedure, request.endpoint) + self._registrations[msg.registration] = registration + else: + raise ProtocolError("REGISTERED received for already existing registration ID {0}".format(msg.registration)) + + txaio.resolve(request.on_reply, registration) + else: + raise ProtocolError("REGISTERED received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Unregistered): + + if msg.request == 0: + # this is a forced un-register either from a call + # to the wamp.* meta-api or the force_reregister + # option + try: + reg = self._registrations[msg.registration] + except KeyError: + raise ProtocolError( + "UNREGISTERED received for non-existant registration" + " ID {0}".format(msg.registration) + ) + self.log.info( + u"Router unregistered procedure '{proc}' with ID {id}", + proc=reg.procedure, + id=msg.registration, + ) + elif msg.request in self._unregister_reqs: + + # get and pop outstanding subscribe request + request = self._unregister_reqs.pop(msg.request) + + # if the registration still exists, mark as inactive and remove .. + if request.registration_id in self._registrations: + self._registrations[request.registration_id].active = False + del self._registrations[request.registration_id] + + # resolve deferred/future for unregistering successfully + txaio.resolve(request.on_reply) + else: + raise ProtocolError("UNREGISTERED received for non-pending request ID {0}".format(msg.request)) + + elif isinstance(msg, message.Error): + + # remove outstanding request and get the reply deferred/future + on_reply = None + + # ERROR reply to CALL + if msg.request_type == message.Call.MESSAGE_TYPE and msg.request in self._call_reqs: + on_reply = self._call_reqs.pop(msg.request).on_reply + + # ERROR reply to PUBLISH + elif msg.request_type == message.Publish.MESSAGE_TYPE and msg.request in self._publish_reqs: + on_reply = self._publish_reqs.pop(msg.request).on_reply + + # ERROR reply to SUBSCRIBE + elif msg.request_type == message.Subscribe.MESSAGE_TYPE and msg.request in self._subscribe_reqs: + on_reply = self._subscribe_reqs.pop(msg.request).on_reply + + # ERROR reply to UNSUBSCRIBE + elif msg.request_type == message.Unsubscribe.MESSAGE_TYPE and msg.request in self._unsubscribe_reqs: + on_reply = self._unsubscribe_reqs.pop(msg.request).on_reply + + # ERROR reply to REGISTER + elif msg.request_type == message.Register.MESSAGE_TYPE and msg.request in self._register_reqs: + on_reply = self._register_reqs.pop(msg.request).on_reply + + # ERROR reply to UNREGISTER + elif msg.request_type == message.Unregister.MESSAGE_TYPE and msg.request in self._unregister_reqs: + on_reply = self._unregister_reqs.pop(msg.request).on_reply + + if on_reply: + if not txaio.is_called(on_reply): + txaio.reject(on_reply, self._exception_from_message(msg)) + else: + raise ProtocolError("WampAppSession.onMessage(): ERROR received for non-pending request_type {0} and request ID {1}".format(msg.request_type, msg.request)) + + else: + + raise ProtocolError("Unexpected message {0}".format(msg.__class__)) + + @public + def onClose(self, wasClean): + """ + Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onClose` + """ + self._transport = None + + if self._session_id: + # fire callback and close the transport + details = types.CloseDetails( + reason=types.CloseDetails.REASON_TRANSPORT_LOST, + message=u'WAMP transport was lost without closing the session {} before'.format(self._session_id), + ) + d = txaio.as_future(self.onLeave, details) + + def success(arg): + # XXX also: handle async + self.fire('leave', self, details) + return arg + + def _error(e): + return self._swallow_error(e, "While firing onLeave") + txaio.add_callbacks(d, success, _error) + + self._session_id = None + + d = txaio.as_future(self.onDisconnect) + + def success(arg): + # XXX do we care about returning 'arg' properly? + return self.fire('disconnect', self, was_clean=wasClean) + + def _error(e): + return self._swallow_error(e, "While firing onDisconnect") + txaio.add_callbacks(d, success, _error) + + @public + def onChallenge(self, challenge): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onChallenge` + """ + raise Exception("received authentication challenge, but onChallenge not implemented") + + @public + def onJoin(self, details): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onJoin` + """ + + @public + def onWelcome(self, msg): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onWelcome` + """ + + def _errback_outstanding_requests(self, exc): + """ + Errback any still outstanding requests with exc. + """ + d = txaio.create_future_success(None) + all_requests = [ + self._publish_reqs, + self._subscribe_reqs, + self._unsubscribe_reqs, + self._call_reqs, + self._register_reqs, + self._unregister_reqs + ] + outstanding = [] + for requests in all_requests: + outstanding.extend(requests.values()) + requests.clear() + + if outstanding: + self.log.info( + 'Cancelling {count} outstanding requests', + count=len(outstanding), + ) + for request in outstanding: + self.log.debug( + 'cleaning up outstanding {request_type} request {request_id}, ' + 'firing errback on user handler {request_on_reply}', + request_on_reply=request.on_reply, + request_id=request.request_id, + request_type=request.__class__.__name__, + ) + if not txaio.is_called(request.on_reply): + txaio.reject(request.on_reply, exc) + + # wait for any async-ness in the error handlers for on_reply + txaio.add_callbacks(d, lambda _: request.on_reply, lambda _: request.on_reply) + return d + + @public + def onLeave(self, details): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onLeave` + """ + if details.reason != CloseDetails.REASON_DEFAULT: + self.log.warn('session closed with reason {reason} [{message}]', reason=details.reason, message=details.message) + + # fire ApplicationError on any currently outstanding requests + exc = ApplicationError(details.reason, details.message) + d = self._errback_outstanding_requests(exc) + + def disconnect(_): + if self._transport: + self.disconnect() + txaio.add_callbacks(d, disconnect, disconnect) + return d + + @public + def leave(self, reason=None, message=None): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.leave` + """ + if not self._session_id: + raise SessionNotReady(u"session hasn't joined a realm") + + if not self._goodbye_sent: + if not reason: + reason = u"wamp.close.normal" + msg = wamp.message.Goodbye(reason=reason, message=message) + self._transport.send(msg) + self._goodbye_sent = True + else: + self.log.warn('session was already requested to leave - not sending GOODBYE again') + + is_closed = self._transport is None or self._transport.is_closed + + return is_closed + + @public + def onDisconnect(self): + """ + Implements :func:`autobahn.wamp.interfaces.ISession.onDisconnect` + """ + # fire TransportLost on any _still_ outstanding requests + # (these should have been already cleaned up in onLeave() - when + # this actually has fired) + exc = exception.TransportLost() + self._errback_outstanding_requests(exc) + + @public + def publish(self, topic, *args, **kwargs): + """ + Implements :func:`autobahn.wamp.interfaces.IPublisher.publish` + """ + assert(type(topic) == six.text_type) + assert(args is None or type(args) in (list, tuple)) + assert(kwargs is None or type(kwargs) == dict) + + message.check_or_raise_uri(topic, + message='{}.publish()'.format(self.__class__.__name__), + strict=False, + allow_empty_components=False, + allow_none=False) + + options = kwargs.pop('options', None) + if options and not isinstance(options, types.PublishOptions): + raise Exception("options must be of type a.w.t.PublishOptions") + + if kwargs and six.PY2: + kwargs = { + k.decode('utf8'): v + for k, v in kwargs.iteritems() + } + + if not self._transport: + raise exception.TransportLost() + + request_id = self._request_id_gen.next() + + encoded_payload = None + if self._payload_codec: + encoded_payload = self._payload_codec.encode(True, topic, args, kwargs) + + if encoded_payload: + if options: + msg = message.Publish(request_id, + topic, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer, + **options.message_attr()) + else: + msg = message.Publish(request_id, + topic, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer) + else: + if options: + msg = message.Publish(request_id, + topic, + args=args, + kwargs=kwargs, + **options.message_attr()) + else: + msg = message.Publish(request_id, + topic, + args=args, + kwargs=kwargs) + + if options: + if options.correlation_id is not None: + msg.correlation_id = options.correlation_id + if options.correlation_uri is not None: + msg.correlation_uri = options.correlation_uri + if options.correlation_is_anchor is not None: + msg.correlation_is_anchor = options.correlation_is_anchor + if options.correlation_is_last is not None: + msg.correlation_is_last = options.correlation_is_last + + if options and options.acknowledge: + # only acknowledged publications expect a reply .. + on_reply = txaio.create_future() + self._publish_reqs[request_id] = PublishRequest(request_id, on_reply, was_encrypted=(encoded_payload is not None)) + else: + on_reply = None + + try: + # Notes: + # + # * this might raise autobahn.wamp.exception.SerializationError + # when the user payload cannot be serialized + # * we have to setup a PublishRequest() in _publish_reqs _before_ + # calling transpor.send(), because a mock- or side-by-side transport + # will immediately lead on an incoming WAMP message in onMessage() + # + self._transport.send(msg) + except Exception as e: + if request_id in self._publish_reqs: + del self._publish_reqs[request_id] + raise e + + return on_reply + + @public + def subscribe(self, handler, topic=None, options=None): + """ + Implements :func:`autobahn.wamp.interfaces.ISubscriber.subscribe` + """ + assert((callable(handler) and topic is not None) or hasattr(handler, '__class__')) + assert(topic is None or type(topic) == six.text_type) + assert(options is None or isinstance(options, types.SubscribeOptions)) + + if not self._transport: + raise exception.TransportLost() + + def _subscribe(obj, fn, topic, options): + message.check_or_raise_uri(topic, + message='{}.subscribe()'.format(self.__class__.__name__), + strict=False, + allow_empty_components=True, + allow_none=False) + + request_id = self._request_id_gen.next() + on_reply = txaio.create_future() + handler_obj = Handler(fn, obj, options.details_arg if options else None) + self._subscribe_reqs[request_id] = SubscribeRequest(request_id, topic, on_reply, handler_obj) + + if options: + msg = message.Subscribe(request_id, topic, **options.message_attr()) + else: + msg = message.Subscribe(request_id, topic) + + if options: + if options.correlation_id is not None: + msg.correlation_id = options.correlation_id + if options.correlation_uri is not None: + msg.correlation_uri = options.correlation_uri + if options.correlation_is_anchor is not None: + msg.correlation_is_anchor = options.correlation_is_anchor + if options.correlation_is_last is not None: + msg.correlation_is_last = options.correlation_is_last + + self._transport.send(msg) + return on_reply + + if callable(handler): + # subscribe a single handler + return _subscribe(None, handler, topic, options) + + else: + + # subscribe all methods on an object decorated with "wamp.subscribe" + on_replies = [] + for k in inspect.getmembers(handler.__class__, is_method_or_function): + proc = k[1] + if "_wampuris" in proc.__dict__: + for pat in proc.__dict__["_wampuris"]: + if pat.is_handler(): + _uri = pat.uri() + subopts = pat.options or options + if subopts is None: + if pat.uri_type == uri.Pattern.URI_TYPE_WILDCARD: + subopts = types.SubscribeOptions(match=u"wildcard") + else: + subopts = types.SubscribeOptions(match=u"exact") + on_replies.append(_subscribe(handler, proc, _uri, subopts)) + + # XXX needs coverage + return txaio.gather(on_replies, consume_exceptions=True) + + def _unsubscribe(self, subscription): + """ + Called from :meth:`autobahn.wamp.protocol.Subscription.unsubscribe` + """ + assert(isinstance(subscription, Subscription)) + assert subscription.active + assert(subscription.id in self._subscriptions) + assert(subscription in self._subscriptions[subscription.id]) + + if not self._transport: + raise exception.TransportLost() + + # remove handler subscription and mark as inactive + self._subscriptions[subscription.id].remove(subscription) + subscription.active = False + + # number of handler subscriptions left .. + scount = len(self._subscriptions[subscription.id]) + + if scount == 0: + # if the last handler was removed, unsubscribe from broker .. + request_id = self._request_id_gen.next() + + on_reply = txaio.create_future() + self._unsubscribe_reqs[request_id] = UnsubscribeRequest(request_id, on_reply, subscription.id) + + msg = message.Unsubscribe(request_id, subscription.id) + + self._transport.send(msg) + return on_reply + else: + # there are still handlers active on the subscription! + return txaio.create_future_success(scount) + + @public + def call(self, procedure, *args, **kwargs): + """ + Implements :func:`autobahn.wamp.interfaces.ICaller.call` + """ + assert(type(procedure) == six.text_type) + assert(args is None or type(args) in (list, tuple)) + assert(kwargs is None or type(kwargs) == dict) + + message.check_or_raise_uri(procedure, + message='{}.call()'.format(self.__class__.__name__), + strict=False, + allow_empty_components=False, + allow_none=False) + + options = kwargs.pop('options', None) + if options and not isinstance(options, types.CallOptions): + raise Exception("options must be of type a.w.t.CallOptions") + + if kwargs and six.PY2: + kwargs = { + k.decode('utf8'): v + for k, v in kwargs.iteritems() + } + + if not self._transport: + raise exception.TransportLost() + + request_id = self._request_id_gen.next() + + encoded_payload = None + if self._payload_codec: + try: + encoded_payload = self._payload_codec.encode(True, procedure, args, kwargs) + except: + self.log.failure() + raise + + if encoded_payload: + if options: + msg = message.Call(request_id, + procedure, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer, + **options.message_attr()) + else: + msg = message.Call(request_id, + procedure, + payload=encoded_payload.payload, + enc_algo=encoded_payload.enc_algo, + enc_key=encoded_payload.enc_key, + enc_serializer=encoded_payload.enc_serializer) + else: + if options: + msg = message.Call(request_id, + procedure, + args=args, + kwargs=kwargs, + **options.message_attr()) + else: + msg = message.Call(request_id, + procedure, + args=args, + kwargs=kwargs) + + if options: + if options.correlation_id is not None: + msg.correlation_id = options.correlation_id + if options.correlation_uri is not None: + msg.correlation_uri = options.correlation_uri + if options.correlation_is_anchor is not None: + msg.correlation_is_anchor = options.correlation_is_anchor + if options.correlation_is_last is not None: + msg.correlation_is_last = options.correlation_is_last + + def canceller(d): + cancel_msg = message.Cancel(request_id) + self._transport.send(cancel_msg) + # since we announced support for cancelling, we should + # definitely get an Error back for our Cancel which will + # clean up this invocation + + on_reply = txaio.create_future(canceller=canceller) + self._call_reqs[request_id] = CallRequest(request_id, procedure, on_reply, options) + + try: + # Notes: + # + # * this might raise autobahn.wamp.exception.SerializationError + # when the user payload cannot be serialized + # * we have to setup a CallRequest() in _call_reqs _before_ + # calling transpor.send(), because a mock- or side-by-side transport + # will immediately lead on an incoming WAMP message in onMessage() + # + self._transport.send(msg) + except: + if request_id in self._call_reqs: + del self._call_reqs[request_id] + raise + + return on_reply + + @public + def register(self, endpoint, procedure=None, options=None, prefix=None): + """ + Implements :func:`autobahn.wamp.interfaces.ICallee.register` + """ + assert((callable(endpoint) and procedure is not None) or hasattr(endpoint, '__class__')) + assert(procedure is None or type(procedure) == six.text_type) + assert(options is None or isinstance(options, types.RegisterOptions)) + assert prefix is None or isinstance(prefix, six.text_type) + + if not self._transport: + raise exception.TransportLost() + + def _register(obj, fn, procedure, options): + message.check_or_raise_uri(procedure, + message='{}.register()'.format(self.__class__.__name__), + strict=False, + allow_empty_components=True, + allow_none=False) + + request_id = self._request_id_gen.next() + on_reply = txaio.create_future() + endpoint_obj = Endpoint(fn, obj, options.details_arg if options else None) + if prefix is not None: + procedure = u"{}{}".format(prefix, procedure) + self._register_reqs[request_id] = RegisterRequest(request_id, on_reply, procedure, endpoint_obj) + + if options: + msg = message.Register(request_id, procedure, **options.message_attr()) + else: + msg = message.Register(request_id, procedure) + + if options: + if options.correlation_id is not None: + msg.correlation_id = options.correlation_id + if options.correlation_uri is not None: + msg.correlation_uri = options.correlation_uri + if options.correlation_is_anchor is not None: + msg.correlation_is_anchor = options.correlation_is_anchor + if options.correlation_is_last is not None: + msg.correlation_is_last = options.correlation_is_last + + self._transport.send(msg) + return on_reply + + if callable(endpoint): + + # register a single callable + return _register(None, endpoint, procedure, options) + + else: + + # register all methods on an object decorated with "wamp.register" + on_replies = [] + for k in inspect.getmembers(endpoint.__class__, is_method_or_function): + proc = k[1] + if "_wampuris" in proc.__dict__: + for pat in proc.__dict__["_wampuris"]: + if pat.is_endpoint(): + _uri = pat.uri() + regopts = pat.options or options + on_replies.append(_register(endpoint, proc, _uri, regopts)) + + # XXX needs coverage + return txaio.gather(on_replies, consume_exceptions=True) + + def _unregister(self, registration): + """ + Called from :meth:`autobahn.wamp.protocol.Registration.unregister` + """ + assert(isinstance(registration, Registration)) + assert registration.active + assert(registration.id in self._registrations) + + if not self._transport: + raise exception.TransportLost() + + request_id = self._request_id_gen.next() + + on_reply = txaio.create_future() + self._unregister_reqs[request_id] = UnregisterRequest(request_id, on_reply, registration.id) + + msg = message.Unregister(request_id, registration.id) + + self._transport.send(msg) + return on_reply + + +class _SessionShim(ApplicationSession): + """ + shim that lets us present pep8 API for user-classes to override, + but also backwards-compatible for existing code using + ApplicationSession "directly". + + **NOTE:** this is not public or intended for use; you should import + either :class:`autobahn.asyncio.wamp.Session` or + :class:`autobahn.twisted.wamp.Session` depending on which async + framework you're using. + """ + + #: name -> IAuthenticator + _authenticators = None + + def onJoin(self, details): + return self.on_join(details) + + def onConnect(self): + if self._authenticators: + # authid, authrole *must* match across all authenticators + # (checked in add_authenticator) so these lists are either + # [None] or [None, 'some_authid'] + authid = [x._args.get('authid', None) for x in self._authenticators.values()][-1] + authrole = [x._args.get('authrole', None) for x in self._authenticators.values()][-1] + # we need a "merged" authextra here because we can send a + # list of acceptable authmethods, but only a single + # authextra dict + authextra = self._merged_authextra() + self.join( + self.config.realm, + authmethods=list(self._authenticators.keys()), + authid=authid or u'public', + authrole=authrole or u'default', + authextra=authextra, + ) + else: + self.on_connect() + + def onChallenge(self, challenge): + try: + authenticator = self._authenticators[challenge.method] + except KeyError: + raise RuntimeError( + "Received challenge for unknown authmethod '{}'".format( + challenge.method + ) + ) + return authenticator.on_challenge(self, challenge) + + def onWelcome(self, msg): + if msg.authmethod is None or self._authenticators is None: + # no authentication + return + try: + authenticator = self._authenticators[msg.authmethod] + except KeyError: + raise RuntimeError( + "Received onWelcome for unknown authmethod '{}'".format( + msg.authmethod + ) + ) + return authenticator.on_welcome(self, msg.authextra) + + def onLeave(self, details): + return self.on_leave(details) + + def onDisconnect(self): + return self.on_disconnect() + + # experimental authentication API + + def add_authenticator(self, authenticator): + assert isinstance(authenticator, IAuthenticator) + if self._authenticators is None: + self._authenticators = {} + + # before adding this authenticator we need to validate that + # it's consistent with any other authenticators we may have -- + # for example, they must all agree on "authid" etc because + # .join() only takes one value for all of those. + + def at_most_one(name): + uni = set([ + a._args[name] + for a in list(self._authenticators.values()) + [authenticator] + if name in a._args + ]) + if len(uni) > 1: + raise ValueError( + "Inconsistent {}s: {}".format( + name, + ' '.join(uni), + ) + ) + + # all authids must match + at_most_one('authid') + + # all authroles must match + at_most_one('authrole') + + # can we do anything else other than merge all authextra keys? + # here we check that any duplicate keys have the same values + authextra = authenticator.authextra + merged = self._merged_authextra() + for k, v in merged.items(): + if k in authextra and authextra[k] != v: + raise ValueError( + "Inconsistent authextra values for '{}': '{}' vs '{}'".format( + k, v, authextra[k], + ) + ) + + # validation complete, add it + self._authenticators[authenticator.name] = authenticator + + def _merged_authextra(self): + """ + internal helper + + :returns: a single 'authextra' dict, consisting of all keys + from any authenticator's authextra. + + Note that when the authenticator was added, we already checked + that any keys it does contain has the same value as any + existing authextra. + """ + authextras = [a.authextra for a in self._authenticators.values()] + + def extract_keys(x, y): + return x | set(y.keys()) + + unique_keys = reduce(extract_keys, authextras, set()) + + def first_value_for(k): + """ + for anything already in self._authenticators, we checked + that it has the same value for any keys in its authextra -- + so here we just extract the first one + """ + for authextra in authextras: + if k in authextra: + return authextra[k] + # "can't" happen + raise ValueError( + "No values for '{}'".format(k) + ) + + return { + k: first_value_for(k) + for k in unique_keys + } + + # these are the actual "new API" methods (i.e. snake_case) + # + + def on_join(self, details): + pass + + def on_leave(self, details): + self.disconnect() + + def on_connect(self): + self.join(self.config.realm) + + def on_disconnect(self): + pass + + +# ISession.register collides with the abc.ABCMeta.register method +# ISession.register(ApplicationSession) + + +class ApplicationSessionFactory(object): + """ + WAMP endpoint session factory. + """ + + session = ApplicationSession + """ + WAMP application session class to be used in this factory. + """ + + def __init__(self, config=None): + """ + + :param config: The default component configuration. + :type config: instance of :class:`autobahn.wamp.types.ComponentConfig` + """ + self.config = config or types.ComponentConfig(realm=u"realm1") + + def __call__(self): + """ + Creates a new WAMP application session. + + :returns: -- An instance of the WAMP application session class as + given by `self.session`. + """ + session = self.session(self.config) + session.factory = self + return session diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptobox.py b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptobox.py new file mode 100644 index 0000000..74e785b --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptobox.py @@ -0,0 +1,39 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +from autobahn.wamp import cryptobox + +import unittest + + +@unittest.skipIf(not cryptobox.HAS_CRYPTOBOX, 'no cryptobox support present') +class TestCryptoBox(unittest.TestCase): + + def test_create_keyring(self): + kr = cryptobox.KeyRing() + assert kr diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptosign.py b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptosign.py new file mode 100644 index 0000000..ebf3768 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_cryptosign.py @@ -0,0 +1,127 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import hashlib +import os + +from mock import Mock + +import txaio + +if os.environ.get('USE_TWISTED', False): + txaio.use_twisted() +elif os.environ.get('USE_ASYNCIO', False): + txaio.use_asyncio() +else: + raise Exception('no networking framework selected') + +from autobahn.wamp.cryptosign import _makepad, HAS_CRYPTOSIGN +from autobahn.wamp import types +from autobahn.wamp.auth import create_authenticator + +if HAS_CRYPTOSIGN: + from autobahn.wamp.cryptosign import SigningKey + from nacl.encoding import HexEncoder + +import tempfile + +import unittest + +keybody = '''-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW +QyNTUxOQAAACAa38i/4dNWFuZN/72QAJbyOwZvkUyML/u2b2B1uW4RbQAAAJj4FLyB+BS8 +gQAAAAtzc2gtZWQyNTUxOQAAACAa38i/4dNWFuZN/72QAJbyOwZvkUyML/u2b2B1uW4RbQ +AAAEBNV9l6aPVVaWYgpthJwM5YJWhRjXKet1PcfHMt4oBFEBrfyL/h01YW5k3/vZAAlvI7 +Bm+RTIwv+7ZvYHW5bhFtAAAAFXNvbWV1c2VyQGZ1bmt0aGF0LmNvbQ== +-----END OPENSSH PRIVATE KEY-----''' + +pubkey = '''ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVp3hjHwIQyEladzd8mFcf0YSXcmyKS3qMLB7VqTQKm someuser@example.com +''' + + +@unittest.skipIf(not HAS_CRYPTOSIGN, 'nacl library not present') +class TestAuth(unittest.TestCase): + + def setUp(self): + self.key = SigningKey.from_ssh_data(keybody) + self.privkey_hex = self.key._key.encode(encoder=HexEncoder) + m = hashlib.sha256() + m.update("some TLS message".encode()) + self.channel_id = m.digest() + + def test_valid(self): + session = Mock() + session._transport.get_channel_id = Mock(return_value=self.channel_id) + challenge = types.Challenge(u"ticket", dict(challenge="ff" * 32)) + signed = yield self.key.sign_challenge(session, challenge) + self.assertEqual( + u'9b6f41540c9b95b4b7b281c3042fa9c54cef43c842d62ea3fd6030fcb66e70b3e80d49d44c29d1635da9348d02ec93f3ed1ef227dfb59a07b580095c2b82f80f9d16ca518aa0c2b707f2b2a609edeca73bca8dd59817a633f35574ac6fd80d00', + signed.result, + ) + + def test_authenticator(self): + authenticator = create_authenticator( + u"cryptosign", + authid="someone", + privkey=self.privkey_hex, + ) + session = Mock() + session._transport.get_channel_id = Mock(return_value=self.channel_id) + challenge = types.Challenge(u"cryptosign", dict(challenge="ff" * 32)) + reply = yield authenticator.on_challenge(session, challenge) + self.assertEqual( + reply.result, + u'9b6f41540c9b95b4b7b281c3042fa9c54cef43c842d62ea3fd6030fcb66e70b3e80d49d44c29d1635da9348d02ec93f3ed1ef227dfb59a07b580095c2b82f80f9d16ca518aa0c2b707f2b2a609edeca73bca8dd59817a633f35574ac6fd80d00', + ) + + +class TestKey(unittest.TestCase): + + def test_pad(self): + self.assertEqual(_makepad(0), '') + self.assertEqual(_makepad(2), '\x01\x02') + self.assertEqual(_makepad(3), '\x01\x02\x03') + + @unittest.skipIf(not HAS_CRYPTOSIGN, 'nacl library not present') + def test_key(self): + with tempfile.NamedTemporaryFile('w+t') as fp: + fp.write(keybody) + fp.seek(0) + + key = SigningKey.from_ssh_key(fp.name) + self.assertEqual(key.public_key(), '1adfc8bfe1d35616e64dffbd900096f23b066f914c8c2ffbb66f6075b96e116d') + + @unittest.skipIf(not HAS_CRYPTOSIGN, 'nacl library not present') + def test_pubkey(self): + with tempfile.NamedTemporaryFile('w+t') as fp: + fp.write(pubkey) + fp.seek(0) + + key = SigningKey.from_ssh_key(fp.name) + self.assertEqual(key.public_key(), '9569de18c7c0843212569dcddf2615c7f46125dc9b2292dea30b07b56a4d02a6') + self.assertEqual(key.comment(), 'someuser@example.com') diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_uri_pattern.py b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_uri_pattern.py new file mode 100644 index 0000000..bb189db --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/test/test_uri_pattern.py @@ -0,0 +1,580 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +from autobahn import wamp +from autobahn.wamp.uri import Pattern, RegisterOptions, SubscribeOptions + +import unittest + + +class TestUris(unittest.TestCase): + + def test_invalid_uris(self): + for u in [u"", + u"com.myapp..update", + u"com.myapp.<123:int>.update", + u"com.myapp.<:product>.update", + u"com.myapp..update", + u"com.myapp..update", + ]: + self.assertRaises(Exception, Pattern, u, Pattern.URI_TARGET_ENDPOINT) + + def test_valid_uris(self): + for u in [u"com.myapp.proc1", + u"123", + u"com.myapp..update", + u"com.myapp...list" + u"com.myapp.something..update" + ]: + p = Pattern(u, Pattern.URI_TARGET_ENDPOINT) + self.assertIsInstance(p, Pattern) + + def test_parse_uris(self): + tests = [ + (u"com.myapp..update", [ + (u"com.myapp.0.update", {u'product': 0}), + (u"com.myapp.123456.update", {u'product': 123456}), + (u"com.myapp.aaa.update", None), + (u"com.myapp..update", None), + (u"com.myapp.0.delete", None), + ] + ), + (u"com.myapp..update", [ + (u"com.myapp.box.update", {u'product': u'box'}), + (u"com.myapp.123456.update", {u'product': u'123456'}), + (u"com.myapp..update", None), + ] + ), + (u"com.myapp..update", [ + (u"com.myapp.0.update", {u'product': u'0'}), + (u"com.myapp.abc.update", {u'product': u'abc'}), + (u"com.myapp..update", None), + ] + ), + (u"com.myapp...list", [ + (u"com.myapp.cosmetic.shampoo.list", {u'category': u'cosmetic', u'subcategory': u'shampoo'}), + (u"com.myapp...list", None), + (u"com.myapp.cosmetic..list", None), + (u"com.myapp..shampoo.list", None), + ] + ) + ] + for test in tests: + pat = Pattern(test[0], Pattern.URI_TARGET_ENDPOINT) + for ptest in test[1]: + uri = ptest[0] + kwargs_should = ptest[1] + if kwargs_should is not None: + args_is, kwargs_is = pat.match(uri) + self.assertEqual(kwargs_is, kwargs_should) + else: + self.assertRaises(Exception, pat.match, uri) + + +class TestDecorators(unittest.TestCase): + + def test_decorate_endpoint(self): + + @wamp.register(u"com.calculator.square") + def square(_): + """Do nothing.""" + + self.assertTrue(hasattr(square, '_wampuris')) + self.assertTrue(type(square._wampuris) == list) + self.assertEqual(len(square._wampuris), 1) + self.assertIsInstance(square._wampuris[0], Pattern) + self.assertTrue(square._wampuris[0].is_endpoint()) + self.assertFalse(square._wampuris[0].is_handler()) + self.assertFalse(square._wampuris[0].is_exception()) + self.assertEqual(square._wampuris[0].uri(), u"com.calculator.square") + self.assertEqual(square._wampuris[0]._type, Pattern.URI_TYPE_EXACT) + + @wamp.register(u"com.myapp.product..update") + def update_product(product=None, label=None): + """Do nothing.""" + + self.assertTrue(hasattr(update_product, '_wampuris')) + self.assertTrue(type(update_product._wampuris) == list) + self.assertEqual(len(update_product._wampuris), 1) + self.assertIsInstance(update_product._wampuris[0], Pattern) + self.assertTrue(update_product._wampuris[0].is_endpoint()) + self.assertFalse(update_product._wampuris[0].is_handler()) + self.assertFalse(update_product._wampuris[0].is_exception()) + self.assertEqual(update_product._wampuris[0].uri(), u"com.myapp.product..update") + self.assertEqual(update_product._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.register(u"com.myapp...update") + def update(category=None, cid=None): + """Do nothing.""" + + self.assertTrue(hasattr(update, '_wampuris')) + self.assertTrue(type(update._wampuris) == list) + self.assertEqual(len(update._wampuris), 1) + self.assertIsInstance(update._wampuris[0], Pattern) + self.assertTrue(update._wampuris[0].is_endpoint()) + self.assertFalse(update._wampuris[0].is_handler()) + self.assertFalse(update._wampuris[0].is_exception()) + self.assertEqual(update._wampuris[0].uri(), u"com.myapp...update") + self.assertEqual(update._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.register(u"com.myapp.circle.", + RegisterOptions(match=u"wildcard", details_arg="details")) + def circle(name=None, details=None): + """ Do nothing. """ + + self.assertTrue(hasattr(circle, '_wampuris')) + self.assertTrue(type(circle._wampuris) == list) + self.assertEqual(len(circle._wampuris), 1) + self.assertIsInstance(circle._wampuris[0], Pattern) + self.assertIsInstance(circle._wampuris[0].options, RegisterOptions) + self.assertEqual(circle._wampuris[0].options.match, u"wildcard") + self.assertEqual(circle._wampuris[0].options.details_arg, "details") + self.assertTrue(circle._wampuris[0].is_endpoint()) + self.assertFalse(circle._wampuris[0].is_handler()) + self.assertFalse(circle._wampuris[0].is_exception()) + self.assertEqual(circle._wampuris[0].uri(), u"com.myapp.circle.") + self.assertEqual(circle._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.register(u"com.myapp.something..update", + RegisterOptions(match=u"wildcard", details_arg="details")) + def something(dynamic=None, details=None): + """ Do nothing. """ + self.assertTrue(hasattr(something, '_wampuris')) + self.assertTrue(type(something._wampuris) == list) + self.assertEqual(len(something._wampuris), 1) + self.assertIsInstance(something._wampuris[0], Pattern) + self.assertIsInstance(something._wampuris[0].options, RegisterOptions) + self.assertEqual(something._wampuris[0].options.match, u"wildcard") + self.assertEqual(something._wampuris[0].options.details_arg, "details") + self.assertTrue(something._wampuris[0].is_endpoint()) + self.assertFalse(something._wampuris[0].is_handler()) + self.assertFalse(something._wampuris[0].is_exception()) + self.assertEqual(something._wampuris[0].uri(), u"com.myapp.something..update") + self.assertEqual(something._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + def test_decorate_handler(self): + + @wamp.subscribe(u"com.myapp.on_shutdown") + def on_shutdown(): + """Do nothing.""" + + self.assertTrue(hasattr(on_shutdown, '_wampuris')) + self.assertTrue(type(on_shutdown._wampuris) == list) + self.assertEqual(len(on_shutdown._wampuris), 1) + self.assertIsInstance(on_shutdown._wampuris[0], Pattern) + self.assertFalse(on_shutdown._wampuris[0].is_endpoint()) + self.assertTrue(on_shutdown._wampuris[0].is_handler()) + self.assertFalse(on_shutdown._wampuris[0].is_exception()) + self.assertEqual(on_shutdown._wampuris[0].uri(), u"com.myapp.on_shutdown") + self.assertEqual(on_shutdown._wampuris[0]._type, Pattern.URI_TYPE_EXACT) + + @wamp.subscribe(u"com.myapp.product..on_update") + def on_product_update(product=None, label=None): + """Do nothing.""" + + self.assertTrue(hasattr(on_product_update, '_wampuris')) + self.assertTrue(type(on_product_update._wampuris) == list) + self.assertEqual(len(on_product_update._wampuris), 1) + self.assertIsInstance(on_product_update._wampuris[0], Pattern) + self.assertFalse(on_product_update._wampuris[0].is_endpoint()) + self.assertTrue(on_product_update._wampuris[0].is_handler()) + self.assertFalse(on_product_update._wampuris[0].is_exception()) + self.assertEqual(on_product_update._wampuris[0].uri(), u"com.myapp.product..on_update") + self.assertEqual(on_product_update._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.subscribe(u"com.myapp...on_update") + def on_update(category=None, cid=None, label=None): + """Do nothing.""" + + self.assertTrue(hasattr(on_update, '_wampuris')) + self.assertTrue(type(on_update._wampuris) == list) + self.assertEqual(len(on_update._wampuris), 1) + self.assertIsInstance(on_update._wampuris[0], Pattern) + self.assertFalse(on_update._wampuris[0].is_endpoint()) + self.assertTrue(on_update._wampuris[0].is_handler()) + self.assertFalse(on_update._wampuris[0].is_exception()) + self.assertEqual(on_update._wampuris[0].uri(), u"com.myapp...on_update") + self.assertEqual(on_update._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.subscribe(u"com.myapp.on.", + SubscribeOptions(match=u"wildcard", details_arg="details")) + def on_event(event=None, details=None): + """ Do nothing. """ + + self.assertTrue(hasattr(on_event, '_wampuris')) + self.assertTrue(type(on_event._wampuris) == list) + self.assertEqual(len(on_event._wampuris), 1) + self.assertIsInstance(on_event._wampuris[0], Pattern) + self.assertIsInstance(on_event._wampuris[0].options, SubscribeOptions) + self.assertEqual(on_event._wampuris[0].options.match, u"wildcard") + self.assertEqual(on_event._wampuris[0].options.details_arg, "details") + self.assertFalse(on_event._wampuris[0].is_endpoint()) + self.assertTrue(on_event._wampuris[0].is_handler()) + self.assertFalse(on_event._wampuris[0].is_exception()) + self.assertEqual(on_event._wampuris[0].uri(), u"com.myapp.on.") + self.assertEqual(on_event._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + def test_decorate_exception(self): + + @wamp.error(u"com.myapp.error") + class AppError(Exception): + """Do nothing.""" + + self.assertTrue(hasattr(AppError, '_wampuris')) + self.assertTrue(type(AppError._wampuris) == list) + self.assertEqual(len(AppError._wampuris), 1) + self.assertIsInstance(AppError._wampuris[0], Pattern) + self.assertFalse(AppError._wampuris[0].is_endpoint()) + self.assertFalse(AppError._wampuris[0].is_handler()) + self.assertTrue(AppError._wampuris[0].is_exception()) + self.assertEqual(AppError._wampuris[0].uri(), u"com.myapp.error") + self.assertEqual(AppError._wampuris[0]._type, Pattern.URI_TYPE_EXACT) + + @wamp.error(u"com.myapp.product..product_inactive") + class ProductInactiveError(Exception): + """Do nothing.""" + + self.assertTrue(hasattr(ProductInactiveError, '_wampuris')) + self.assertTrue(type(ProductInactiveError._wampuris) == list) + self.assertEqual(len(ProductInactiveError._wampuris), 1) + self.assertIsInstance(ProductInactiveError._wampuris[0], Pattern) + self.assertFalse(ProductInactiveError._wampuris[0].is_endpoint()) + self.assertFalse(ProductInactiveError._wampuris[0].is_handler()) + self.assertTrue(ProductInactiveError._wampuris[0].is_exception()) + self.assertEqual(ProductInactiveError._wampuris[0].uri(), u"com.myapp.product..product_inactive") + self.assertEqual(ProductInactiveError._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + @wamp.error(u"com.myapp...inactive") + class ObjectInactiveError(Exception): + """Do nothing.""" + + self.assertTrue(hasattr(ObjectInactiveError, '_wampuris')) + self.assertTrue(type(ObjectInactiveError._wampuris) == list) + self.assertEqual(len(ObjectInactiveError._wampuris), 1) + self.assertIsInstance(ObjectInactiveError._wampuris[0], Pattern) + self.assertFalse(ObjectInactiveError._wampuris[0].is_endpoint()) + self.assertFalse(ObjectInactiveError._wampuris[0].is_handler()) + self.assertTrue(ObjectInactiveError._wampuris[0].is_exception()) + self.assertEqual(ObjectInactiveError._wampuris[0].uri(), u"com.myapp...inactive") + self.assertEqual(ObjectInactiveError._wampuris[0]._type, Pattern.URI_TYPE_WILDCARD) + + def test_match_decorated_endpoint(self): + + @wamp.register(u"com.calculator.square") + def square(x): + return x + + args, kwargs = square._wampuris[0].match(u"com.calculator.square") + self.assertEqual(square(666, **kwargs), 666) + + @wamp.register(u"com.myapp.product..update") + def update_product(product=None, label=None): + return product, label + + args, kwargs = update_product._wampuris[0].match(u"com.myapp.product.123456.update") + kwargs['label'] = "foobar" + self.assertEqual(update_product(**kwargs), (123456, "foobar")) + + @wamp.register(u"com.myapp...update") + def update(category=None, cid=None, label=None): + return category, cid, label + + args, kwargs = update._wampuris[0].match(u"com.myapp.product.123456.update") + kwargs['label'] = "foobar" + self.assertEqual(update(**kwargs), ("product", 123456, "foobar")) + + def test_match_decorated_handler(self): + + @wamp.subscribe(u"com.myapp.on_shutdown") + def on_shutdown(): + pass + + args, kwargs = on_shutdown._wampuris[0].match(u"com.myapp.on_shutdown") + self.assertEqual(on_shutdown(**kwargs), None) + + @wamp.subscribe(u"com.myapp.product..on_update") + def on_product_update(product=None, label=None): + return product, label + + args, kwargs = on_product_update._wampuris[0].match(u"com.myapp.product.123456.on_update") + kwargs['label'] = "foobar" + self.assertEqual(on_product_update(**kwargs), (123456, "foobar")) + + @wamp.subscribe(u"com.myapp...on_update") + def on_update(category=None, cid=None, label=None): + return category, cid, label + + args, kwargs = on_update._wampuris[0].match(u"com.myapp.product.123456.on_update") + kwargs['label'] = "foobar" + self.assertEqual(on_update(**kwargs), ("product", 123456, "foobar")) + + def test_match_decorated_exception(self): + + @wamp.error(u"com.myapp.error") + class AppError(Exception): + + def __init__(self, msg): + Exception.__init__(self, msg) + + def __eq__(self, other): + return self.__class__ == other.__class__ and \ + self.args == other.args + + args, kwargs = AppError._wampuris[0].match(u"com.myapp.error") + # noinspection PyArgumentList + self.assertEqual(AppError(u"fuck", **kwargs), AppError(u"fuck")) + + @wamp.error(u"com.myapp.product..product_inactive") + class ProductInactiveError(Exception): + + def __init__(self, msg, product=None): + Exception.__init__(self, msg) + self.product = product + + def __eq__(self, other): + return self.__class__ == other.__class__ and \ + self.args == other.args and \ + self.product == other.product + + args, kwargs = ProductInactiveError._wampuris[0].match(u"com.myapp.product.123456.product_inactive") + self.assertEqual(ProductInactiveError("fuck", **kwargs), ProductInactiveError("fuck", 123456)) + + @wamp.error(u"com.myapp...inactive") + class ObjectInactiveError(Exception): + + def __init__(self, msg, category=None, product=None): + Exception.__init__(self, msg) + self.category = category + self.product = product + + def __eq__(self, other): + return self.__class__ == other.__class__ and \ + self.args == other.args and \ + self.category == other.category and \ + self.product == other.product + + args, kwargs = ObjectInactiveError._wampuris[0].match(u"com.myapp.product.123456.inactive") + self.assertEqual(ObjectInactiveError("fuck", **kwargs), ObjectInactiveError("fuck", "product", 123456)) + + +class KwException(Exception): + def __init__(self, *args, **kwargs): + Exception.__init__(self, *args) + self.kwargs = kwargs + +# what if the WAMP error message received +# contains args/kwargs that cannot be +# consumed by the constructor of the exception +# class defined for the WAMP error URI? + +# 1. we can bail out (but we are already signaling an error) +# 2. we can require a generic constructor +# 3. we can map only unconsumed args/kwargs to generic attributes +# 4. we can silently drop unconsumed args/kwargs + + +class MockSession(object): + + def __init__(self): + self._ecls_to_uri_pat = {} + self._uri_to_ecls = {} + + def define(self, exception, error=None): + if error is None: + assert(hasattr(exception, '_wampuris')) + self._ecls_to_uri_pat[exception] = exception._wampuris + self._uri_to_ecls[exception._wampuris[0].uri()] = exception + else: + assert(not hasattr(exception, '_wampuris')) + self._ecls_to_uri_pat[exception] = [Pattern(error, Pattern.URI_TARGET_HANDLER)] + self._uri_to_ecls[error] = exception + + def map_error(self, error, args=None, kwargs=None): + + # FIXME: + # 1. map to ecls based on error URI wildcard/prefix + # 2. extract additional args/kwargs from error URI + + if error in self._uri_to_ecls: + ecls = self._uri_to_ecls[error] + try: + # the following might fail, eg. TypeError when + # signature of exception constructor is incompatible + # with args/kwargs or when the exception constructor raises + if kwargs: + if args: + exc = ecls(*args, **kwargs) + else: + exc = ecls(**kwargs) + else: + if args: + exc = ecls(*args) + else: + exc = ecls() + except Exception: + # FIXME: log e + exc = KwException(error, *args, **kwargs) + else: + # this never fails + args = args or [] + kwargs = kwargs or {} + exc = KwException(error, *args, **kwargs) + return exc + + +class TestDecoratorsAdvanced(unittest.TestCase): + + def test_decorate_exception_non_exception(self): + + def test(): + # noinspection PyUnusedLocal + @wamp.error(u"com.test.error") + class Foo(object): + pass + + self.assertRaises(Exception, test) + + def test_decorate_endpoint_multiple(self): + + # noinspection PyUnusedLocal + @wamp.register(u"com.oldapp.oldproc") + @wamp.register(u"com.calculator.square") + def square(x): + """Do nothing.""" + + self.assertTrue(hasattr(square, '_wampuris')) + self.assertTrue(type(square._wampuris) == list) + self.assertEqual(len(square._wampuris), 2) + + for i in range(2): + self.assertIsInstance(square._wampuris[i], Pattern) + self.assertTrue(square._wampuris[i].is_endpoint()) + self.assertFalse(square._wampuris[i].is_handler()) + self.assertFalse(square._wampuris[i].is_exception()) + self.assertEqual(square._wampuris[i]._type, Pattern.URI_TYPE_EXACT) + + self.assertEqual(square._wampuris[0].uri(), u"com.calculator.square") + self.assertEqual(square._wampuris[1].uri(), u"com.oldapp.oldproc") + + def test_marshal_decorated_exception(self): + + @wamp.error(u"com.myapp.error") + class AppError(Exception): + pass + + try: + raise AppError("fuck") + except Exception as e: + self.assertEqual(e._wampuris[0].uri(), u"com.myapp.error") + + @wamp.error(u"com.myapp.product..product_inactive") + class ProductInactiveError(Exception): + + def __init__(self, msg, product=None): + Exception.__init__(self, msg) + self.product = product + + try: + raise ProductInactiveError("fuck", 123456) + except Exception as e: + self.assertEqual(e._wampuris[0].uri(), u"com.myapp.product..product_inactive") + + session = MockSession() + session.define(AppError) + + def test_define_exception_undecorated(self): + + session = MockSession() + + class AppError(Exception): + pass + + # defining an undecorated exception requires + # an URI to be provided + self.assertRaises(Exception, session.define, AppError) + + session.define(AppError, u"com.myapp.error") + + exc = session.map_error(u"com.myapp.error") + self.assertIsInstance(exc, AppError) + + def test_define_exception_decorated(self): + + session = MockSession() + + @wamp.error(u"com.myapp.error") + class AppError(Exception): + pass + + # when defining a decorated exception + # an URI must not be provided + self.assertRaises(Exception, session.define, AppError, u"com.myapp.error") + + session.define(AppError) + + exc = session.map_error(u"com.myapp.error") + self.assertIsInstance(exc, AppError) + + def test_map_exception_undefined(self): + + session = MockSession() + + exc = session.map_error(u"com.myapp.error") + self.assertIsInstance(exc, Exception) + + def test_map_exception_args(self): + + session = MockSession() + + @wamp.error(u"com.myapp.error") + class AppError(Exception): + pass + + @wamp.error(u"com.myapp.error.product_inactive") + class ProductInactiveError(Exception): + def __init__(self, product=None): + self.product = product + + # define exceptions in mock session + session.define(AppError) + session.define(ProductInactiveError) + + for test in [ + # (u"com.myapp.foo.error", [], {}, KwException), + (u"com.myapp.error", [], {}, AppError), + (u"com.myapp.error", ["you are doing it wrong"], {}, AppError), + (u"com.myapp.error", ["you are doing it wrong", 1, 2, 3], {}, AppError), + + (u"com.myapp.error.product_inactive", [], {}, ProductInactiveError), + (u"com.myapp.error.product_inactive", [], {"product": 123456}, ProductInactiveError), + ]: + error, args, kwargs, ecls = test + exc = session.map_error(error, args, kwargs) + + self.assertIsInstance(exc, ecls) + self.assertEqual(list(exc.args), args) diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/types.py b/venv/lib/python3.7/site-packages/autobahn/wamp/types.py new file mode 100644 index 0000000..04767c8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/types.py @@ -0,0 +1,1371 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import six + +from autobahn.util import public + +from autobahn.wamp.request import Subscription, Registration + + +__all__ = ( + 'ComponentConfig', + 'HelloReturn', + 'Accept', + 'Deny', + 'Challenge', + 'HelloDetails', + 'SessionDetails', + 'SessionIdent', + 'CloseDetails', + 'SubscribeOptions', + 'EventDetails', + 'PublishOptions', + 'RegisterOptions', + 'CallDetails', + 'CallOptions', + 'CallResult', + 'EncodedPayload' +) + + +@public +class ComponentConfig(object): + """ + WAMP application component configuration. An instance of this class is + provided to the constructor of :class:`autobahn.wamp.protocol.ApplicationSession`. + """ + + __slots__ = ( + 'realm', + 'extra', + 'keyring', + 'controller', + 'shared', + 'runner', + ) + + def __init__(self, realm=None, extra=None, keyring=None, controller=None, shared=None, runner=None): + """ + + :param realm: The realm the session would like to join or ``None`` to let the router + auto-decide the realm (if the router is configured and allowing to do so). + :type realm: str + + :param extra: Optional user-supplied object with extra configuration. + This can be any object you like, and is accessible in your + `ApplicationSession` subclass via `self.config.extra`. `dict` is + a good default choice. Important: if the component is to be hosted + by Crossbar.io, the supplied value must be JSON serializable. + :type extra: arbitrary + + :param keyring: A mapper from WAMP URIs to "from"/"to" Ed25519 keys. When using + WAMP end-to-end encryption, application payload is encrypted using a + symmetric message key, which in turn is encrypted using the "to" URI (topic being + published to or procedure being called) public key and the "from" URI + private key. In both cases, the key for the longest matching URI is used. + :type keyring: obj implementing IKeyRing or None + + :param controller: A WAMP ApplicationSession instance that holds a session to + a controlling entity. This optional feature needs to be supported by a WAMP + component hosting run-time. + :type controller: instance of ApplicationSession or None + + :param shared: A dict object to exchange user information or hold user objects shared + between components run under the same controlling entity. This optional feature + needs to be supported by a WAMP component hosting run-time. Use with caution, as using + this feature can introduce coupling between components. A valid use case would be + to hold a shared database connection pool. + :type shared: dict or None + + :param runner: Instance of ApplicationRunner when run under this. + :type runner: :class:`autobahn.twisted.wamp.ApplicationRunner` + """ + assert(realm is None or type(realm) == six.text_type) + # assert(keyring is None or ...) # FIXME + + self.realm = realm + self.extra = extra + self.keyring = keyring + self.controller = controller + self.shared = shared + self.runner = runner + + def __str__(self): + return u"ComponentConfig(realm=<{}>, extra={}, keyring={}, controller={}, shared={}, runner={})".format(self.realm, self.extra, self.keyring, self.controller, self.shared, self.runner) + + +@public +class HelloReturn(object): + """ + Base class for ``HELLO`` return information. + """ + + +@public +class Accept(HelloReturn): + """ + Information to accept a ``HELLO``. + """ + + __slots__ = ( + 'realm', + 'authid', + 'authrole', + 'authmethod', + 'authprovider', + 'authextra', + ) + + def __init__(self, realm=None, authid=None, authrole=None, authmethod=None, authprovider=None, authextra=None): + """ + + :param realm: The realm the client is joined to. + :type realm: str + + :param authid: The authentication ID the client is assigned, e.g. ``"joe"`` or ``"joe@example.com"``. + :type authid: str + + :param authrole: The authentication role the client is assigned, e.g. ``"anonymous"``, ``"user"`` or ``"com.myapp.user"``. + :type authrole: str + + :param authmethod: The authentication method that was used to authenticate the client, e.g. ``"cookie"`` or ``"wampcra"``. + :type authmethod: str + + :param authprovider: The authentication provider that was used to authenticate the client, e.g. ``"mozilla-persona"``. + :type authprovider: str + + :param authextra: Application-specific authextra to be forwarded to the client in `WELCOME.details.authextra`. + :type authextra: dict + """ + assert(realm is None or type(realm) == six.text_type) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authmethod is None or type(authmethod) == six.text_type) + assert(authprovider is None or type(authprovider) == six.text_type) + assert(authextra is None or type(authextra) == dict) + + self.realm = realm + self.authid = authid + self.authrole = authrole + self.authmethod = authmethod + self.authprovider = authprovider + self.authextra = authextra + + def __str__(self): + return u"Accept(realm=<{}>, authid=<{}>, authrole=<{}>, authmethod={}, authprovider={}, authextra={})".format(self.realm, self.authid, self.authrole, self.authmethod, self.authprovider, self.authextra) + + +@public +class Deny(HelloReturn): + """ + Information to deny a ``HELLO``. + """ + + __slots__ = ( + 'reason', + 'message', + ) + + def __init__(self, reason=u'wamp.error.not_authorized', message=None): + """ + + :param reason: The reason of denying the authentication (an URI, e.g. ``u'wamp.error.not_authorized'``) + :type reason: str + + :param message: A human readable message (for logging purposes). + :type message: str + """ + assert(type(reason) == six.text_type) + assert(message is None or type(message) == six.text_type) + + self.reason = reason + self.message = message + + def __str__(self): + return u"Deny(reason=<{}>, message='{}')".format(self.reason, self.message) + + +@public +class Challenge(HelloReturn): + """ + Information to challenge the client upon ``HELLO``. + """ + + __slots__ = ( + 'method', + 'extra', + ) + + def __init__(self, method, extra=None): + """ + + :param method: The authentication method for the challenge (e.g. ``"wampcra"``). + :type method: str + + :param extra: Any extra information for the authentication challenge. This is + specific to the authentication method. + :type extra: dict + """ + assert(type(method) == six.text_type) + assert(extra is None or type(extra) == dict) + + self.method = method + self.extra = extra or {} + + def __str__(self): + return u"Challenge(method={}, extra={})".format(self.method, self.extra) + + +@public +class HelloDetails(object): + """ + Provides details of a WAMP session while still attaching. + """ + + __slots__ = ( + 'realm', + 'authmethods', + 'authid', + 'authrole', + 'authextra', + 'session_roles', + 'pending_session', + 'resumable', + 'resume_session', + 'resume_token', + ) + + def __init__(self, realm=None, authmethods=None, authid=None, authrole=None, authextra=None, session_roles=None, pending_session=None, resumable=None, resume_session=None, resume_token=None): + """ + + :param realm: The realm the client wants to join. + :type realm: str or None + + :param authmethods: The authentication methods the client is willing to perform. + :type authmethods: list of str or None + + :param authid: The authid the client wants to authenticate as. + :type authid: str or None + + :param authrole: The authrole the client wants to authenticate as. + :type authrole: str or None + + :param authextra: Any extra information the specific authentication method requires the client to send. + :type authextra: arbitrary or None + + :param session_roles: The WAMP session roles and features by the connecting client. + :type session_roles: dict or None + + :param pending_session: The session ID the session will get once successfully attached. + :type pending_session: int or None + + :param resumable: + :type resumable: bool or None + + :param resume_session: The session the client would like to resume. + :type resume_session: int or None + + :param resume_token: The secure authorisation token to resume the session. + :type resume_token: str or None + """ + assert(realm is None or type(realm) == six.text_type) + assert(authmethods is None or (type(authmethods) == list and all(type(x) == six.text_type for x in authmethods))) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authextra is None or type(authextra) == dict) + # assert(session_roles is None or ...) # FIXME + assert(pending_session is None or type(pending_session) in six.integer_types) + assert(resumable is None or type(resumable) == bool) + assert(resume_session is None or type(resume_session) == int) + assert(resume_token is None or type(resume_token) == six.text_type) + + self.realm = realm + self.authmethods = authmethods + self.authid = authid + self.authrole = authrole + self.authextra = authextra + self.session_roles = session_roles + self.pending_session = pending_session + self.resumable = resumable + self.resume_session = resume_session + self.resume_token = resume_token + + def __str__(self): + return u"HelloDetails(realm=<{}>, authmethods={}, authid=<{}>, authrole=<{}>, authextra={}, session_roles={}, pending_session={}, resumable={}, resume_session={}, resume_token={})".format(self.realm, self.authmethods, self.authid, self.authrole, self.authextra, self.session_roles, self.pending_session, self.resumable, self.resume_session, self.resume_token) + + +@public +class SessionDetails(object): + """ + Provides details for a WAMP session upon open. + + .. seealso:: :func:`autobahn.wamp.interfaces.ISession.onJoin` + """ + + __slots__ = ( + 'realm', + 'session', + 'authid', + 'authrole', + 'authmethod', + 'authprovider', + 'authextra', + 'serializer', + 'resumed', + 'resumable', + 'resume_token', + ) + + def __init__(self, realm, session, authid=None, authrole=None, authmethod=None, authprovider=None, authextra=None, + serializer=None, resumed=None, resumable=None, resume_token=None): + """ + + :param realm: The realm this WAMP session is attached to. + :type realm: str + + :param session: WAMP session ID of this session. + :type session: int + + :param resumed: Whether the session is a resumed one. + :type resumed: bool or None + + :param resumable: Whether this session can be resumed later. + :type resumable: bool or None + + :param resume_token: The secure authorisation token to resume the session. + :type resume_token: str or None + """ + assert(type(realm) == six.text_type) + assert(type(session) in six.integer_types) + assert(authid is None or type(authid) == six.text_type) + assert(authrole is None or type(authrole) == six.text_type) + assert(authmethod is None or type(authmethod) == six.text_type) + assert(authprovider is None or type(authprovider) == six.text_type) + assert(authextra is None or type(authextra) == dict) + assert(serializer is None or type(serializer) == six.text_type) + assert(resumed is None or type(resumed) == bool) + assert(resumable is None or type(resumable) == bool) + assert(resume_token is None or type(resume_token) == six.text_type) + + self.realm = realm + self.session = session + self.authid = authid + self.authrole = authrole + self.authmethod = authmethod + self.authprovider = authprovider + self.authextra = authextra + self.serializer = serializer + self.resumed = resumed + self.resumable = resumable + self.resume_token = resume_token + + def marshal(self): + obj = { + u'realm': self.realm, + u'session': self.session, + u'authid': self.authid, + u'authrole': self.authrole, + u'authmethod': self.authmethod, + u'authprovider': self.authprovider, + u'authextra': self.authextra, + u'serializer': self.serializer, + u'resumed': self.resumed, + u'resumable': self.resumable, + u'resume_token': self.resume_token + } + return obj + + def __str__(self): + return u""" +SessionDetails(realm=<{}>, + session={}, + authid=<{}>, + authrole=<{}>, + authmethod={}, + authprovider={}, + authextra={}, + serializer=<{}>, + resumed={}, + resumable={}, + resume_token={})""".format(self.realm, self.session, self.authid, self.authrole, self.authmethod, self.authprovider, self.authextra, self.serializer, self.resumed, self.resumable, self.resume_token) + + +@public +class SessionIdent(object): + """ + WAMP session identification information. + + A WAMP session joined on a realm on a WAMP router is identified technically + by its session ID (``session``) already. + + The permissions the session has are tied to the WAMP authentication role (``authrole``). + + The subject behind the session, eg the user or the application component is identified + by the WAMP authentication ID (``authid``). One session is always authenticated under/as + one specific ``authid``, but a given ``authid`` might have zero, one or many sessions + joined on a router at the same time. + """ + + __slots__ = ( + 'session', + 'authid', + 'authrole', + ) + + def __init__(self, session=None, authid=None, authrole=None): + """ + + :param session: WAMP session ID of the session. + :type session: int + + :param authid: The WAMP authid of the session. + :type authid: str + + :param authrole: The WAMP authrole of the session. + :type authrole: str + """ + assert(session is None or type(session) in six.integer_types) + assert(authid is None or type(authid) == six.text_type) + assert(type(authrole) == six.text_type) + + self.session = session + self.authid = authid + self.authrole = authrole + + def __str__(self): + return u"SessionIdent(session={}, authid={}, authrole={})".format(self.session, self.authid, self.authrole) + + def marshal(self): + obj = { + u'session': self.session, + u'authid': self.authid, + u'authrole': self.authrole, + } + return obj + + @staticmethod + def from_calldetails(call_details): + """ + Create a new session identification object from the caller information + in the call details provided. + + :param call_details: Details of a WAMP call. + :type call_details: :class:`autobahn.wamp.types.CallDetails` + + :returns: New session identification object. + :rtype: :class:`autobahn.wamp.types.SessionIdent` + """ + assert isinstance(call_details, CallDetails) + + if call_details.forward_for: + caller = call_details.forward_for[0] + session_ident = SessionIdent(caller['session'], + caller['authid'], + caller['authrole']) + else: + session_ident = SessionIdent(call_details.caller, + call_details.caller_authid, + call_details.caller_authrole) + return session_ident + + @staticmethod + def from_eventdetails(event_details): + """ + Create a new session identification object from the publisher information + in the event details provided. + + :param event_details: Details of a WAMP event. + :type event_details: :class:`autobahn.wamp.types.EventDetails` + + :returns: New session identification object. + :rtype: :class:`autobahn.wamp.types.SessionIdent` + """ + assert isinstance(event_details, EventDetails) + + if event_details.forward_for: + publisher = event_details.forward_for[0] + session_ident = SessionIdent(publisher['session'], + publisher['authid'], + publisher['authrole']) + else: + session_ident = SessionIdent(event_details.publisher, + event_details.publisher_authid, + event_details.publisher_authrole) + return session_ident + + +@public +class CloseDetails(object): + """ + Provides details for a WAMP session upon close. + + .. seealso:: :func:`autobahn.wamp.interfaces.ISession.onLeave` + """ + REASON_DEFAULT = u"wamp.close.normal" + REASON_TRANSPORT_LOST = u"wamp.close.transport_lost" + + __slots__ = ( + 'reason', + 'message', + ) + + def __init__(self, reason=None, message=None): + """ + + :param reason: The close reason (an URI, e.g. ``wamp.close.normal``) + :type reason: str + + :param message: Closing log message. + :type message: str + """ + assert(reason is None or type(reason) == six.text_type) + assert(message is None or type(message) == six.text_type) + + self.reason = reason + self.message = message + + def marshal(self): + obj = { + u'reason': self.reason, + u'message': self.message + } + return obj + + def __str__(self): + return u"CloseDetails(reason=<{}>, message='{}')".format(self.reason, self.message) + + +@public +class SubscribeOptions(object): + """ + Used to provide options for subscribing in + :func:`autobahn.wamp.interfaces.ISubscriber.subscribe`. + """ + + __slots__ = ( + 'match', + 'details', + 'details_arg', + 'get_retained', + 'forward_for', + 'correlation_id', + 'correlation_uri', + 'correlation_is_anchor', + 'correlation_is_last', + ) + + def __init__(self, match=None, details=None, details_arg=None, forward_for=None, get_retained=None, + correlation_id=None, correlation_uri=None, correlation_is_anchor=None, + correlation_is_last=None): + """ + + :param match: The topic matching method to be used for the subscription. + :type match: str + + :param details: When invoking the handler, provide event details in a keyword + parameter ``details``. + :type details: bool + + :param details_arg: DEPCREATED (use "details" flag). When invoking the handler + provide event details in this keyword argument to the callable. + :type details_arg: str + + :param get_retained: Whether the client wants the retained message we may have along with the subscription. + :type get_retained: bool or None + """ + assert(match is None or (type(match) == six.text_type and match in [u'exact', u'prefix', u'wildcard'])) + assert(details is None or (type(details) == bool and details_arg is None)) + assert(details_arg is None or type(details_arg) == str) # yes, "str" is correct here, since this is about Python identifiers! + assert(get_retained is None or type(get_retained) is bool) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.match = match + + # FIXME: this is for backwards compat, but we'll deprecate it in the future + self.details = details + if details: + self.details_arg = 'details' + else: + self.details_arg = details_arg + + self.get_retained = get_retained + self.forward_for = forward_for + + self.correlation_id = correlation_id + self.correlation_uri = correlation_uri + self.correlation_is_anchor = correlation_is_anchor + self.correlation_is_last = correlation_is_last + + def message_attr(self): + """ + Returns options dict as sent within WAMP messages. + """ + options = {} + + if self.match is not None: + options[u'match'] = self.match + + if self.get_retained is not None: + options[u'get_retained'] = self.get_retained + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def __str__(self): + return u"SubscribeOptions(match={}, details={}, details_arg={}, get_retained={}, forward_for={})".format(self.match, self.details, self.details_arg, self.get_retained, self.forward_for) + + +@public +class EventDetails(object): + """ + Provides details on an event when calling an event handler + previously registered. + """ + + __slots__ = ( + 'subscription', + 'publication', + 'publisher', + 'publisher_authid', + 'publisher_authrole', + 'topic', + 'retained', + 'enc_algo', + 'forward_for', + ) + + def __init__(self, subscription, publication, publisher=None, publisher_authid=None, publisher_authrole=None, + topic=None, retained=None, enc_algo=None, forward_for=None): + """ + + :param subscription: The (client side) subscription object on which this event is delivered. + :type subscription: instance of :class:`autobahn.wamp.request.Subscription` + + :param publication: The publication ID of the event (always present). + :type publication: int + + :param publisher: The WAMP session ID of the original publisher of this event. + Only filled when publisher is disclosed. + :type publisher: None or int + + :param publisher_authid: The WAMP authid of the original publisher of this event. + Only filled when publisher is disclosed. + :type publisher_authid: str or None + + :param publisher_authrole: The WAMP authrole of the original publisher of this event. + Only filled when publisher is disclosed. + :type publisher_authrole: str or None + + :param topic: For pattern-based subscriptions, the actual topic URI being published to. + Only filled for pattern-based subscriptions. + :type topic: str or None + + :param retained: Whether the message was retained by the broker on the topic, rather than just published. + :type retained: bool or None + + :param enc_algo: Payload encryption algorithm that + was in use (currently, either ``None`` or ``u'cryptobox'``). + :type enc_algo: str or None + + :param forward_for: When this Event is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(isinstance(subscription, Subscription)) + assert(type(publication) in six.integer_types) + assert(publisher is None or type(publisher) in six.integer_types) + assert(publisher_authid is None or type(publisher_authid) == six.text_type) + assert(publisher_authrole is None or type(publisher_authrole) == six.text_type) + assert(topic is None or type(topic) == six.text_type) + assert(retained is None or type(retained) is bool) + assert(enc_algo is None or type(enc_algo) == six.text_type) + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.subscription = subscription + self.publication = publication + self.publisher = publisher + self.publisher_authid = publisher_authid + self.publisher_authrole = publisher_authrole + self.topic = topic + self.retained = retained + self.enc_algo = enc_algo + self.forward_for = forward_for + + def __str__(self): + return u"EventDetails(subscription={}, publication={}, publisher={}, publisher_authid={}, publisher_authrole={}, topic=<{}>, retained={}, enc_algo={}, forward_for={})".format(self.subscription, self.publication, self.publisher, self.publisher_authid, self.publisher_authrole, self.topic, self.retained, self.enc_algo, self.forward_for) + + +@public +class PublishOptions(object): + """ + Used to provide options for subscribing in + :func:`autobahn.wamp.interfaces.IPublisher.publish`. + """ + + __slots__ = ( + 'acknowledge', + 'exclude_me', + 'exclude', + 'exclude_authid', + 'exclude_authrole', + 'eligible', + 'eligible_authid', + 'eligible_authrole', + 'retain', + 'forward_for', + 'correlation_id', + 'correlation_uri', + 'correlation_is_anchor', + 'correlation_is_last', + ) + + def __init__(self, + acknowledge=None, + exclude_me=None, + exclude=None, + exclude_authid=None, + exclude_authrole=None, + eligible=None, + eligible_authid=None, + eligible_authrole=None, + retain=None, + forward_for=None, + correlation_id=None, + correlation_uri=None, + correlation_is_anchor=None, + correlation_is_last=None): + """ + + :param acknowledge: If ``True``, acknowledge the publication with a success or + error response. + :type acknowledge: bool + + :param exclude_me: If ``True``, exclude the publisher from receiving the event, even + if he is subscribed (and eligible). + :type exclude_me: bool or None + + :param exclude: A single WAMP session ID or a list thereof to exclude from receiving this event. + :type exclude: int or list of int or None + + :param exclude_authid: A single WAMP authid or a list thereof to exclude from receiving this event. + :type exclude_authid: str or list of str or None + + :param exclude_authrole: A single WAMP authrole or a list thereof to exclude from receiving this event. + :type exclude_authrole: list of str or None + + :param eligible: A single WAMP session ID or a list thereof eligible to receive this event. + :type eligible: int or list of int or None + + :param eligible_authid: A single WAMP authid or a list thereof eligible to receive this event. + :type eligible_authid: str or list of str or None + + :param eligible_authrole: A single WAMP authrole or a list thereof eligible to receive this event. + :type eligible_authrole: str or list of str or None + + :param retain: If ``True``, request the broker retain this event. + :type retain: bool or None + + :param forward_for: When this Event is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(acknowledge is None or type(acknowledge) == bool) + assert(exclude_me is None or type(exclude_me) == bool) + assert(exclude is None or type(exclude) in six.integer_types or (type(exclude) == list and all(type(x) in six.integer_types for x in exclude))) + assert(exclude_authid is None or type(exclude_authid) == six.text_type or (type(exclude_authid) == list and all(type(x) == six.text_type for x in exclude_authid))) + assert(exclude_authrole is None or type(exclude_authrole) == six.text_type or (type(exclude_authrole) == list and all(type(x) == six.text_type for x in exclude_authrole))) + assert(eligible is None or type(eligible) in six.integer_types or (type(eligible) == list and all(type(x) in six.integer_types for x in eligible))) + assert(eligible_authid is None or type(eligible_authid) == six.text_type or (type(eligible_authid) == list and all(type(x) == six.text_type for x in eligible_authid))) + assert(eligible_authrole is None or type(eligible_authrole) == six.text_type or (type(eligible_authrole) == list and all(type(x) == six.text_type for x in eligible_authrole))) + assert(retain is None or type(retain) == bool) + + assert(forward_for is None or type(forward_for) == list), 'forward_for, when present, must have list type - was {}'.format(type(forward_for)) + if forward_for: + for ff in forward_for: + assert type(ff) == dict, 'forward_for must be type dict - was {}'.format(type(ff)) + assert 'session' in ff, 'forward_for must have session attribute' + assert type(ff['session']) in six.integer_types, 'forward_for.session must have integer type - was {}'.format(type(ff['session'])) + assert 'authid' in ff, 'forward_for must have authid attributed' + assert type(ff['authid']) == six.text_type, 'forward_for.authid must have str type - was {}'.format(type(ff['authid'])) + assert 'authrole' in ff, 'forward_for must have authrole attribute' + assert type(ff['authrole']) == six.text_type, 'forward_for.authrole must have str type - was {}'.format(type(ff['authrole'])) + + self.acknowledge = acknowledge + self.exclude_me = exclude_me + self.exclude = exclude + self.exclude_authid = exclude_authid + self.exclude_authrole = exclude_authrole + self.eligible = eligible + self.eligible_authid = eligible_authid + self.eligible_authrole = eligible_authrole + self.retain = retain + self.forward_for = forward_for + + self.correlation_id = correlation_id + self.correlation_uri = correlation_uri + self.correlation_is_anchor = correlation_is_anchor + self.correlation_is_last = correlation_is_last + + def message_attr(self): + """ + Returns options dict as sent within WAMP messages. + """ + options = {} + + if self.acknowledge is not None: + options[u'acknowledge'] = self.acknowledge + + if self.exclude_me is not None: + options[u'exclude_me'] = self.exclude_me + + if self.exclude is not None: + options[u'exclude'] = self.exclude if type(self.exclude) == list else [self.exclude] + + if self.exclude_authid is not None: + options[u'exclude_authid'] = self.exclude_authid if type(self.exclude_authid) == list else [self.exclude_authid] + + if self.exclude_authrole is not None: + options[u'exclude_authrole'] = self.exclude_authrole if type(self.exclude_authrole) == list else [self.exclude_authrole] + + if self.eligible is not None: + options[u'eligible'] = self.eligible if type(self.eligible) == list else [self.eligible] + + if self.eligible_authid is not None: + options[u'eligible_authid'] = self.eligible_authid if type(self.eligible_authid) == list else [self.eligible_authid] + + if self.eligible_authrole is not None: + options[u'eligible_authrole'] = self.eligible_authrole if type(self.eligible_authrole) == list else [self.eligible_authrole] + + if self.retain is not None: + options[u'retain'] = self.retain + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def __str__(self): + return u"PublishOptions(acknowledge={}, exclude_me={}, exclude={}, exclude_authid={}, exclude_authrole={}, eligible={}, eligible_authid={}, eligible_authrole={}, retain={}, forward_for={})".format(self.acknowledge, self.exclude_me, self.exclude, self.exclude_authid, self.exclude_authrole, self.eligible, self.eligible_authid, self.eligible_authrole, self.retain, self.forward_for) + + +@public +class RegisterOptions(object): + """ + Used to provide options for registering in + :func:`autobahn.wamp.interfaces.ICallee.register`. + """ + + __slots__ = ( + 'match', + 'invoke', + 'concurrency', + 'force_reregister', + 'forward_for', + 'details', + 'details_arg', + 'correlation_id', + 'correlation_uri', + 'correlation_is_anchor', + 'correlation_is_last', + ) + + def __init__(self, match=None, invoke=None, concurrency=None, force_reregister=None, forward_for=None, + details=None, details_arg=None, correlation_id=None, correlation_uri=None, + correlation_is_anchor=None, correlation_is_last=None): + """ + :param match: Type of matching to use on the URI (`exact`, `prefix` or `wildcard`) + + :param invoke: Type of invoke mechanism to use (`single`, `first`, `last`, `roundrobin`, `random`) + + :param concurrency: if used, the number of times a particular + endpoint may be called concurrently (e.g. if this is 3, and + there are already 3 calls in-progress a 4th call will receive + an error) + + :param details_arg: When invoking the endpoint, provide call details + in this keyword argument to the callable. + :type details_arg: str + + :param details: When invoking the endpoint, provide call details in a keyword + parameter ``details``. + :type details: bool + + :param details_arg: DEPCREATED (use "details" flag). When invoking the endpoint, + provide call details in this keyword argument to the callable. + :type details_arg: str + + :param force_reregister: if True, any other session that has + already registered this URI will be 'kicked out' and this + session will become the one that's registered (the previous + session must have used `force_reregister=True` as well) + :type force_reregister: bool + + :param forward_for: When this Register is forwarded over a router-to-router link, + or via an intermediary router. + :type forward_for: list[dict] + """ + assert(match is None or (type(match) == six.text_type and match in [u'exact', u'prefix', u'wildcard'])) + assert(invoke is None or (type(invoke) == six.text_type and invoke in [u'single', u'first', u'last', u'roundrobin', u'random'])) + assert(concurrency is None or (type(concurrency) in six.integer_types and concurrency > 0)) + assert(details is None or (type(details) == bool and details_arg is None)) + assert(details_arg is None or type(details_arg) == str) # yes, "str" is correct here, since this is about Python identifiers! + assert force_reregister in [None, True, False] + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.match = match + self.invoke = invoke + self.concurrency = concurrency + self.force_reregister = force_reregister + self.forward_for = forward_for + + # FIXME: this is for backwards compat, but we'll deprecate it in the future + self.details = details + if details: + self.details_arg = 'details' + else: + self.details_arg = details_arg + + self.correlation_id = correlation_id + self.correlation_uri = correlation_uri + self.correlation_is_anchor = correlation_is_anchor + self.correlation_is_last = correlation_is_last + + def message_attr(self): + """ + Returns options dict as sent within WAMP messages. + """ + options = {} + + if self.match is not None: + options[u'match'] = self.match + + if self.invoke is not None: + options[u'invoke'] = self.invoke + + if self.concurrency is not None: + options[u'concurrency'] = self.concurrency + + if self.force_reregister is not None: + options[u'force_reregister'] = self.force_reregister + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + return options + + def __str__(self): + return u"RegisterOptions(match={}, invoke={}, concurrency={}, details={}, details_arg={}, force_reregister={}, forward_for={})".format(self.match, self.invoke, self.concurrency, self.details, self.details_arg, self.force_reregister, self.forward_for) + + +@public +class CallDetails(object): + """ + Provides details on a call when an endpoint previously + registered is being called and opted to receive call details. + """ + + __slots__ = ( + 'registration', + 'progress', + 'caller', + 'caller_authid', + 'caller_authrole', + 'procedure', + 'enc_algo', + 'forward_for', + ) + + def __init__(self, registration, progress=None, caller=None, caller_authid=None, + caller_authrole=None, procedure=None, enc_algo=None, forward_for=None): + """ + + :param registration: The (client side) registration object this invocation is delivered on. + :type registration: instance of :class:`autobahn.wamp.request.Registration` + + :param progress: A callable that will receive progressive call results. + :type progress: callable or None + + :param caller: The WAMP session ID of the caller, if the latter is disclosed. + Only filled when caller is disclosed. + :type caller: int or None + + :param caller_authid: The WAMP authid of the original caller of this event. + Only filled when caller is disclosed. + :type caller_authid: str or None + + :param caller_authrole: The WAMP authrole of the original caller of this event. + Only filled when caller is disclosed. + :type caller_authrole: str or None + + :param procedure: For pattern-based registrations, the actual procedure URI being called. + :type procedure: str or None + + :param enc_algo: Payload encryption algorithm that + was in use (currently, either `None` or `"cryptobox"`). + :type enc_algo: str or None + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(isinstance(registration, Registration)) + assert(progress is None or callable(progress)) + assert(caller is None or type(caller) in six.integer_types) + assert(caller_authid is None or type(caller_authid) == six.text_type) + assert(caller_authrole is None or type(caller_authrole) == six.text_type) + assert(procedure is None or type(procedure) == six.text_type) + assert(enc_algo is None or type(enc_algo) == six.text_type) + + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.registration = registration + self.progress = progress + self.caller = caller + self.caller_authid = caller_authid + self.caller_authrole = caller_authrole + self.procedure = procedure + self.enc_algo = enc_algo + self.forward_for = forward_for + + def __str__(self): + return u"CallDetails(registration={}, progress={}, caller={}, caller_authid={}, caller_authrole={}, procedure=<{}>, enc_algo={}, forward_for={})".format(self.registration, self.progress, self.caller, self.caller_authid, self.caller_authrole, self.procedure, self.enc_algo, self.forward_for) + + +@public +class CallOptions(object): + """ + Used to provide options for calling with :func:`autobahn.wamp.interfaces.ICaller.call`. + """ + + __slots__ = ( + 'on_progress', + 'timeout', + 'caller', + 'caller_authid', + 'caller_authrole', + 'forward_for', + 'correlation_id', + 'correlation_uri', + 'correlation_is_anchor', + 'correlation_is_last', + 'details', + ) + + def __init__(self, + on_progress=None, + timeout=None, + caller=None, + caller_authid=None, + caller_authrole=None, + forward_for=None, + correlation_id=None, + correlation_uri=None, + correlation_is_anchor=None, + correlation_is_last=None, + details=None): + """ + + :param on_progress: A callback that will be called when the remote endpoint + called yields interim call progress results. + :type on_progress: callable + + :param timeout: Time in seconds after which the call should be automatically canceled. + :type timeout: float + + :param forward_for: When this Call is forwarded for a client (or from an intermediary router). + :type forward_for: list[dict] + """ + assert(on_progress is None or callable(on_progress)) + assert(timeout is None or (type(timeout) in list(six.integer_types) + [float] and timeout > 0)) + assert(details is None or type(details) == bool) + assert(caller is None or type(caller) in six.integer_types) + assert(caller_authid is None or type(caller_authid) == six.text_type) + assert(caller_authrole is None or type(caller_authrole) == six.text_type) + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.on_progress = on_progress + self.timeout = timeout + + self.caller = caller + self.caller_authid = caller_authid + self.caller_authrole = caller_authrole + self.forward_for = forward_for + + self.details = details + self.correlation_id = correlation_id + self.correlation_uri = correlation_uri + self.correlation_is_anchor = correlation_is_anchor + self.correlation_is_last = correlation_is_last + + def message_attr(self): + """ + Returns options dict as sent within WAMP messages. + """ + options = {} + + # note: only some attributes are actually forwarded to the WAMP CALL message, while + # other attributes are for client-side/client-internal use only + + if self.timeout is not None: + options[u'timeout'] = self.timeout + + if self.on_progress is not None: + options[u'receive_progress'] = True + + if self.forward_for is not None: + options[u'forward_for'] = self.forward_for + + if self.caller is not None: + options[u'caller'] = self.caller + + if self.caller_authid is not None: + options[u'caller_authid'] = self.caller_authid + + if self.caller_authrole is not None: + options[u'caller_authrole'] = self.caller_authrole + + return options + + def __str__(self): + return u"CallOptions(on_progress={}, timeout={}, caller={}, caller_authid={}, caller_authrole={}, forward_for={}, details={})".format(self.on_progress, self.timeout, self.caller, self.caller_authid, self.caller_authrole, self.forward_for, self.details) + + +@public +class CallResult(object): + """ + Wrapper for remote procedure call results that contain multiple positional + return values or keyword-based return values. + """ + + __slots__ = ( + 'results', + 'kwresults', + 'enc_algo', + 'callee', + 'callee_authid', + 'callee_authrole', + 'forward_for', + ) + + def __init__(self, *results, **kwresults): + """ + + :param results: The positional result values. + :type results: list + + :param kwresults: The keyword result values. + :type kwresults: dict + """ + enc_algo = kwresults.pop('enc_algo', None) + assert(enc_algo is None or type(enc_algo) == six.text_type) + + callee = kwresults.pop('callee', None) + callee_authid = kwresults.pop('callee_authid', None) + callee_authrole = kwresults.pop('callee_authrole', None) + + assert callee is None or type(callee) in six.integer_types + assert callee_authid is None or type(callee_authid) == six.text_type + assert callee_authrole is None or type(callee_authrole) == six.text_type + + forward_for = kwresults.pop('forward_for', None) + assert(forward_for is None or type(forward_for) == list) + if forward_for: + for ff in forward_for: + assert type(ff) == dict + assert 'session' in ff and type(ff['session']) in six.integer_types + assert 'authid' in ff and (ff['authid'] is None or type(ff['authid']) == six.text_type) + assert 'authrole' in ff and type(ff['authrole']) == six.text_type + + self.enc_algo = enc_algo + self.callee = callee + self.callee_authid = callee_authid + self.callee_authrole = callee_authrole + self.forward_for = forward_for + self.results = results + self.kwresults = kwresults + + def __str__(self): + return u"CallResult(results={}, kwresults={}, enc_algo={}, callee={}, callee_authid={}, callee_authrole={}, forward_for={})".format(self.results, self.kwresults, self.enc_algo, self.callee, self.callee_authid, self.callee_authrole, self.forward_for) + + +@public +class EncodedPayload(object): + """ + Wrapper holding an encoded application payload when using WAMP payload transparency. + """ + + __slots__ = ( + 'payload', + 'enc_algo', + 'enc_serializer', + 'enc_key' + ) + + def __init__(self, payload, enc_algo, enc_serializer=None, enc_key=None): + """ + + :param payload: The encoded application payload. + :type payload: bytes + + :param enc_algo: The payload transparency algorithm identifier to check. + :type enc_algo: str + + :param enc_serializer: The payload transparency serializer identifier to check. + :type enc_serializer: str + + :param enc_key: If using payload transparency with an encryption algorithm, the payload encryption key. + :type enc_key: str or None + """ + assert(type(payload) == six.binary_type) + assert(type(enc_algo) == six.text_type) + assert(enc_serializer is None or type(enc_serializer) == six.text_type) + assert(enc_key is None or type(enc_key) == six.text_type) + + self.payload = payload + self.enc_algo = enc_algo + self.enc_serializer = enc_serializer + self.enc_key = enc_key + + +class IPublication(object): + """ + Represents a publication of an event. This is used with acknowledged publications. + """ + + def id(self): + """ + The WAMP publication ID for this publication. + """ + + +class ISubscription(object): + """ + Represents a subscription to a topic. + """ + + def id(self): + """ + The WAMP subscription ID for this subscription. + """ + + def active(self): + """ + Flag indicating if subscription is active. + """ + + def unsubscribe(self): + """ + Unsubscribe this subscription that was previously created from + :func:`autobahn.wamp.interfaces.ISubscriber.subscribe`. + + After a subscription has been unsubscribed successfully, no events + will be routed to the event handler anymore. + + Returns an instance of :tx:`twisted.internet.defer.Deferred` (when + running on **Twisted**) or an instance of :py:class:`asyncio.Future` + (when running on **asyncio**). + + - If the unsubscription succeeds, the returned Deferred/Future will + *resolve* (with no return value). + + - If the unsubscription fails, the returned Deferred/Future will *reject* + with an instance of :class:`autobahn.wamp.exception.ApplicationError`. + + :returns: A Deferred/Future for the unsubscription + :rtype: instance(s) of :tx:`twisted.internet.defer.Deferred` / :py:class:`asyncio.Future` + """ + + +class IRegistration(object): + """ + Represents a registration of an endpoint. + """ + + def id(self): + """ + The WAMP registration ID for this registration. + """ + + def active(self): + """ + Flag indicating if registration is active. + """ + + def unregister(self): + """ + Unregister this registration that was previously created from + :func:`autobahn.wamp.interfaces.ICallee.register`. + + After a registration has been unregistered successfully, no calls + will be routed to the endpoint anymore. + + Returns an instance of :tx:`twisted.internet.defer.Deferred` (when + running on **Twisted**) or an instance of :py:class:`asyncio.Future` + (when running on **asyncio**). + + - If the unregistration succeeds, the returned Deferred/Future will + *resolve* (with no return value). + + - If the unregistration fails, the returned Deferred/Future will be rejected + with an instance of :class:`autobahn.wamp.exception.ApplicationError`. + + :returns: A Deferred/Future for the unregistration + :rtype: instance(s) of :tx:`twisted.internet.defer.Deferred` / :py:class:`asyncio.Future` + """ diff --git a/venv/lib/python3.7/site-packages/autobahn/wamp/websocket.py b/venv/lib/python3.7/site-packages/autobahn/wamp/websocket.py new file mode 100644 index 0000000..aab1ed7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/wamp/websocket.py @@ -0,0 +1,296 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import traceback + +from autobahn.websocket import protocol +from autobahn.websocket.types import ConnectionDeny +from autobahn.wamp.interfaces import ITransport +from autobahn.wamp.exception import ProtocolError, SerializationError, TransportLost + +__all__ = ('WampWebSocketServerProtocol', + 'WampWebSocketClientProtocol', + 'WampWebSocketServerFactory', + 'WampWebSocketClientFactory') + + +class WampWebSocketProtocol(object): + """ + Base class for WAMP-over-WebSocket transport mixins. + """ + + _session = None # default; self.session is set in onOpen + + def _bailout(self, code, reason=None): + self.log.debug('Failing WAMP-over-WebSocket transport: code={code}, reason="{reason}"', code=code, reason=reason) + self._fail_connection(code, reason) + + def onOpen(self): + """ + Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onOpen` + """ + # WebSocket connection established. Now let the user WAMP session factory + # create a new WAMP session and fire off session open callback. + try: + self._session = self.factory._factory() + self._session.onOpen(self) + except Exception as e: + self.log.critical("{tb}", tb=traceback.format_exc()) + reason = u'WAMP Internal Error ({0})'.format(e) + self._bailout(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_INTERNAL_ERROR, reason=reason) + + def onClose(self, wasClean, code, reason): + """ + Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onClose` + """ + # WAMP session might never have been established in the first place .. guard this! + self._onclose_reason = reason + if self._session is not None: + # WebSocket connection lost - fire off the WAMP + # session close callback + # noinspection PyBroadException + try: + self.log.debug('WAMP-over-WebSocket transport lost: wasClean={wasClean}, code={code}, reason="{reason}"', wasClean=wasClean, code=code, reason=reason) + self._session.onClose(wasClean) + except Exception: + self.log.critical("{tb}", tb=traceback.format_exc()) + self._session = None + + def onMessage(self, payload, isBinary): + """ + Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onMessage` + """ + try: + for msg in self._serializer.unserialize(payload, isBinary): + self.log.trace( + "WAMP RECV: message={message}, session={session}, authid={authid}", + authid=self._session._authid, + session=self._session._session_id, + message=msg, + ) + self._session.onMessage(msg) + + except ProtocolError as e: + self.log.critical("{tb}", tb=traceback.format_exc()) + reason = u'WAMP Protocol Error ({0})'.format(e) + self._bailout(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_PROTOCOL_ERROR, reason=reason) + + except Exception as e: + self.log.critical("{tb}", tb=traceback.format_exc()) + reason = u'WAMP Internal Error ({0})'.format(e) + self._bailout(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_INTERNAL_ERROR, reason=reason) + + def send(self, msg): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.send` + """ + if self.isOpen(): + try: + self.log.trace( + "WAMP SEND: message={message}, session={session}, authid={authid}", + authid=self._session._authid, + session=self._session._session_id, + message=msg, + ) + payload, isBinary = self._serializer.serialize(msg) + except Exception as e: + self.log.error("WAMP message serialization error: {}".format(e)) + # all exceptions raised from above should be serialization errors .. + raise SerializationError(u"WAMP message serialization error: {0}".format(e)) + else: + self.sendMessage(payload, isBinary) + else: + raise TransportLost() + + def isOpen(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen` + """ + return self._session is not None + + def close(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.close` + """ + if self.isOpen(): + self.sendClose(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_NORMAL) + else: + raise TransportLost() + + def abort(self): + """ + Implements :func:`autobahn.wamp.interfaces.ITransport.abort` + """ + if self.isOpen(): + self._bailout(protocol.WebSocketProtocol.CLOSE_STATUS_CODE_GOING_AWAY) + else: + raise TransportLost() + + +ITransport.register(WampWebSocketProtocol) + + +def parseSubprotocolIdentifier(subprotocol): + try: + s = subprotocol.split(u'.') + if s[0] != u'wamp': + raise Exception(u'WAMP WebSocket subprotocol identifier must start with "wamp", not "{}"'.format(s[0])) + version = int(s[1]) + serializerId = u'.'.join(s[2:]) + return version, serializerId + except: + return None, None + + +class WampWebSocketServerProtocol(WampWebSocketProtocol): + """ + Mixin for WAMP-over-WebSocket server transports. + """ + + STRICT_PROTOCOL_NEGOTIATION = True + + def onConnect(self, request): + """ + Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onConnect` + """ + headers = {} + for subprotocol in request.protocols: + version, serializerId = parseSubprotocolIdentifier(subprotocol) + if version == 2 and serializerId in self.factory._serializers.keys(): + self._serializer = self.factory._serializers[serializerId] + return subprotocol, headers + + if self.STRICT_PROTOCOL_NEGOTIATION: + raise ConnectionDeny(ConnectionDeny.BAD_REQUEST, u'This server only speaks WebSocket subprotocols {}'.format(u', '.join(self.factory.protocols))) + else: + # assume wamp.2.json + self._serializer = self.factory._serializers[u'json'] + return None, headers + + +class WampWebSocketClientProtocol(WampWebSocketProtocol): + """ + Mixin for WAMP-over-WebSocket client transports. + """ + + STRICT_PROTOCOL_NEGOTIATION = True + + def onConnect(self, response): + """ + Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onConnect` + """ + if response.protocol not in self.factory.protocols: + if self.STRICT_PROTOCOL_NEGOTIATION: + raise Exception(u'The server does not speak any of the WebSocket subprotocols {} we requested.'.format(u', '.join(self.factory.protocols))) + else: + # assume wamp.2.json + serializerId = u'json' + else: + version, serializerId = parseSubprotocolIdentifier(response.protocol) + + self._serializer = self.factory._serializers[serializerId] + + +class WampWebSocketFactory(object): + """ + Base class for WAMP-over-WebSocket transport factory mixins. + """ + + def __init__(self, factory, serializers=None): + """ + Ctor. + + :param factory: A callable that produces instances that implement + :class:`autobahn.wamp.interfaces.ITransportHandler` + :type factory: callable + + :param serializers: A list of WAMP serializers to use (or None for default + serializers). Serializers must implement + :class:`autobahn.wamp.interfaces.ISerializer`. + :type serializers: list + """ + if callable(factory): + self._factory = factory + else: + self._factory = lambda: factory + + if serializers is None: + serializers = [] + + # try CBOR WAMP serializer + try: + from autobahn.wamp.serializer import CBORSerializer + serializers.append(CBORSerializer(batched=True)) + serializers.append(CBORSerializer()) + except ImportError: + pass + + # try MsgPack WAMP serializer + try: + from autobahn.wamp.serializer import MsgPackSerializer + serializers.append(MsgPackSerializer(batched=True)) + serializers.append(MsgPackSerializer()) + except ImportError: + pass + + # try UBJSON WAMP serializer + try: + from autobahn.wamp.serializer import UBJSONSerializer + serializers.append(UBJSONSerializer(batched=True)) + serializers.append(UBJSONSerializer()) + except ImportError: + pass + + # try JSON WAMP serializer + try: + from autobahn.wamp.serializer import JsonSerializer + serializers.append(JsonSerializer(batched=True)) + serializers.append(JsonSerializer()) + except ImportError: + pass + + if not serializers: + raise Exception(u'Could not import any WAMP serializer') + + self._serializers = {} + for ser in serializers: + self._serializers[ser.SERIALIZER_ID] = ser + + self._protocols = [u'wamp.2.{}'.format(ser.SERIALIZER_ID) for ser in serializers] + + +class WampWebSocketServerFactory(WampWebSocketFactory): + """ + Mixin for WAMP-over-WebSocket server transport factories. + """ + + +class WampWebSocketClientFactory(WampWebSocketFactory): + """ + Mixin for WAMP-over-WebSocket client transport factories. + """ diff --git a/venv/lib/python3.7/site-packages/autobahn/websocket/compress_bzip2.py b/venv/lib/python3.7/site-packages/autobahn/websocket/compress_bzip2.py new file mode 100644 index 0000000..63fe271 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/websocket/compress_bzip2.py @@ -0,0 +1,448 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import bz2 + +from autobahn.websocket.compress_base import PerMessageCompressOffer, \ + PerMessageCompressOfferAccept, \ + PerMessageCompressResponse, \ + PerMessageCompressResponseAccept, \ + PerMessageCompress + +__all__ = ( + 'PerMessageBzip2Mixin', + 'PerMessageBzip2Offer', + 'PerMessageBzip2OfferAccept', + 'PerMessageBzip2Response', + 'PerMessageBzip2ResponseAccept', + 'PerMessageBzip2', +) + + +class PerMessageBzip2Mixin(object): + """ + Mixin class for this extension. + """ + + EXTENSION_NAME = "permessage-bzip2" + """ + Name of this WebSocket extension. + """ + + COMPRESS_LEVEL_PERMISSIBLE_VALUES = [1, 2, 3, 4, 5, 6, 7, 8, 9] + """ + Permissible value for compression level parameter. + """ + + +class PerMessageBzip2Offer(PerMessageCompressOffer, PerMessageBzip2Mixin): + """ + Set of extension parameters for `permessage-bzip2` WebSocket extension + offered by a client to a server. + """ + + @classmethod + def parse(cls, params): + """ + Parses a WebSocket extension offer for `permessage-bzip2` provided by a client to a server. + + :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`. + :type params: list + + :returns: object -- A new instance of :class:`autobahn.compress.PerMessageBzip2Offer`. + """ + # extension parameter defaults + accept_max_compress_level = False + request_max_compress_level = 0 + + # verify/parse client ("client-to-server direction") parameters of permessage-bzip2 offer + for p in params: + + if len(params[p]) > 1: + raise Exception("multiple occurrence of extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + val = params[p][0] + + if p == 'client_max_compress_level': + # noinspection PySimplifyBooleanCheck + if val is not True: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + accept_max_compress_level = True + + elif p == 'server_max_compress_level': + try: + val = int(val) + except: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + if val not in PerMessageBzip2Mixin.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + request_max_compress_level = val + + else: + raise Exception("illegal extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + offer = cls(accept_max_compress_level, + request_max_compress_level) + return offer + + def __init__(self, + accept_max_compress_level=True, + request_max_compress_level=0): + """ + Constructor. + + :param accept_max_compress_level: Iff true, client accepts "maximum compression level" parameter. + :type accept_max_compress_level: bool + :param request_max_compress_level: Iff non-zero, client requests given "maximum compression level" - must be 1-9. + :type request_max_compress_level: int + """ + if type(accept_max_compress_level) != bool: + raise Exception("invalid type %s for accept_max_compress_level" % type(accept_max_compress_level)) + + self.accept_max_compress_level = accept_max_compress_level + + if request_max_compress_level != 0 and request_max_compress_level not in self.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("invalid value %s for request_max_compress_level - permissible values %s" % (request_max_compress_level, self.COMPRESS_LEVEL_PERMISSIBLE_VALUES)) + + self.request_max_compress_level = request_max_compress_level + + def get_extension_string(self): + """ + Returns the WebSocket extension configuration string as sent to the server. + + :returns: PMCE configuration string. + :rtype: str + """ + pmce_string = self.EXTENSION_NAME + if self.accept_max_compress_level: + pmce_string += "; client_max_compress_level" + if self.request_max_compress_level != 0: + pmce_string += "; server_max_compress_level=%d" % self.request_max_compress_level + return pmce_string + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'accept_max_compress_level': self.accept_max_compress_level, + 'request_max_compress_level': self.request_max_compress_level} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageBzip2Offer(accept_max_compress_level = %s, request_max_compress_level = %s)" % (self.accept_max_compress_level, self.request_max_compress_level) + + +class PerMessageBzip2OfferAccept(PerMessageCompressOfferAccept, PerMessageBzip2Mixin): + """ + Set of parameters with which to accept an `permessage-bzip2` offer + from a client by a server. + """ + + def __init__(self, + offer, + request_max_compress_level=0, + compress_level=None): + """ + Constructor. + + :param offer: The offer being accepted. + :type offer: Instance of :class:`autobahn.compress.PerMessageBzip2Offer`. + :param request_max_compress_level: Iff non-zero, server requests given "maximum compression level" - must be 1-9. + :type request_max_compress_level: int + :param compress_level: Override server ("server-to-client direction") compress level (this must be compatible with offer). + :type compress_level: int + """ + if not isinstance(offer, PerMessageBzip2Offer): + raise Exception("invalid type %s for offer" % type(offer)) + + self.offer = offer + + if request_max_compress_level != 0 and request_max_compress_level not in self.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("invalid value %s for request_max_compress_level - permissible values %s" % (request_max_compress_level, self.COMPRESS_LEVEL_PERMISSIBLE_VALUES)) + + if request_max_compress_level != 0 and not offer.accept_max_compress_level: + raise Exception("invalid value %s for request_max_compress_level - feature unsupported by client" % request_max_compress_level) + + self.request_max_compress_level = request_max_compress_level + + if compress_level is not None: + if compress_level not in self.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("invalid value %s for compress_level - permissible values %s" % (compress_level, self.COMPRESS_LEVEL_PERMISSIBLE_VALUES)) + + if offer.request_max_compress_level != 0 and compress_level > offer.request_max_compress_level: + raise Exception("invalid value %s for compress_level - client requested lower maximum value" % compress_level) + + self.compress_level = compress_level + + def get_extension_string(self): + """ + Returns the WebSocket extension configuration string as sent to the server. + + :returns: PMCE configuration string. + :rtype: str + """ + pmce_string = self.EXTENSION_NAME + if self.offer.request_max_compress_level != 0: + pmce_string += "; server_max_compress_level=%d" % self.offer.request_max_compress_level + if self.request_max_compress_level != 0: + pmce_string += "; client_max_compress_level=%d" % self.request_max_compress_level + return pmce_string + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'offer': self.offer.__json__(), + 'request_max_compress_level': self.request_max_compress_level, + 'compress_level': self.compress_level} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageBzip2Accept(offer = %s, request_max_compress_level = %s, compress_level = %s)" % (self.offer.__repr__(), self.request_max_compress_level, self.compress_level) + + +class PerMessageBzip2Response(PerMessageCompressResponse, PerMessageBzip2Mixin): + """ + Set of parameters for `permessage-bzip2` responded by server. + """ + + @classmethod + def parse(cls, params): + """ + Parses a WebSocket extension response for `permessage-bzip2` provided by a server to a client. + + :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`. + :type params: list + + :returns: A new instance of :class:`autobahn.compress.PerMessageBzip2Response`. + :rtype: obj + """ + client_max_compress_level = 0 + server_max_compress_level = 0 + + for p in params: + + if len(params[p]) > 1: + raise Exception("multiple occurrence of extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + val = params[p][0] + + if p == 'client_max_compress_level': + try: + val = int(val) + except: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + if val not in PerMessageBzip2Mixin.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + client_max_compress_level = val + + elif p == 'server_max_compress_level': + try: + val = int(val) + except: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + if val not in PerMessageBzip2Mixin.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + server_max_compress_level = val + + else: + raise Exception("illegal extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + response = cls(client_max_compress_level, + server_max_compress_level) + return response + + def __init__(self, + client_max_compress_level, + server_max_compress_level): + self.client_max_compress_level = client_max_compress_level + self.server_max_compress_level = server_max_compress_level + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'client_max_compress_level': self.client_max_compress_level, + 'server_max_compress_level': self.server_max_compress_level} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageBzip2Response(client_max_compress_level = %s, server_max_compress_level = %s)" % (self.client_max_compress_level, self.server_max_compress_level) + + +class PerMessageBzip2ResponseAccept(PerMessageCompressResponseAccept, PerMessageBzip2Mixin): + """ + Set of parameters with which to accept an `permessage-bzip2` response + from a server by a client. + """ + + def __init__(self, + response, + compress_level=None): + """ + + :param response: The response being accepted. + :type response: Instance of :class:`autobahn.compress.PerMessageBzip2Response`. + :param compress_level: Override client ("client-to-server direction") compress level (this must be compatible with response). + :type compress_level: int + """ + if not isinstance(response, PerMessageBzip2Response): + raise Exception("invalid type %s for response" % type(response)) + + self.response = response + + if compress_level is not None: + if compress_level not in self.COMPRESS_LEVEL_PERMISSIBLE_VALUES: + raise Exception("invalid value %s for compress_level - permissible values %s" % (compress_level, self.COMPRESS_LEVEL_PERMISSIBLE_VALUES)) + + if response.client_max_compress_level != 0 and compress_level > response.client_max_compress_level: + raise Exception("invalid value %s for compress_level - server requested lower maximum value" % compress_level) + + self.compress_level = compress_level + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'response': self.response.__json__(), + 'compress_level': self.compress_level} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageBzip2ResponseAccept(response = %s, compress_level = %s)" % (self.response.__repr__(), self.compress_level) + + +class PerMessageBzip2(PerMessageCompress, PerMessageBzip2Mixin): + """ + `permessage-bzip2` WebSocket extension processor. + """ + DEFAULT_COMPRESS_LEVEL = 9 + + @classmethod + def create_from_response_accept(cls, is_server, accept): + pmce = cls(is_server, + accept.response.server_max_compress_level, + accept.compress_level if accept.compress_level is not None else accept.response.client_max_compress_level) + return pmce + + @classmethod + def create_from_offer_accept(cls, is_server, accept): + pmce = cls(is_server, + accept.compress_level if accept.compress_level is not None else accept.offer.request_max_compress_level, + accept.request_max_compress_level) + return pmce + + def __init__(self, + is_server, + server_max_compress_level, + client_max_compress_level): + self._isServer = is_server + self._compressor = None + self._decompressor = None + + self.server_max_compress_level = server_max_compress_level if server_max_compress_level != 0 else self.DEFAULT_COMPRESS_LEVEL + self.client_max_compress_level = client_max_compress_level if client_max_compress_level != 0 else self.DEFAULT_COMPRESS_LEVEL + + def __json__(self): + return {'extension': self.EXTENSION_NAME, + 'isServer': self._isServer, + 'server_max_compress_level': self.server_max_compress_level, + 'client_max_compress_level': self.client_max_compress_level} + + def __repr__(self): + return "PerMessageBzip2(isServer = %s, server_max_compress_level = %s, client_max_compress_level = %s)" % (self._isServer, self.server_max_compress_level, self.client_max_compress_level) + + def start_compress_message(self): + if self._isServer: + if self._compressor is None: + self._compressor = bz2.BZ2Compressor(self.server_max_compress_level) + else: + if self._compressor is None: + self._compressor = bz2.BZ2Compressor(self.client_max_compress_level) + + def compress_message_data(self, data): + return self._compressor.compress(data) + + def end_compress_message(self): + data = self._compressor.flush() + + # there seems to be no "flush without close stream", and after + # full flush, compressor must not be reused + self._compressor = None + + return data + + def start_decompress_message(self): + if self._decompressor is None: + self._decompressor = bz2.BZ2Decompressor() + + def decompress_message_data(self, data): + return self._decompressor.decompress(data) + + def end_decompress_message(self): + self._decompressor = None diff --git a/venv/lib/python3.7/site-packages/autobahn/websocket/compress_snappy.py b/venv/lib/python3.7/site-packages/autobahn/websocket/compress_snappy.py new file mode 100644 index 0000000..7233f80 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/websocket/compress_snappy.py @@ -0,0 +1,429 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from __future__ import absolute_import + +import snappy + +from autobahn.websocket.compress_base import PerMessageCompressOffer, \ + PerMessageCompressOfferAccept, \ + PerMessageCompressResponse, \ + PerMessageCompressResponseAccept, \ + PerMessageCompress + +__all__ = ( + 'PerMessageSnappyMixin', + 'PerMessageSnappyOffer', + 'PerMessageSnappyOfferAccept', + 'PerMessageSnappyResponse', + 'PerMessageSnappyResponseAccept', + 'PerMessageSnappy', +) + + +class PerMessageSnappyMixin(object): + """ + Mixin class for this extension. + """ + + EXTENSION_NAME = "permessage-snappy" + """ + Name of this WebSocket extension. + """ + + +class PerMessageSnappyOffer(PerMessageCompressOffer, PerMessageSnappyMixin): + """ + Set of extension parameters for `permessage-snappy` WebSocket extension + offered by a client to a server. + """ + + @classmethod + def parse(cls, params): + """ + Parses a WebSocket extension offer for `permessage-snappy` provided by a client to a server. + + :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`. + :type params: list + + :returns: A new instance of :class:`autobahn.compress.PerMessageSnappyOffer`. + :rtype: obj + """ + # extension parameter defaults + accept_no_context_takeover = False + request_no_context_takeover = False + + # verify/parse client ("client-to-server direction") parameters of permessage-snappy offer + for p in params: + + if len(params[p]) > 1: + raise Exception("multiple occurrence of extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + val = params[p][0] + + if p == 'client_no_context_takeover': + # noinspection PySimplifyBooleanCheck + if val is not True: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + accept_no_context_takeover = True + + elif p == 'server_no_context_takeover': + # noinspection PySimplifyBooleanCheck + if val is not True: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + request_no_context_takeover = True + + else: + raise Exception("illegal extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + offer = cls(accept_no_context_takeover, + request_no_context_takeover) + return offer + + def __init__(self, + accept_no_context_takeover=True, + request_no_context_takeover=False): + """ + + :param accept_no_context_takeover: Iff true, client accepts "no context takeover" feature. + :type accept_no_context_takeover: bool + :param request_no_context_takeover: Iff true, client request "no context takeover" feature. + :type request_no_context_takeover: bool + """ + if type(accept_no_context_takeover) != bool: + raise Exception("invalid type %s for accept_no_context_takeover" % type(accept_no_context_takeover)) + + self.accept_no_context_takeover = accept_no_context_takeover + + if type(request_no_context_takeover) != bool: + raise Exception("invalid type %s for request_no_context_takeover" % type(request_no_context_takeover)) + + self.request_no_context_takeover = request_no_context_takeover + + def get_extension_string(self): + """ + Returns the WebSocket extension configuration string as sent to the server. + + :returns: PMCE configuration string. + :rtype: str + """ + pmce_string = self.EXTENSION_NAME + if self.accept_no_context_takeover: + pmce_string += "; client_no_context_takeover" + if self.request_no_context_takeover: + pmce_string += "; server_no_context_takeover" + return pmce_string + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'accept_no_context_takeover': self.accept_no_context_takeover, + 'request_no_context_takeover': self.request_no_context_takeover} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageSnappyOffer(accept_no_context_takeover = %s, request_no_context_takeover = %s)" % (self.accept_no_context_takeover, self.request_no_context_takeover) + + +class PerMessageSnappyOfferAccept(PerMessageCompressOfferAccept, PerMessageSnappyMixin): + """ + Set of parameters with which to accept an `permessage-snappy` offer + from a client by a server. + """ + + def __init__(self, + offer, + request_no_context_takeover=False, + no_context_takeover=None): + """ + + :param offer: The offer being accepted. + :type offer: Instance of :class:`autobahn.compress.PerMessageSnappyOffer`. + :param request_no_context_takeover: Iff true, server request "no context takeover" feature. + :type request_no_context_takeover: bool + :param no_context_takeover: Override server ("server-to-client direction") context takeover (this must be compatible with offer). + :type no_context_takeover: bool + """ + if not isinstance(offer, PerMessageSnappyOffer): + raise Exception("invalid type %s for offer" % type(offer)) + + self.offer = offer + + if type(request_no_context_takeover) != bool: + raise Exception("invalid type %s for request_no_context_takeover" % type(request_no_context_takeover)) + + if request_no_context_takeover and not offer.accept_no_context_takeover: + raise Exception("invalid value %s for request_no_context_takeover - feature unsupported by client" % request_no_context_takeover) + + self.request_no_context_takeover = request_no_context_takeover + + if no_context_takeover is not None: + if type(no_context_takeover) != bool: + raise Exception("invalid type %s for no_context_takeover" % type(no_context_takeover)) + + if offer.request_no_context_takeover and not no_context_takeover: + raise Exception("invalid value %s for no_context_takeover - client requested feature" % no_context_takeover) + + self.no_context_takeover = no_context_takeover + + def get_extension_string(self): + """ + Returns the WebSocket extension configuration string as sent to the server. + + :returns: PMCE configuration string. + :rtype: str + """ + pmce_string = self.EXTENSION_NAME + if self.offer.request_no_context_takeover: + pmce_string += "; server_no_context_takeover" + if self.request_no_context_takeover: + pmce_string += "; client_no_context_takeover" + return pmce_string + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'offer': self.offer.__json__(), + 'request_no_context_takeover': self.request_no_context_takeover, + 'no_context_takeover': self.no_context_takeover} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageSnappyAccept(offer = %s, request_no_context_takeover = %s, no_context_takeover = %s)" % (self.offer.__repr__(), self.request_no_context_takeover, self.no_context_takeover) + + +class PerMessageSnappyResponse(PerMessageCompressResponse, PerMessageSnappyMixin): + """ + Set of parameters for `permessage-snappy` responded by server. + """ + + @classmethod + def parse(cls, params): + """ + Parses a WebSocket extension response for `permessage-snappy` provided by a server to a client. + + :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`. + :type params: list + + :returns: A new instance of :class:`autobahn.compress.PerMessageSnappyResponse`. + :rtype: obj + """ + client_no_context_takeover = False + server_no_context_takeover = False + + for p in params: + + if len(params[p]) > 1: + raise Exception("multiple occurrence of extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + val = params[p][0] + + if p == 'client_no_context_takeover': + # noinspection PySimplifyBooleanCheck + if val is not True: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + client_no_context_takeover = True + + elif p == 'server_no_context_takeover': + # noinspection PySimplifyBooleanCheck + if val is not True: + raise Exception("illegal extension parameter value '%s' for parameter '%s' of extension '%s'" % (val, p, cls.EXTENSION_NAME)) + else: + server_no_context_takeover = True + + else: + raise Exception("illegal extension parameter '%s' for extension '%s'" % (p, cls.EXTENSION_NAME)) + + response = cls(client_no_context_takeover, + server_no_context_takeover) + return response + + def __init__(self, + client_no_context_takeover, + server_no_context_takeover): + self.client_no_context_takeover = client_no_context_takeover + self.server_no_context_takeover = server_no_context_takeover + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'client_no_context_takeover': self.client_no_context_takeover, + 'server_no_context_takeover': self.server_no_context_takeover} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageSnappyResponse(client_no_context_takeover = %s, server_no_context_takeover = %s)" % (self.client_no_context_takeover, self.server_no_context_takeover) + + +class PerMessageSnappyResponseAccept(PerMessageCompressResponseAccept, PerMessageSnappyMixin): + """ + Set of parameters with which to accept an `permessage-snappy` response + from a server by a client. + """ + + def __init__(self, + response, + no_context_takeover=None): + """ + + :param response: The response being accepted. + :type response: Instance of :class:`autobahn.compress.PerMessageSnappyResponse`. + :param no_context_takeover: Override client ("client-to-server direction") context takeover (this must be compatible with response). + :type no_context_takeover: bool + """ + if not isinstance(response, PerMessageSnappyResponse): + raise Exception("invalid type %s for response" % type(response)) + + self.response = response + + if no_context_takeover is not None: + if type(no_context_takeover) != bool: + raise Exception("invalid type %s for no_context_takeover" % type(no_context_takeover)) + + if response.client_no_context_takeover and not no_context_takeover: + raise Exception("invalid value %s for no_context_takeover - server requested feature" % no_context_takeover) + + self.no_context_takeover = no_context_takeover + + def __json__(self): + """ + Returns a JSON serializable object representation. + + :returns: JSON serializable representation. + :rtype: dict + """ + return {'extension': self.EXTENSION_NAME, + 'response': self.response.__json__(), + 'no_context_takeover': self.no_context_takeover} + + def __repr__(self): + """ + Returns Python object representation that can be eval'ed to reconstruct the object. + + :returns: Python string representation. + :rtype: str + """ + return "PerMessageSnappyResponseAccept(response = %s, no_context_takeover = %s)" % (self.response.__repr__(), self.no_context_takeover) + + +class PerMessageSnappy(PerMessageCompress, PerMessageSnappyMixin): + """ + `permessage-snappy` WebSocket extension processor. + """ + + @classmethod + def create_from_response_accept(cls, is_server, accept): + pmce = cls(is_server, + accept.response.server_no_context_takeover, + accept.no_context_takeover if accept.no_context_takeover is not None else accept.response.client_no_context_takeover) + return pmce + + @classmethod + def create_from_offer_accept(cls, is_server, accept): + pmce = cls(is_server, + accept.no_context_takeover if accept.no_context_takeover is not None else accept.offer.request_no_context_takeover, + accept.request_no_context_takeover) + return pmce + + def __init__(self, + is_server, + server_no_context_takeover, + client_no_context_takeover): + self._is_server = is_server + self.server_no_context_takeover = server_no_context_takeover + self.client_no_context_takeover = client_no_context_takeover + + self._compressor = None + self._decompressor = None + + def __json__(self): + return {'extension': self.EXTENSION_NAME, + 'server_no_context_takeover': self.server_no_context_takeover, + 'client_no_context_takeover': self.client_no_context_takeover} + + def __repr__(self): + return "PerMessageSnappy(is_server = %s, server_no_context_takeover = %s, client_no_context_takeover = %s)" % (self._is_server, self.server_no_context_takeover, self.client_no_context_takeover) + + def start_compress_message(self): + if self._is_server: + if self._compressor is None or self.server_no_context_takeover: + self._compressor = snappy.StreamCompressor() + else: + if self._compressor is None or self.client_no_context_takeover: + self._compressor = snappy.StreamCompressor() + + def compress_message_data(self, data): + return self._compressor.add_chunk(data) + + def end_compress_message(self): + return b"" + + def start_decompress_message(self): + if self._is_server: + if self._decompressor is None or self.client_no_context_takeover: + self._decompressor = snappy.StreamDecompressor() + else: + if self._decompressor is None or self.server_no_context_takeover: + self._decompressor = snappy.StreamDecompressor() + + def decompress_message_data(self, data): + return self._decompressor.decompress(data) + + def end_decompress_message(self): + pass diff --git a/venv/lib/python3.7/site-packages/autobahn/xbr/_interfaces.py b/venv/lib/python3.7/site-packages/autobahn/xbr/_interfaces.py new file mode 100644 index 0000000..71e0365 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/xbr/_interfaces.py @@ -0,0 +1,188 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +import abc +import six + + +@six.add_metaclass(abc.ABCMeta) +class IMarketMaker(object): + """ + XBR Market Maker interface. + """ + + @abc.abstractmethod + def status(self, details): + """ + + :param details: + :return: + """ + + @abc.abstractmethod + def offer(self, key_id, price, details): + """ + + :param key_id: + :param price: + :param details: + :return: + """ + + @abc.abstractmethod + def revoke(self, key_id, details): + """ + + :param key_id: + :param details: + :return: + """ + + @abc.abstractmethod + def quote(self, key_id, details): + """ + + :param key_id: + :param details: + :return: + """ + + @abc.abstractmethod + def buy(self, channel_id, channel_seq, buyer_pubkey, datakey_id, amount, balance, signature, details): + """ + + :param channel_id: + :param channel_seq: + :param buyer_pubkey: + :param datakey_id: + :param amount: + :param balance: + :param signature: + :param details: + :return: + """ + + @abc.abstractmethod + def get_payment_channels(self, address, details): + """ + + :param address: + :param details: + :return: + """ + + @abc.abstractmethod + def get_payment_channel(self, channel_id, details): + """ + + :param channel_id: + :param details: + :return: + """ + + +@six.add_metaclass(abc.ABCMeta) +class IProvider(object): + """ + XBR Provider interface. + """ + + @abc.abstractmethod + def sell(self, key_id, buyer_pubkey, amount_paid, post_balance, signature, details): + """ + + :param key_id: + :param buyer_pubkey: + :param amount_paid: + :param post_balance: + :param signature: + :param details: + :return: + """ + + +@six.add_metaclass(abc.ABCMeta) +class IConsumer(object): + """ + XBR Consumer interface. + """ + + +@six.add_metaclass(abc.ABCMeta) +class ISeller(object): + """ + XBR Seller interface. + """ + + @abc.abstractmethod + async def start(self, session): + """ + + :param session: + :return: + """ + + @abc.abstractmethod + async def wrap(self, uri, payload): + """ + + :param uri: + :param payload: + :return: + """ + + +@six.add_metaclass(abc.ABCMeta) +class IBuyer(object): + """ + XBR Buyer interface. + """ + + @abc.abstractmethod + async def start(self, session): + """ + Start buying keys over the provided session. + + :param session: WAMP session that allows to talk to the XBR Market Maker. + """ + + @abc.abstractmethod + async def unwrap(self, key_id, enc_ser, ciphertext): + """ + Decrypt and deserialize received XBR payload. + + :param key_id: The ID of the datakey the payload is encrypted with. + :type key_id: bytes + + :param enc_ser: The serializer that was used for serializing the payload. One of ``cbor``, ``json``, ``msgpack``, ``ubjson``. + :type enc_ser: str + + :param ciphertext: The encrypted payload to unwrap. + :type ciphertext: bytes + + :returns: The unwrapped application payload. + :rtype: object + """ diff --git a/venv/lib/python3.7/site-packages/autobahn/xbr/_mnemonic.py b/venv/lib/python3.7/site-packages/autobahn/xbr/_mnemonic.py new file mode 100644 index 0000000..3881a0d --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/xbr/_mnemonic.py @@ -0,0 +1,162 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) 2018 Luis Teixeira +# - copied & modified from https://github.com/vergl4s/ethereum-mnemonic-utils +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +import hashlib +import hmac +import struct + +from base58 import b58encode_check +from ecdsa.curves import SECP256k1 + +BIP39_PBKDF2_ROUNDS = 2048 +BIP39_SALT_MODIFIER = "mnemonic" +BIP32_PRIVDEV = 0x80000000 +BIP32_CURVE = SECP256k1 +BIP32_SEED_MODIFIER = b'Bitcoin seed' + +# https://github.com/ethereum/EIPs/issues/84#issuecomment-528213145 +LEDGER_ETH_DERIVATION_PATH = "m/44'/60'/0'/0" + + +def mnemonic_to_bip39seed(mnemonic, passphrase): + """ BIP39 seed from a mnemonic key. + Logic adapted from https://github.com/trezor/python-mnemonic. """ + mnemonic = bytes(mnemonic, 'utf8') + salt = bytes(BIP39_SALT_MODIFIER + passphrase, 'utf8') + return hashlib.pbkdf2_hmac('sha512', mnemonic, salt, BIP39_PBKDF2_ROUNDS) + + +def bip39seed_to_bip32masternode(seed): + """ BIP32 master node derivation from a bip39 seed. + Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. """ + h = hmac.new(BIP32_SEED_MODIFIER, seed, hashlib.sha512).digest() + key, chain_code = h[:32], h[32:] + return key, chain_code + + +def derive_public_key(private_key): + """ Public key from a private key. + Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. """ + + Q = int.from_bytes(private_key, byteorder='big') * BIP32_CURVE.generator + xstr = Q.x().to_bytes(32, byteorder='big') + parity = Q.y() & 1 + return (2 + parity).to_bytes(1, byteorder='big') + xstr + + +def derive_bip32childkey(parent_key, parent_chain_code, i): + """ Derives a child key from an existing key, i is current derivation parameter. + Logic adapted from https://github.com/satoshilabs/slips/blob/master/slip-0010/testvectors.py. """ + + assert len(parent_key) == 32 + assert len(parent_chain_code) == 32 + k = parent_chain_code + if (i & BIP32_PRIVDEV) != 0: + key = b'\x00' + parent_key + else: + key = derive_public_key(parent_key) + d = key + struct.pack('>L', i) + while True: + h = hmac.new(k, d, hashlib.sha512).digest() + key, chain_code = h[:32], h[32:] + a = int.from_bytes(key, byteorder='big') + b = int.from_bytes(parent_key, byteorder='big') + key = (a + b) % BIP32_CURVE.order + if a < BIP32_CURVE.order and key != 0: + key = key.to_bytes(32, byteorder='big') + break + d = b'\x01' + h[32:] + struct.pack('>L', i) + + return key, chain_code + + +def fingerprint(public_key): + """ BIP32 fingerprint formula, used to get b58 serialized key. """ + + return hashlib.new('ripemd160', hashlib.sha256(public_key).digest()).digest()[:4] + + +def b58xprv(parent_fingerprint, private_key, chain, depth, childnr): + """ Private key b58 serialization format. """ + + raw = (b'\x04\x88\xad\xe4' + bytes(chr(depth), 'utf-8') + parent_fingerprint + childnr.to_bytes( + 4, byteorder='big') + chain + b'\x00' + private_key) + + return b58encode_check(raw) + + +def b58xpub(parent_fingerprint, public_key, chain, depth, childnr): + """ Public key b58 serialization format. """ + + raw = (b'\x04\x88\xb2\x1e' + bytes(chr(depth), 'utf-8') + parent_fingerprint + childnr.to_bytes( + 4, byteorder='big') + chain + public_key) + + return b58encode_check(raw) + + +def parse_derivation_path(str_derivation_path): + """ Parses a derivation path such as "m/44'/60/0'/0" and returns + list of integers for each element in path. """ + + path = [] + if str_derivation_path[0:2] != 'm/': + raise ValueError("Can't recognize derivation path. It should look like \"m/44'/60/0'/0\".") + + for i in str_derivation_path.lstrip('m/').split('/'): + if "'" in i: + path.append(BIP32_PRIVDEV + int(i[:-1])) + else: + path.append(int(i)) + return path + + +def mnemonic_to_private_key(mnemonic, str_derivation_path=LEDGER_ETH_DERIVATION_PATH, passphrase=""): + """ Performs all convertions to get a private key from a mnemonic sentence, including: + + BIP39 mnemonic to seed + BIP32 seed to master key + BIP32 child derivation of a path provided + + Parameters: + mnemonic -- seed wordlist, usually with 24 words, that is used for ledger wallet backup + str_derivation_path -- string that directs BIP32 key derivation, defaults to path + used by ledger ETH wallet + + """ + + derivation_path = parse_derivation_path(str_derivation_path) + + bip39seed = mnemonic_to_bip39seed(mnemonic, passphrase) + + master_private_key, master_chain_code = bip39seed_to_bip32masternode(bip39seed) + + private_key, chain_code = master_private_key, master_chain_code + + for i in derivation_path: + private_key, chain_code = derive_bip32childkey(private_key, chain_code, i) + + return private_key diff --git a/venv/lib/python3.7/site-packages/autobahn/xbr/_util.py b/venv/lib/python3.7/site-packages/autobahn/xbr/_util.py new file mode 100644 index 0000000..05b38e5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/xbr/_util.py @@ -0,0 +1,218 @@ +############################################################################### +# +# The MIT License (MIT) +# +# Copyright (c) Crossbar.io Technologies GmbH +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +############################################################################### + +from binascii import a2b_hex + +import click +import web3 +from py_eth_sig_utils import signing + +_EIP712_SIG_LEN = 32 + 32 + 1 + + +def unpack_uint128(data): + assert data is None or type(data) == bytes, 'data must by bytes, was {}'.format(type(data)) + if data and type(data) == bytes: + assert len(data) == 16, 'data must be bytes[16], but was bytes[{}]'.format(len(data)) + + if data: + return web3.Web3.toInt(data) + else: + return 0 + + +def pack_uint128(value): + assert value is None or (type(value) == int and value >= 0 and value < 2**128) + + if value: + data = web3.Web3.toBytes(value) + return b'\x00' * (16 - len(data)) + data + else: + return b'\x00' * 16 + + +# FIXME: possibly use https://eth-abi.readthedocs.io/en/stable/decoding.html + +def unpack_uint256(data): + assert data is None or type(data) == bytes, 'data must by bytes, was {}'.format(type(data)) + if data and type(data) == bytes: + assert len(data) == 32, 'data must be bytes[32], but was bytes[{}]'.format(len(data)) + + if data: + return int(web3.Web3.toInt(data)) + else: + return 0 + + +def pack_uint256(value): + assert value is None or (type(value) == int and value >= 0 and value < 2**256), 'value must be uint256, but was {}'.format(value) + + if value: + data = web3.Web3.toBytes(value) + return b'\x00' * (32 - len(data)) + data + else: + return b'\x00' * 32 + + +def hl(text, bold=True, color='yellow'): + if not isinstance(text, str): + text = '{}'.format(text) + return click.style(text, fg=color, bold=bold) + + +def _create_eip712_data(verifying_adr, channel_adr, channel_seq, balance, is_final): + assert type(verifying_adr) == bytes and len(verifying_adr) == 20 + assert type(channel_adr) == bytes and len(channel_adr) == 20 + assert type(channel_seq) == int + assert type(balance) == int + assert type(is_final) == bool + + data = { + 'types': { + 'EIP712Domain': [ + {'name': 'name', 'type': 'string'}, + {'name': 'version', 'type': 'string'}, + {'name': 'chainId', 'type': 'uint256'}, + {'name': 'verifyingContract', 'type': 'address'}, + ], + 'ChannelClose': [ + # The channel contract address. + {'name': 'channel_adr', 'type': 'address'}, + + # Channel off-chain transaction sequence number. + {'name': 'channel_seq', 'type': 'uint32'}, + + # Balance remaining in after the transaction. + {'name': 'balance', 'type': 'uint256'}, + + # Transaction is marked as final. + {'name': 'is_final', 'type': 'bool'}, + ], + }, + 'primaryType': 'ChannelClose', + 'domain': { + 'name': 'XBR', + 'version': '1', + 'chainId': 1, + 'verifyingContract': verifying_adr, + }, + 'message': { + 'channel_adr': channel_adr, + 'channel_seq': channel_seq, + 'balance': balance, + 'is_final': is_final + }, + } + + return data + + +def sign_eip712_data(eth_privkey, channel_adr, channel_seq, balance, is_final=False): + """ + + :param eth_privkey: Ethereum address of buyer (a raw 20 bytes Ethereum address). + :type eth_privkey: bytes + + :param channel_adr: Channel contract address. + :type channel_adr: bytes + + :param channel_seq: Payment channel off-chain transaction sequence number. + :type channel_seq: int + + :param balance: Balance remaining in the payment/paying channel after buying/selling the key. + :type balance: int + + :param is_final: Flag to indicate the transaction is considered final. + :type is_final: bool + + :return: The signature according to EIP712 (32+32+1 raw bytes). + :rtype: bytes + """ + assert type(eth_privkey) == bytes and len(eth_privkey) == 32 + assert type(channel_adr) == bytes and len(channel_adr) == 20 + assert type(channel_seq) == int and channel_seq > 0 + assert type(balance) == int and balance >= 0 + assert type(is_final) == bool + + verifying_adr = a2b_hex('0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B'[2:]) + + # make a private key object from the raw private key bytes + # pkey = eth_keys.keys.PrivateKey(eth_privkey) + + # get the canonical address of the account + # eth_adr = web3.Web3.toChecksumAddress(pkey.public_key.to_canonical_address()) + # eth_adr = pkey.public_key.to_canonical_address() + + # create EIP712 typed data object + data = _create_eip712_data(verifying_adr, channel_adr, channel_seq, balance, is_final) + + # FIXME: this fails on PyPy (but ot on CPy!) with + # Unknown format b'%M\xff\xcd2w\xc0\xb1f\x0fmB\xef\xbbuN\xda\xba\xbc+', attempted to normalize to 0x254dffcd3277c0b1660f6d42efbb754edababc2b + _args = signing.sign_typed_data(data, eth_privkey) + + signature = signing.v_r_s_to_signature(*_args) + assert len(signature) == _EIP712_SIG_LEN + + return signature + + +def recover_eip712_signer(channel_adr, channel_seq, balance, is_final, signature): + """ + Recover the signer address the given EIP712 signature was signed with. + + :param channel_adr: Channel contract address. + :type channel_adr: bytes + + :param channel_seq: Payment channel off-chain transaction sequence number. + :type channel_seq: int + + :param balance: Balance remaining in the payment/paying channel after buying/selling the key. + :type balance: int + + :param is_final: Flag to indicate the transaction is considered final. + :type is_final: bool + + :param signature: The EIP712 (32+32+1 raw bytes) signature to verify. + :type signature: bytes + + :return: The (computed) signer address the signature was signed with. + :rtype: bytes + """ + assert type(channel_adr) == bytes and len(channel_adr) == 20 + assert type(channel_seq) == int + assert type(balance) == int + assert type(is_final) == bool + assert type(signature) == bytes and len(signature) == _EIP712_SIG_LEN + + verifying_adr = a2b_hex('0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B'[2:]) + + # recreate EIP712 typed data object + data = _create_eip712_data(verifying_adr, channel_adr, channel_seq, balance, is_final) + + # this returns the signer (checksummed) address as a string, eg "0xE11BA2b4D45Eaed5996Cd0823791E0C93114882d" + signer_address = signing.recover_typed_data(data, *signing.signature_to_v_r_s(signature)) + + return a2b_hex(signer_address[2:]) diff --git a/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/ERC20.json b/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/ERC20.json new file mode 100644 index 0000000..28454cc --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/ERC20.json @@ -0,0 +1,11052 @@ +{ + "contractName": "ERC20", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "recipient", + "type": "address" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "spender", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "sender", + "type": "address" + }, + { + "name": "recipient", + "type": "address" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "spender", + "type": "address" + }, + { + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "spender", + "type": "address" + }, + { + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "metadata": "{\"compiler\":{\"version\":\"0.5.2+commit.1df8f40c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"sender\",\"type\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"spender\",\"type\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}],\"devdoc\":{\"details\":\"Implementation of the `IERC20` interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using `_mint`. For a generic mechanism see `ERC20Mintable`. * *For a detailed writeup see our guide [How to implement supply mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an `Approval` event is emitted on calls to `transferFrom`. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` functions have been added to mitigate the well-known issues around setting allowances. See `IERC20.approve`.\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See `IERC20.allowance`.\"},\"approve(address,uint256)\":{\"details\":\"See `IERC20.approve`. * Requirements: * - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See `IERC20.balanceOf`.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. * This is an alternative to `approve` that can be used as a mitigation for problems described in `IERC20.approve`. * Emits an `Approval` event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. * This is an alternative to `approve` that can be used as a mitigation for problems described in `IERC20.approve`. * Emits an `Approval` event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address.\"},\"totalSupply()\":{\"details\":\"See `IERC20.totalSupply`.\"},\"transfer(address,uint256)\":{\"details\":\"See `IERC20.transfer`. * Requirements: * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See `IERC20.transferFrom`. * Emits an `Approval` event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of `ERC20`; * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `value`. - the caller must have allowance for `sender`'s tokens of at least `amount`.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x4ccf2d7b51873db1ccfd54ca2adae5eac3b184f9699911ed4490438419f1c690\",\"urls\":[\"bzzr://1604f5b6d6e916c154efd8c6720cda069e5ba32dfa0a9dedf2b42e5b02d07f89\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x852793a3c2f86d336a683b30d688ec3dcfc57451af5a2bf5975cda3b7191a901\",\"urls\":[\"bzzr://07fb42206812a17c1f71e548cfa5cec6f9aa1ae0ca5df870718ca4aa9759d1a5\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzzr://aa8b45b57edafc3d67bc5d916327ea16807fae33f753ca163ae0c4061b789766\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610710806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161007857806370a0823114610166578063a457c2d71461018c578063a9059cbb146101b8578063dd62ed3e146101e4576100a5565b8063095ea7b3146100aa57806318160ddd146100ea57806323b872dd14610104578063395093511461013a575b600080fd5b6100d6600480360360408110156100c057600080fd5b50600160a060020a038135169060200135610212565b604080519115158252519081900360200190f35b6100f2610228565b60408051918252519081900360200190f35b6100d66004803603606081101561011a57600080fd5b50600160a060020a0381358116916020810135909116906040013561022e565b6100d66004803603604081101561015057600080fd5b50600160a060020a038135169060200135610285565b6100f26004803603602081101561017c57600080fd5b5035600160a060020a03166102c1565b6100d6600480360360408110156101a257600080fd5b50600160a060020a0381351690602001356102dc565b6100d6600480360360408110156101ce57600080fd5b50600160a060020a038135169060200135610318565b6100f2600480360360408110156101fa57600080fd5b50600160a060020a0381358116916020013516610325565b600061021f338484610350565b50600192915050565b60025490565b600061023b848484610446565b600160a060020a03841660009081526001602090815260408083203380855292529091205461027b918691610276908663ffffffff61059216565b610350565b5060019392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161021f918590610276908663ffffffff6105f216565b600160a060020a031660009081526020819052604090205490565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161021f918590610276908663ffffffff61059216565b600061021f338484610446565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b600160a060020a038316151561039a5760405160e560020a62461bcd0281526004018080602001828103825260248152602001806106c16024913960400191505060405180910390fd5b600160a060020a03821615156103e45760405160e560020a62461bcd02815260040180806020018281038252602281526020018061067a6022913960400191505060405180910390fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600160a060020a03831615156104905760405160e560020a62461bcd02815260040180806020018281038252602581526020018061069c6025913960400191505060405180910390fd5b600160a060020a03821615156104da5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806106576023913960400191505060405180910390fd5b600160a060020a038316600090815260208190526040902054610503908263ffffffff61059216565b600160a060020a038085166000908152602081905260408082209390935590841681522054610538908263ffffffff6105f216565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156105ec576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561064f576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a165627a7a72305820d508fef87366948927f9a8d179b6e30108f6468136cc4c57105c9d5c35238b740029", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a5576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161007857806370a0823114610166578063a457c2d71461018c578063a9059cbb146101b8578063dd62ed3e146101e4576100a5565b8063095ea7b3146100aa57806318160ddd146100ea57806323b872dd14610104578063395093511461013a575b600080fd5b6100d6600480360360408110156100c057600080fd5b50600160a060020a038135169060200135610212565b604080519115158252519081900360200190f35b6100f2610228565b60408051918252519081900360200190f35b6100d66004803603606081101561011a57600080fd5b50600160a060020a0381358116916020810135909116906040013561022e565b6100d66004803603604081101561015057600080fd5b50600160a060020a038135169060200135610285565b6100f26004803603602081101561017c57600080fd5b5035600160a060020a03166102c1565b6100d6600480360360408110156101a257600080fd5b50600160a060020a0381351690602001356102dc565b6100d6600480360360408110156101ce57600080fd5b50600160a060020a038135169060200135610318565b6100f2600480360360408110156101fa57600080fd5b50600160a060020a0381358116916020013516610325565b600061021f338484610350565b50600192915050565b60025490565b600061023b848484610446565b600160a060020a03841660009081526001602090815260408083203380855292529091205461027b918691610276908663ffffffff61059216565b610350565b5060019392505050565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161021f918590610276908663ffffffff6105f216565b600160a060020a031660009081526020819052604090205490565b336000818152600160209081526040808320600160a060020a0387168452909152812054909161021f918590610276908663ffffffff61059216565b600061021f338484610446565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b600160a060020a038316151561039a5760405160e560020a62461bcd0281526004018080602001828103825260248152602001806106c16024913960400191505060405180910390fd5b600160a060020a03821615156103e45760405160e560020a62461bcd02815260040180806020018281038252602281526020018061067a6022913960400191505060405180910390fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600160a060020a03831615156104905760405160e560020a62461bcd02815260040180806020018281038252602581526020018061069c6025913960400191505060405180910390fd5b600160a060020a03821615156104da5760405160e560020a62461bcd0281526004018080602001828103825260238152602001806106576023913960400191505060405180910390fd5b600160a060020a038316600090815260208190526040902054610503908263ffffffff61059216565b600160a060020a038085166000908152602081905260408082209390935590841681522054610538908263ffffffff6105f216565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156105ec576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561064f576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a165627a7a72305820d508fef87366948927f9a8d179b6e30108f6468136cc4c57105c9d5c35238b740029", + "sourceMap": "1232:6578:10:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1232:6578:10;;;;;;;", + "deployedSourceMap": "1232:6578:10:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1232:6578:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2453:145;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2453:145:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1514:89;;;:::i;:::-;;;;;;;;;;;;;;;;3055:252;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3055:252:10;;;;;;;;;;;;;;;;;:::i;3702:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3702:203:10;;;;;;;;:::i;1661:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1661:108:10;-1:-1:-1;;;;;1661:108:10;;:::i;4392:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4392:213:10;;;;;;;;:::i;1972:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1972:153:10;;;;;;;;:::i;2183:132::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2183:132:10;;;;;;;;;;:::i;2453:145::-;2518:4;2534:36;2543:10;2555:7;2564:5;2534:8;:36::i;:::-;-1:-1:-1;2587:4:10;2453:145;;;;:::o;1514:89::-;1584:12;;1514:89;:::o;3055:252::-;3144:4;3160:36;3170:6;3178:9;3189:6;3160:9;:36::i;:::-;-1:-1:-1;;;;;3235:19:10;;;;;;:11;:19;;;;;;;;3223:10;3235:31;;;;;;;;;3206:73;;3215:6;;3235:43;;3271:6;3235:43;:35;:43;:::i;:::-;3206:8;:73::i;:::-;-1:-1:-1;3296:4:10;3055:252;;;;;:::o;3702:203::-;3807:10;3782:4;3828:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;3828:32:10;;;;;;;;;;3782:4;;3798:79;;3819:7;;3828:48;;3865:10;3828:48;:36;:48;:::i;1661:108::-;-1:-1:-1;;;;;1744:18:10;1718:7;1744:18;;;;;;;;;;;;1661:108::o;4392:213::-;4502:10;4477:4;4523:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4523:32:10;;;;;;;;;;4477:4;;4493:84;;4514:7;;4523:53;;4560:15;4523:53;:36;:53;:::i;1972:153::-;2041:4;2057:40;2067:10;2079:9;2090:6;2057:9;:40::i;2183:132::-;-1:-1:-1;;;;;2281:18:10;;;2255:7;2281:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2183:132::o;7117:329::-;-1:-1:-1;;;;;7209:19:10;;;;7201:68;;;;-1:-1:-1;;;;;7201:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7287:21:10;;;;7279:68;;;;-1:-1:-1;;;;;7279:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7358:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;7408:31;;;;;;;;;;;;;;;;;7117:329;;;:::o;5079:422::-;-1:-1:-1;;;;;5176:20:10;;;;5168:70;;;;-1:-1:-1;;;;;5168:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5256:23:10;;;;5248:71;;;;-1:-1:-1;;;;;5248:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5350:17:10;;:9;:17;;;;;;;;;;;:29;;5372:6;5350:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;5330:17:10;;;:9;:17;;;;;;;;;;;:49;;;;5412:20;;;;;;;:32;;5437:6;5412:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;5389:20:10;;;:9;:20;;;;;;;;;;;;:55;;;;5459:35;;;;;;;5389:20;;5459:35;;;;;;;;;;;;;5079:422;;;:::o;1274:179:9:-;1332:7;1359:6;;;;1351:49;;;;;-1:-1:-1;;;;;1351:49:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1422:5:9;;;1274:179::o;834:176::-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;;;938:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;834:176;-1:-1:-1;;;834:176:9:o", + "source": "pragma solidity ^0.5.0;\n\nimport \"./IERC20.sol\";\nimport \"../../math/SafeMath.sol\";\n\n/**\n * @dev Implementation of the `IERC20` interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using `_mint`.\n * For a generic mechanism see `ERC20Mintable`.\n *\n * *For a detailed writeup see our guide [How to implement supply\n * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an `Approval` event is emitted on calls to `transferFrom`.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See `IERC20.approve`.\n */\ncontract ERC20 is IERC20 {\n using SafeMath for uint256;\n\n mapping (address => uint256) private _balances;\n\n mapping (address => mapping (address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n /**\n * @dev See `IERC20.totalSupply`.\n */\n function totalSupply() public view returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See `IERC20.balanceOf`.\n */\n function balanceOf(address account) public view returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See `IERC20.transfer`.\n *\n * Requirements:\n *\n * - `recipient` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address recipient, uint256 amount) public returns (bool) {\n _transfer(msg.sender, recipient, amount);\n return true;\n }\n\n /**\n * @dev See `IERC20.allowance`.\n */\n function allowance(address owner, address spender) public view returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See `IERC20.approve`.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 value) public returns (bool) {\n _approve(msg.sender, spender, value);\n return true;\n }\n\n /**\n * @dev See `IERC20.transferFrom`.\n *\n * Emits an `Approval` event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of `ERC20`;\n *\n * Requirements:\n * - `sender` and `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `value`.\n * - the caller must have allowance for `sender`'s tokens of at least\n * `amount`.\n */\n function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {\n _transfer(sender, recipient, amount);\n _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to `approve` that can be used as a mitigation for\n * problems described in `IERC20.approve`.\n *\n * Emits an `Approval` event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {\n _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to `approve` that can be used as a mitigation for\n * problems described in `IERC20.approve`.\n *\n * Emits an `Approval` event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {\n _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));\n return true;\n }\n\n /**\n * @dev Moves tokens `amount` from `sender` to `recipient`.\n *\n * This is internal function is equivalent to `transfer`, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a `Transfer` event.\n *\n * Requirements:\n *\n * - `sender` cannot be the zero address.\n * - `recipient` cannot be the zero address.\n * - `sender` must have a balance of at least `amount`.\n */\n function _transfer(address sender, address recipient, uint256 amount) internal {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n _balances[sender] = _balances[sender].sub(amount);\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a `Transfer` event with `from` set to the zero address.\n *\n * Requirements\n *\n * - `to` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _totalSupply = _totalSupply.add(amount);\n _balances[account] = _balances[account].add(amount);\n emit Transfer(address(0), account, amount);\n }\n\n /**\n * @dev Destoys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a `Transfer` event with `to` set to the zero address.\n *\n * Requirements\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 value) internal {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _totalSupply = _totalSupply.sub(value);\n _balances[account] = _balances[account].sub(value);\n emit Transfer(account, address(0), value);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.\n *\n * This is internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an `Approval` event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 value) internal {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = value;\n emit Approval(owner, spender, value);\n }\n\n /**\n * @dev Destoys `amount` tokens from `account`.`amount` is then deducted\n * from the caller's allowance.\n *\n * See `_burn` and `_approve`.\n */\n function _burnFrom(address account, uint256 amount) internal {\n _burn(account, amount);\n _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));\n }\n}\n", + "sourcePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol", + "ast": { + "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol", + "exportedSymbols": { + "ERC20": [ + 3520 + ] + }, + "id": 3521, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 3125, + "literals": [ + "solidity", + "^", + "0.5", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:23:10" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol", + "file": "./IERC20.sol", + "id": 3126, + "nodeType": "ImportDirective", + "scope": 3521, + "sourceUnit": 3648, + "src": "25:22:10", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol", + "file": "../../math/SafeMath.sol", + "id": 3127, + "nodeType": "ImportDirective", + "scope": 3521, + "sourceUnit": 3124, + "src": "48:33:10", + "symbolAliases": [], + "unitAlias": "" + }, + { + "baseContracts": [ + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 3128, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 3647, + "src": "1250:6:10", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$3647", + "typeString": "contract IERC20" + } + }, + "id": 3129, + "nodeType": "InheritanceSpecifier", + "src": "1250:6:10" + } + ], + "contractDependencies": [ + 3647 + ], + "contractKind": "contract", + "documentation": "@dev Implementation of the `IERC20` interface.\n * This implementation is agnostic to the way tokens are created. This means\nthat a supply mechanism has to be added in a derived contract using `_mint`.\nFor a generic mechanism see `ERC20Mintable`.\n * *For a detailed writeup see our guide [How to implement supply\nmechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*\n * We have followed general OpenZeppelin guidelines: functions revert instead\nof returning `false` on failure. This behavior is nonetheless conventional\nand does not conflict with the expectations of ERC20 applications.\n * Additionally, an `Approval` event is emitted on calls to `transferFrom`.\nThis allows applications to reconstruct the allowance for all accounts just\nby listening to said events. Other implementations of the EIP may not emit\nthese events, as it isn't required by the specification.\n * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`\nfunctions have been added to mitigate the well-known issues around setting\nallowances. See `IERC20.approve`.", + "fullyImplemented": true, + "id": 3520, + "linearizedBaseContracts": [ + 3520, + 3647 + ], + "name": "ERC20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 3132, + "libraryName": { + "contractScope": null, + "id": 3130, + "name": "SafeMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 3123, + "src": "1269:8:10", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SafeMath_$3123", + "typeString": "library SafeMath" + } + }, + "nodeType": "UsingForDirective", + "src": "1263:27:10", + "typeName": { + "id": 3131, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1282:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "constant": false, + "id": 3136, + "name": "_balances", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1296:46:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 3135, + "keyType": { + "id": 3133, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1305:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1296:28:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 3134, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1316:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "value": null, + "visibility": "private" + }, + { + "constant": false, + "id": 3142, + "name": "_allowances", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1349:69:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "typeName": { + "id": 3141, + "keyType": { + "id": 3137, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1358:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1349:49:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "valueType": { + "id": 3140, + "keyType": { + "id": 3138, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1378:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1369:28:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 3139, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1389:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + } + }, + "value": null, + "visibility": "private" + }, + { + "constant": false, + "id": 3144, + "name": "_totalSupply", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1425:28:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3143, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1425:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 3151, + "nodeType": "Block", + "src": "1567:36:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 3149, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "1584:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3148, + "id": 3150, + "nodeType": "Return", + "src": "1577:19:10" + } + ] + }, + "documentation": "@dev See `IERC20.totalSupply`.", + "id": 3152, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "totalSupply", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3145, + "nodeType": "ParameterList", + "parameters": [], + "src": "1534:2:10" + }, + "returnParameters": { + "id": 3148, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3147, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3152, + "src": "1558:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3146, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1558:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1557:9:10" + }, + "scope": 3520, + "src": "1514:89:10", + "stateMutability": "view", + "superFunction": 3585, + "visibility": "public" + }, + { + "body": { + "id": 3163, + "nodeType": "Block", + "src": "1727:42:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3159, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "1744:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3161, + "indexExpression": { + "argumentTypes": null, + "id": 3160, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3154, + "src": "1754:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1744:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3158, + "id": 3162, + "nodeType": "Return", + "src": "1737:25:10" + } + ] + }, + "documentation": "@dev See `IERC20.balanceOf`.", + "id": 3164, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "balanceOf", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3155, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3154, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3164, + "src": "1680:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3153, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1680:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1679:17:10" + }, + "returnParameters": { + "id": 3158, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3157, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3164, + "src": "1718:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3156, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1718:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1717:9:10" + }, + "scope": 3520, + "src": "1661:108:10", + "stateMutability": "view", + "superFunction": 3592, + "visibility": "public" + }, + { + "body": { + "id": 3182, + "nodeType": "Block", + "src": "2047:78:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3174, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2067:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2067:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3176, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3166, + "src": "2079:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3177, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3168, + "src": "2090:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3173, + "name": "_transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3363, + "src": "2057:9:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3178, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2057:40:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3179, + "nodeType": "ExpressionStatement", + "src": "2057:40:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3180, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2114:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3172, + "id": 3181, + "nodeType": "Return", + "src": "2107:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.transfer`.\n * Requirements:\n * - `recipient` cannot be the zero address.\n- the caller must have a balance of at least `amount`.", + "id": 3183, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3169, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3166, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "1990:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3165, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1990:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3168, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "2009:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3167, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2009:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1989:35:10" + }, + "returnParameters": { + "id": 3172, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3171, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "2041:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3170, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2041:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2040:6:10" + }, + "scope": 3520, + "src": "1972:153:10", + "stateMutability": "nonpayable", + "superFunction": 3601, + "visibility": "public" + }, + { + "body": { + "id": 3198, + "nodeType": "Block", + "src": "2264:51:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3192, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "2281:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3194, + "indexExpression": { + "argumentTypes": null, + "id": 3193, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3185, + "src": "2293:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2281:18:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3196, + "indexExpression": { + "argumentTypes": null, + "id": 3195, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3187, + "src": "2300:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2281:27:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3191, + "id": 3197, + "nodeType": "Return", + "src": "2274:34:10" + } + ] + }, + "documentation": "@dev See `IERC20.allowance`.", + "id": 3199, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "allowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3188, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3185, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2202:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3184, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2202:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3187, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2217:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3186, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2217:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2201:32:10" + }, + "returnParameters": { + "id": 3191, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3190, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2255:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3189, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2255:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2254:9:10" + }, + "scope": 3520, + "src": "2183:132:10", + "stateMutability": "view", + "superFunction": 3610, + "visibility": "public" + }, + { + "body": { + "id": 3217, + "nodeType": "Block", + "src": "2524:74:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3209, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2543:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3210, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2543:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3211, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3201, + "src": "2555:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3212, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3203, + "src": "2564:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3208, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "2534:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2534:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3214, + "nodeType": "ExpressionStatement", + "src": "2534:36:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3215, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2587:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3207, + "id": 3216, + "nodeType": "Return", + "src": "2580:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.approve`.\n * Requirements:\n * - `spender` cannot be the zero address.", + "id": 3218, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3204, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3201, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2470:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3200, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2470:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3203, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2487:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3202, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2487:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2469:32:10" + }, + "returnParameters": { + "id": 3207, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3206, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2518:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3205, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2518:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2517:6:10" + }, + "scope": 3520, + "src": "2453:145:10", + "stateMutability": "nonpayable", + "superFunction": 3619, + "visibility": "public" + }, + { + "body": { + "id": 3252, + "nodeType": "Block", + "src": "3150:157:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3230, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3170:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3231, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3222, + "src": "3178:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3232, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3224, + "src": "3189:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3229, + "name": "_transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3363, + "src": "3160:9:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3233, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3160:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3234, + "nodeType": "ExpressionStatement", + "src": "3160:36:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3236, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3215:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3237, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3223:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3238, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3223:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3246, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3224, + "src": "3271:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3239, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "3235:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3241, + "indexExpression": { + "argumentTypes": null, + "id": 3240, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3247:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3235:19:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3244, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3242, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3255:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3243, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3255:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3235:31:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "3235:35:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3235:43:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3235, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "3206:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3206:73:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3249, + "nodeType": "ExpressionStatement", + "src": "3206:73:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3250, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3296:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3228, + "id": 3251, + "nodeType": "Return", + "src": "3289:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.transferFrom`.\n * Emits an `Approval` event indicating the updated allowance. This is not\nrequired by the EIP. See the note at the beginning of `ERC20`;\n * Requirements:\n- `sender` and `recipient` cannot be the zero address.\n- `sender` must have a balance of at least `value`.\n- the caller must have allowance for `sender`'s tokens of at least\n`amount`.", + "id": 3253, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "transferFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3225, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3220, + "name": "sender", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3077:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3219, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3077:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3222, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3093:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3221, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3093:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3224, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3112:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3223, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3112:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3076:51:10" + }, + "returnParameters": { + "id": 3228, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3227, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3144:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3226, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3144:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3143:6:10" + }, + "scope": 3520, + "src": "3055:252:10", + "stateMutability": "nonpayable", + "superFunction": 3630, + "visibility": "public" + }, + { + "body": { + "id": 3279, + "nodeType": "Block", + "src": "3788:117:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3263, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3807:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3807:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3265, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3255, + "src": "3819:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3273, + "name": "addedValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3257, + "src": "3865:10:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3266, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "3828:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3269, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3267, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3840:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3840:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3828:23:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3271, + "indexExpression": { + "argumentTypes": null, + "id": 3270, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3255, + "src": "3852:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3828:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "3828:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3828:48:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3262, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "3798:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3798:79:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3276, + "nodeType": "ExpressionStatement", + "src": "3798:79:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3277, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3894:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3261, + "id": 3278, + "nodeType": "Return", + "src": "3887:11:10" + } + ] + }, + "documentation": "@dev Atomically increases the allowance granted to `spender` by the caller.\n * This is an alternative to `approve` that can be used as a mitigation for\nproblems described in `IERC20.approve`.\n * Emits an `Approval` event indicating the updated allowance.\n * Requirements:\n * - `spender` cannot be the zero address.", + "id": 3280, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "increaseAllowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3258, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3255, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3729:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3254, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3729:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3257, + "name": "addedValue", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3746:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3256, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3746:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3728:37:10" + }, + "returnParameters": { + "id": 3261, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3260, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3782:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3259, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3782:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3781:6:10" + }, + "scope": 3520, + "src": "3702:203:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 3306, + "nodeType": "Block", + "src": "4483:122:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3290, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "4502:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4502:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3292, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3282, + "src": "4514:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3300, + "name": "subtractedValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3284, + "src": "4560:15:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3293, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "4523:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3296, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3294, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "4535:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3295, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4535:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4523:23:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3298, + "indexExpression": { + "argumentTypes": null, + "id": 3297, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3282, + "src": "4547:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4523:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3299, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "4523:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3301, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4523:53:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3289, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "4493:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3302, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4493:84:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3303, + "nodeType": "ExpressionStatement", + "src": "4493:84:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3304, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4594:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3288, + "id": 3305, + "nodeType": "Return", + "src": "4587:11:10" + } + ] + }, + "documentation": "@dev Atomically decreases the allowance granted to `spender` by the caller.\n * This is an alternative to `approve` that can be used as a mitigation for\nproblems described in `IERC20.approve`.\n * Emits an `Approval` event indicating the updated allowance.\n * Requirements:\n * - `spender` cannot be the zero address.\n- `spender` must have allowance for the caller of at least\n`subtractedValue`.", + "id": 3307, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "decreaseAllowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3285, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3282, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4419:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3281, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4419:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3284, + "name": "subtractedValue", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4436:23:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3283, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4436:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4418:42:10" + }, + "returnParameters": { + "id": 3288, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3287, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4477:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3286, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4477:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4476:6:10" + }, + "scope": 3520, + "src": "4392:213:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 3362, + "nodeType": "Block", + "src": "5158:343:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3317, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5176:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3319, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5194:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3318, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5186:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5186:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5176:20:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373", + "id": 3322, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5198:39:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea", + "typeString": "literal_string \"ERC20: transfer from the zero address\"" + }, + "value": "ERC20: transfer from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea", + "typeString": "literal_string \"ERC20: transfer from the zero address\"" + } + ], + "id": 3316, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5168:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5168:70:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3324, + "nodeType": "ExpressionStatement", + "src": "5168:70:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3330, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3326, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5256:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3328, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5277:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3327, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5269:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5269:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5256:23:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a207472616e7366657220746f20746865207a65726f2061646472657373", + "id": 3331, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5281:37:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f", + "typeString": "literal_string \"ERC20: transfer to the zero address\"" + }, + "value": "ERC20: transfer to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f", + "typeString": "literal_string \"ERC20: transfer to the zero address\"" + } + ], + "id": 3325, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5248:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5248:71:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3333, + "nodeType": "ExpressionStatement", + "src": "5248:71:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3334, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5330:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3336, + "indexExpression": { + "argumentTypes": null, + "id": 3335, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5340:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5330:17:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3341, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5372:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3337, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5350:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3339, + "indexExpression": { + "argumentTypes": null, + "id": 3338, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5360:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5350:17:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "5350:21:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3342, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5350:29:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5330:49:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3344, + "nodeType": "ExpressionStatement", + "src": "5330:49:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3345, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5389:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3347, + "indexExpression": { + "argumentTypes": null, + "id": 3346, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5399:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5389:20:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3352, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5437:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3348, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5412:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3350, + "indexExpression": { + "argumentTypes": null, + "id": 3349, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5422:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5412:20:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3351, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5412:24:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3353, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5412:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5389:55:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3355, + "nodeType": "ExpressionStatement", + "src": "5389:55:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3357, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5468:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3358, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5476:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3359, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5487:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3356, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "5459:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3360, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5459:35:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3361, + "nodeType": "EmitStatement", + "src": "5454:40:10" + } + ] + }, + "documentation": "@dev Moves tokens `amount` from `sender` to `recipient`.\n * This is internal function is equivalent to `transfer`, and can be used to\ne.g. implement automatic token fees, slashing mechanisms, etc.\n * Emits a `Transfer` event.\n * Requirements:\n * - `sender` cannot be the zero address.\n- `recipient` cannot be the zero address.\n- `sender` must have a balance of at least `amount`.", + "id": 3363, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3314, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3309, + "name": "sender", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5098:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3308, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5098:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3311, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5114:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3310, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5114:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3313, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5133:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3312, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5133:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5097:51:10" + }, + "returnParameters": { + "id": 3315, + "nodeType": "ParameterList", + "parameters": [], + "src": "5158:0:10" + }, + "scope": 3520, + "src": "5079:422:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3405, + "nodeType": "Block", + "src": "5828:245:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3371, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5846:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5865:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3372, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5857:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5857:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5846:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a206d696e7420746f20746865207a65726f2061646472657373", + "id": 3376, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5869:33:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e", + "typeString": "literal_string \"ERC20: mint to the zero address\"" + }, + "value": "ERC20: mint to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e", + "typeString": "literal_string \"ERC20: mint to the zero address\"" + } + ], + "id": 3370, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5838:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3377, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5838:65:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3378, + "nodeType": "ExpressionStatement", + "src": "5838:65:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 3379, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "5914:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3382, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "5946:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 3380, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "5929:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3381, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5929:16:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3383, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5929:24:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5914:39:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3385, + "nodeType": "ExpressionStatement", + "src": "5914:39:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3386, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5963:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3388, + "indexExpression": { + "argumentTypes": null, + "id": 3387, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5973:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5963:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3393, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "6007:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3389, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5984:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3391, + "indexExpression": { + "argumentTypes": null, + "id": 3390, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5994:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5984:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5984:22:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5984:30:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5963:51:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3396, + "nodeType": "ExpressionStatement", + "src": "5963:51:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6046:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6038:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3400, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6038:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3401, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "6050:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3402, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "6059:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3397, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "6029:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3403, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6029:37:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3404, + "nodeType": "EmitStatement", + "src": "6024:42:10" + } + ] + }, + "documentation": "@dev Creates `amount` tokens and assigns them to `account`, increasing\nthe total supply.\n * Emits a `Transfer` event with `from` set to the zero address.\n * Requirements\n * - `to` cannot be the zero address.", + "id": 3406, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_mint", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3368, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3365, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "5786:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3364, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5786:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3367, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "5803:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3366, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5803:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5785:33:10" + }, + "returnParameters": { + "id": 3369, + "nodeType": "ParameterList", + "parameters": [], + "src": "5828:0:10" + }, + "scope": 3520, + "src": "5771:302:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3448, + "nodeType": "Block", + "src": "6448:244:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3418, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3414, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6466:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3416, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6485:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3415, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6477:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3417, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6477:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "6466:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a206275726e2066726f6d20746865207a65726f2061646472657373", + "id": 3419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6489:35:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f", + "typeString": "literal_string \"ERC20: burn from the zero address\"" + }, + "value": "ERC20: burn from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f", + "typeString": "literal_string \"ERC20: burn from the zero address\"" + } + ], + "id": 3413, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "6458:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6458:67:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3421, + "nodeType": "ExpressionStatement", + "src": "6458:67:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 3422, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "6536:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3425, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6568:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 3423, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "6551:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3424, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "6551:16:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3426, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6551:23:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6536:38:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3428, + "nodeType": "ExpressionStatement", + "src": "6536:38:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3429, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "6584:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3431, + "indexExpression": { + "argumentTypes": null, + "id": 3430, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6594:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "6584:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3436, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6628:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3432, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "6605:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3434, + "indexExpression": { + "argumentTypes": null, + "id": 3433, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6615:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6605:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3435, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "6605:22:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3437, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6605:29:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6584:50:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3439, + "nodeType": "ExpressionStatement", + "src": "6584:50:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3441, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6658:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6675:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3442, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6667:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3444, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6667:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3445, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6679:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3440, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "6649:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3446, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6649:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3447, + "nodeType": "EmitStatement", + "src": "6644:41:10" + } + ] + }, + "documentation": "@dev Destoys `amount` tokens from `account`, reducing the\ntotal supply.\n * Emits a `Transfer` event with `to` set to the zero address.\n * Requirements\n * - `account` cannot be the zero address.\n- `account` must have at least `amount` tokens.", + "id": 3449, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_burn", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3411, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3408, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3449, + "src": "6407:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3407, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6407:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3410, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3449, + "src": "6424:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3409, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6424:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6406:32:10" + }, + "returnParameters": { + "id": 3412, + "nodeType": "ParameterList", + "parameters": [], + "src": "6448:0:10" + }, + "scope": 3520, + "src": "6392:300:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3490, + "nodeType": "Block", + "src": "7191:255:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3459, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7209:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3461, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7226:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3460, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7218:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3462, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7218:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "7209:19:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373", + "id": 3464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7230:38:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208", + "typeString": "literal_string \"ERC20: approve from the zero address\"" + }, + "value": "ERC20: approve from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208", + "typeString": "literal_string \"ERC20: approve from the zero address\"" + } + ], + "id": 3458, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "7201:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3465, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7201:68:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3466, + "nodeType": "ExpressionStatement", + "src": "7201:68:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3472, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3468, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7287:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3470, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7306:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3469, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7298:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3471, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7298:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "7287:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a20617070726f766520746f20746865207a65726f2061646472657373", + "id": 3473, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7310:36:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029", + "typeString": "literal_string \"ERC20: approve to the zero address\"" + }, + "value": "ERC20: approve to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029", + "typeString": "literal_string \"ERC20: approve to the zero address\"" + } + ], + "id": 3467, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "7279:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3474, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7279:68:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3475, + "nodeType": "ExpressionStatement", + "src": "7279:68:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3482, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3476, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "7358:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3479, + "indexExpression": { + "argumentTypes": null, + "id": 3477, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7370:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7358:18:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3480, + "indexExpression": { + "argumentTypes": null, + "id": 3478, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7377:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "7358:27:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 3481, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3455, + "src": "7388:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7358:35:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3483, + "nodeType": "ExpressionStatement", + "src": "7358:35:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3485, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7417:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3486, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7424:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3487, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3455, + "src": "7433:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3484, + "name": "Approval", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3646, + "src": "7408:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7408:31:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3489, + "nodeType": "EmitStatement", + "src": "7403:36:10" + } + ] + }, + "documentation": "@dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.\n * This is internal function is equivalent to `approve`, and can be used to\ne.g. set automatic allowances for certain subsystems, etc.\n * Emits an `Approval` event.\n * Requirements:\n * - `owner` cannot be the zero address.\n- `spender` cannot be the zero address.", + "id": 3491, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3456, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3451, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7135:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3450, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7135:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3453, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7150:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3452, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7150:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3455, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7167:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7167:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7134:47:10" + }, + "returnParameters": { + "id": 3457, + "nodeType": "ParameterList", + "parameters": [], + "src": "7191:0:10" + }, + "scope": 3520, + "src": "7117:329:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3518, + "nodeType": "Block", + "src": "7684:124:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3499, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7700:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3500, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3495, + "src": "7709:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3498, + "name": "_burn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3449, + "src": "7694:5:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 3501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7694:22:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3502, + "nodeType": "ExpressionStatement", + "src": "7694:22:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3504, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7735:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3505, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "7744:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3506, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "7744:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3514, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3495, + "src": "7793:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3507, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "7756:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3509, + "indexExpression": { + "argumentTypes": null, + "id": 3508, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7768:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7756:20:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3512, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3510, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "7777:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "7777:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7756:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3513, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "7756:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3515, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7756:44:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3503, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "7726:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3516, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7726:75:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3517, + "nodeType": "ExpressionStatement", + "src": "7726:75:10" + } + ] + }, + "documentation": "@dev Destoys `amount` tokens from `account`.`amount` is then deducted\nfrom the caller's allowance.\n * See `_burn` and `_approve`.", + "id": 3519, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_burnFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3496, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3493, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3519, + "src": "7642:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3492, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7642:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3495, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3519, + "src": "7659:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3494, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7659:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7641:33:10" + }, + "returnParameters": { + "id": 3497, + "nodeType": "ParameterList", + "parameters": [], + "src": "7684:0:10" + }, + "scope": 3520, + "src": "7623:185:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + } + ], + "scope": 3521, + "src": "1232:6578:10" + } + ], + "src": "0:7811:10" + }, + "legacyAST": { + "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol", + "exportedSymbols": { + "ERC20": [ + 3520 + ] + }, + "id": 3521, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 3125, + "literals": [ + "solidity", + "^", + "0.5", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:23:10" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol", + "file": "./IERC20.sol", + "id": 3126, + "nodeType": "ImportDirective", + "scope": 3521, + "sourceUnit": 3648, + "src": "25:22:10", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/math/SafeMath.sol", + "file": "../../math/SafeMath.sol", + "id": 3127, + "nodeType": "ImportDirective", + "scope": 3521, + "sourceUnit": 3124, + "src": "48:33:10", + "symbolAliases": [], + "unitAlias": "" + }, + { + "baseContracts": [ + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 3128, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 3647, + "src": "1250:6:10", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$3647", + "typeString": "contract IERC20" + } + }, + "id": 3129, + "nodeType": "InheritanceSpecifier", + "src": "1250:6:10" + } + ], + "contractDependencies": [ + 3647 + ], + "contractKind": "contract", + "documentation": "@dev Implementation of the `IERC20` interface.\n * This implementation is agnostic to the way tokens are created. This means\nthat a supply mechanism has to be added in a derived contract using `_mint`.\nFor a generic mechanism see `ERC20Mintable`.\n * *For a detailed writeup see our guide [How to implement supply\nmechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*\n * We have followed general OpenZeppelin guidelines: functions revert instead\nof returning `false` on failure. This behavior is nonetheless conventional\nand does not conflict with the expectations of ERC20 applications.\n * Additionally, an `Approval` event is emitted on calls to `transferFrom`.\nThis allows applications to reconstruct the allowance for all accounts just\nby listening to said events. Other implementations of the EIP may not emit\nthese events, as it isn't required by the specification.\n * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`\nfunctions have been added to mitigate the well-known issues around setting\nallowances. See `IERC20.approve`.", + "fullyImplemented": true, + "id": 3520, + "linearizedBaseContracts": [ + 3520, + 3647 + ], + "name": "ERC20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 3132, + "libraryName": { + "contractScope": null, + "id": 3130, + "name": "SafeMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 3123, + "src": "1269:8:10", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SafeMath_$3123", + "typeString": "library SafeMath" + } + }, + "nodeType": "UsingForDirective", + "src": "1263:27:10", + "typeName": { + "id": 3131, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1282:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "constant": false, + "id": 3136, + "name": "_balances", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1296:46:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 3135, + "keyType": { + "id": 3133, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1305:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1296:28:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 3134, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1316:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "value": null, + "visibility": "private" + }, + { + "constant": false, + "id": 3142, + "name": "_allowances", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1349:69:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "typeName": { + "id": 3141, + "keyType": { + "id": 3137, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1358:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1349:49:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "valueType": { + "id": 3140, + "keyType": { + "id": 3138, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1378:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1369:28:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 3139, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1389:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + } + }, + "value": null, + "visibility": "private" + }, + { + "constant": false, + "id": 3144, + "name": "_totalSupply", + "nodeType": "VariableDeclaration", + "scope": 3520, + "src": "1425:28:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3143, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1425:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 3151, + "nodeType": "Block", + "src": "1567:36:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 3149, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "1584:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3148, + "id": 3150, + "nodeType": "Return", + "src": "1577:19:10" + } + ] + }, + "documentation": "@dev See `IERC20.totalSupply`.", + "id": 3152, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "totalSupply", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3145, + "nodeType": "ParameterList", + "parameters": [], + "src": "1534:2:10" + }, + "returnParameters": { + "id": 3148, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3147, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3152, + "src": "1558:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3146, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1558:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1557:9:10" + }, + "scope": 3520, + "src": "1514:89:10", + "stateMutability": "view", + "superFunction": 3585, + "visibility": "public" + }, + { + "body": { + "id": 3163, + "nodeType": "Block", + "src": "1727:42:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3159, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "1744:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3161, + "indexExpression": { + "argumentTypes": null, + "id": 3160, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3154, + "src": "1754:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1744:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3158, + "id": 3162, + "nodeType": "Return", + "src": "1737:25:10" + } + ] + }, + "documentation": "@dev See `IERC20.balanceOf`.", + "id": 3164, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "balanceOf", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3155, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3154, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3164, + "src": "1680:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3153, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1680:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1679:17:10" + }, + "returnParameters": { + "id": 3158, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3157, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3164, + "src": "1718:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3156, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1718:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1717:9:10" + }, + "scope": 3520, + "src": "1661:108:10", + "stateMutability": "view", + "superFunction": 3592, + "visibility": "public" + }, + { + "body": { + "id": 3182, + "nodeType": "Block", + "src": "2047:78:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3174, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2067:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2067:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3176, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3166, + "src": "2079:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3177, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3168, + "src": "2090:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3173, + "name": "_transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3363, + "src": "2057:9:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3178, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2057:40:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3179, + "nodeType": "ExpressionStatement", + "src": "2057:40:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3180, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2114:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3172, + "id": 3181, + "nodeType": "Return", + "src": "2107:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.transfer`.\n * Requirements:\n * - `recipient` cannot be the zero address.\n- the caller must have a balance of at least `amount`.", + "id": 3183, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3169, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3166, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "1990:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3165, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1990:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3168, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "2009:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3167, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2009:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1989:35:10" + }, + "returnParameters": { + "id": 3172, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3171, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3183, + "src": "2041:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3170, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2041:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2040:6:10" + }, + "scope": 3520, + "src": "1972:153:10", + "stateMutability": "nonpayable", + "superFunction": 3601, + "visibility": "public" + }, + { + "body": { + "id": 3198, + "nodeType": "Block", + "src": "2264:51:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3192, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "2281:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3194, + "indexExpression": { + "argumentTypes": null, + "id": 3193, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3185, + "src": "2293:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2281:18:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3196, + "indexExpression": { + "argumentTypes": null, + "id": 3195, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3187, + "src": "2300:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2281:27:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 3191, + "id": 3197, + "nodeType": "Return", + "src": "2274:34:10" + } + ] + }, + "documentation": "@dev See `IERC20.allowance`.", + "id": 3199, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "allowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3188, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3185, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2202:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3184, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2202:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3187, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2217:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3186, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2217:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2201:32:10" + }, + "returnParameters": { + "id": 3191, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3190, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3199, + "src": "2255:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3189, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2255:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2254:9:10" + }, + "scope": 3520, + "src": "2183:132:10", + "stateMutability": "view", + "superFunction": 3610, + "visibility": "public" + }, + { + "body": { + "id": 3217, + "nodeType": "Block", + "src": "2524:74:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3209, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2543:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3210, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2543:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3211, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3201, + "src": "2555:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3212, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3203, + "src": "2564:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3208, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "2534:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3213, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2534:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3214, + "nodeType": "ExpressionStatement", + "src": "2534:36:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3215, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2587:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3207, + "id": 3216, + "nodeType": "Return", + "src": "2580:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.approve`.\n * Requirements:\n * - `spender` cannot be the zero address.", + "id": 3218, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3204, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3201, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2470:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3200, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2470:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3203, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2487:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3202, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2487:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2469:32:10" + }, + "returnParameters": { + "id": 3207, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3206, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3218, + "src": "2518:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3205, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2518:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2517:6:10" + }, + "scope": 3520, + "src": "2453:145:10", + "stateMutability": "nonpayable", + "superFunction": 3619, + "visibility": "public" + }, + { + "body": { + "id": 3252, + "nodeType": "Block", + "src": "3150:157:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3230, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3170:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3231, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3222, + "src": "3178:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3232, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3224, + "src": "3189:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3229, + "name": "_transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3363, + "src": "3160:9:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3233, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3160:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3234, + "nodeType": "ExpressionStatement", + "src": "3160:36:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3236, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3215:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3237, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3223:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3238, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3223:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3246, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3224, + "src": "3271:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3239, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "3235:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3241, + "indexExpression": { + "argumentTypes": null, + "id": 3240, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3220, + "src": "3247:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3235:19:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3244, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3242, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3255:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3243, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3255:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3235:31:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "3235:35:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3247, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3235:43:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3235, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "3206:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3206:73:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3249, + "nodeType": "ExpressionStatement", + "src": "3206:73:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3250, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3296:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3228, + "id": 3251, + "nodeType": "Return", + "src": "3289:11:10" + } + ] + }, + "documentation": "@dev See `IERC20.transferFrom`.\n * Emits an `Approval` event indicating the updated allowance. This is not\nrequired by the EIP. See the note at the beginning of `ERC20`;\n * Requirements:\n- `sender` and `recipient` cannot be the zero address.\n- `sender` must have a balance of at least `value`.\n- the caller must have allowance for `sender`'s tokens of at least\n`amount`.", + "id": 3253, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "transferFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3225, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3220, + "name": "sender", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3077:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3219, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3077:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3222, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3093:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3221, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3093:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3224, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3112:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3223, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3112:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3076:51:10" + }, + "returnParameters": { + "id": 3228, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3227, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3253, + "src": "3144:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3226, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3144:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3143:6:10" + }, + "scope": 3520, + "src": "3055:252:10", + "stateMutability": "nonpayable", + "superFunction": 3630, + "visibility": "public" + }, + { + "body": { + "id": 3279, + "nodeType": "Block", + "src": "3788:117:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3263, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3807:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3264, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3807:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3265, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3255, + "src": "3819:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3273, + "name": "addedValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3257, + "src": "3865:10:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3266, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "3828:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3269, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3267, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "3840:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3840:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3828:23:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3271, + "indexExpression": { + "argumentTypes": null, + "id": 3270, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3255, + "src": "3852:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3828:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3272, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "3828:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3274, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3828:48:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3262, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "3798:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3798:79:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3276, + "nodeType": "ExpressionStatement", + "src": "3798:79:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3277, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3894:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3261, + "id": 3278, + "nodeType": "Return", + "src": "3887:11:10" + } + ] + }, + "documentation": "@dev Atomically increases the allowance granted to `spender` by the caller.\n * This is an alternative to `approve` that can be used as a mitigation for\nproblems described in `IERC20.approve`.\n * Emits an `Approval` event indicating the updated allowance.\n * Requirements:\n * - `spender` cannot be the zero address.", + "id": 3280, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "increaseAllowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3258, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3255, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3729:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3254, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3729:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3257, + "name": "addedValue", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3746:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3256, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3746:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3728:37:10" + }, + "returnParameters": { + "id": 3261, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3260, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3280, + "src": "3782:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3259, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3782:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3781:6:10" + }, + "scope": 3520, + "src": "3702:203:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 3306, + "nodeType": "Block", + "src": "4483:122:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3290, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "4502:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4502:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3292, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3282, + "src": "4514:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3300, + "name": "subtractedValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3284, + "src": "4560:15:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3293, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "4523:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3296, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3294, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "4535:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3295, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4535:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4523:23:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3298, + "indexExpression": { + "argumentTypes": null, + "id": 3297, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3282, + "src": "4547:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4523:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3299, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "4523:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3301, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4523:53:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3289, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "4493:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3302, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4493:84:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3303, + "nodeType": "ExpressionStatement", + "src": "4493:84:10" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 3304, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4594:4:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 3288, + "id": 3305, + "nodeType": "Return", + "src": "4587:11:10" + } + ] + }, + "documentation": "@dev Atomically decreases the allowance granted to `spender` by the caller.\n * This is an alternative to `approve` that can be used as a mitigation for\nproblems described in `IERC20.approve`.\n * Emits an `Approval` event indicating the updated allowance.\n * Requirements:\n * - `spender` cannot be the zero address.\n- `spender` must have allowance for the caller of at least\n`subtractedValue`.", + "id": 3307, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "decreaseAllowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3285, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3282, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4419:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3281, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4419:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3284, + "name": "subtractedValue", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4436:23:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3283, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4436:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4418:42:10" + }, + "returnParameters": { + "id": 3288, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3287, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 3307, + "src": "4477:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 3286, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4477:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4476:6:10" + }, + "scope": 3520, + "src": "4392:213:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 3362, + "nodeType": "Block", + "src": "5158:343:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3317, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5176:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3319, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5194:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3318, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5186:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3320, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5186:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5176:20:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373", + "id": 3322, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5198:39:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea", + "typeString": "literal_string \"ERC20: transfer from the zero address\"" + }, + "value": "ERC20: transfer from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea", + "typeString": "literal_string \"ERC20: transfer from the zero address\"" + } + ], + "id": 3316, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5168:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5168:70:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3324, + "nodeType": "ExpressionStatement", + "src": "5168:70:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3330, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3326, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5256:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3328, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5277:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3327, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5269:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3329, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5269:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5256:23:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a207472616e7366657220746f20746865207a65726f2061646472657373", + "id": 3331, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5281:37:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f", + "typeString": "literal_string \"ERC20: transfer to the zero address\"" + }, + "value": "ERC20: transfer to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f", + "typeString": "literal_string \"ERC20: transfer to the zero address\"" + } + ], + "id": 3325, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5248:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5248:71:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3333, + "nodeType": "ExpressionStatement", + "src": "5248:71:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3334, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5330:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3336, + "indexExpression": { + "argumentTypes": null, + "id": 3335, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5340:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5330:17:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3341, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5372:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3337, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5350:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3339, + "indexExpression": { + "argumentTypes": null, + "id": 3338, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5360:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5350:17:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3340, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "5350:21:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3342, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5350:29:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5330:49:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3344, + "nodeType": "ExpressionStatement", + "src": "5330:49:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3345, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5389:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3347, + "indexExpression": { + "argumentTypes": null, + "id": 3346, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5399:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5389:20:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3352, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5437:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3348, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5412:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3350, + "indexExpression": { + "argumentTypes": null, + "id": 3349, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5422:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5412:20:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3351, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5412:24:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3353, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5412:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5389:55:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3355, + "nodeType": "ExpressionStatement", + "src": "5389:55:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3357, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3309, + "src": "5468:6:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3358, + "name": "recipient", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3311, + "src": "5476:9:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3359, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3313, + "src": "5487:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3356, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "5459:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3360, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5459:35:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3361, + "nodeType": "EmitStatement", + "src": "5454:40:10" + } + ] + }, + "documentation": "@dev Moves tokens `amount` from `sender` to `recipient`.\n * This is internal function is equivalent to `transfer`, and can be used to\ne.g. implement automatic token fees, slashing mechanisms, etc.\n * Emits a `Transfer` event.\n * Requirements:\n * - `sender` cannot be the zero address.\n- `recipient` cannot be the zero address.\n- `sender` must have a balance of at least `amount`.", + "id": 3363, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3314, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3309, + "name": "sender", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5098:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3308, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5098:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3311, + "name": "recipient", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5114:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3310, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5114:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3313, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3363, + "src": "5133:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3312, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5133:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5097:51:10" + }, + "returnParameters": { + "id": 3315, + "nodeType": "ParameterList", + "parameters": [], + "src": "5158:0:10" + }, + "scope": 3520, + "src": "5079:422:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3405, + "nodeType": "Block", + "src": "5828:245:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3371, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5846:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5865:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3372, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5857:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5857:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "5846:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a206d696e7420746f20746865207a65726f2061646472657373", + "id": 3376, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5869:33:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e", + "typeString": "literal_string \"ERC20: mint to the zero address\"" + }, + "value": "ERC20: mint to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e", + "typeString": "literal_string \"ERC20: mint to the zero address\"" + } + ], + "id": 3370, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "5838:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3377, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5838:65:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3378, + "nodeType": "ExpressionStatement", + "src": "5838:65:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 3379, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "5914:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3382, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "5946:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 3380, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "5929:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3381, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5929:16:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3383, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5929:24:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5914:39:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3385, + "nodeType": "ExpressionStatement", + "src": "5914:39:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3386, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5963:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3388, + "indexExpression": { + "argumentTypes": null, + "id": 3387, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5973:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5963:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3393, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "6007:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3389, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "5984:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3391, + "indexExpression": { + "argumentTypes": null, + "id": 3390, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "5994:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5984:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 3017, + "src": "5984:22:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5984:30:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5963:51:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3396, + "nodeType": "ExpressionStatement", + "src": "5963:51:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3399, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6046:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6038:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3400, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6038:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3401, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3365, + "src": "6050:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3402, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3367, + "src": "6059:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3397, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "6029:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3403, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6029:37:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3404, + "nodeType": "EmitStatement", + "src": "6024:42:10" + } + ] + }, + "documentation": "@dev Creates `amount` tokens and assigns them to `account`, increasing\nthe total supply.\n * Emits a `Transfer` event with `from` set to the zero address.\n * Requirements\n * - `to` cannot be the zero address.", + "id": 3406, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_mint", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3368, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3365, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "5786:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3364, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5786:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3367, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3406, + "src": "5803:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3366, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5803:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5785:33:10" + }, + "returnParameters": { + "id": 3369, + "nodeType": "ParameterList", + "parameters": [], + "src": "5828:0:10" + }, + "scope": 3520, + "src": "5771:302:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3448, + "nodeType": "Block", + "src": "6448:244:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3418, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3414, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6466:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3416, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6485:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3415, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6477:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3417, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6477:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "6466:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a206275726e2066726f6d20746865207a65726f2061646472657373", + "id": 3419, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6489:35:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f", + "typeString": "literal_string \"ERC20: burn from the zero address\"" + }, + "value": "ERC20: burn from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f", + "typeString": "literal_string \"ERC20: burn from the zero address\"" + } + ], + "id": 3413, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "6458:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6458:67:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3421, + "nodeType": "ExpressionStatement", + "src": "6458:67:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3427, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 3422, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "6536:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3425, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6568:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 3423, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3144, + "src": "6551:12:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3424, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "6551:16:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3426, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6551:23:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6536:38:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3428, + "nodeType": "ExpressionStatement", + "src": "6536:38:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3429, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "6584:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3431, + "indexExpression": { + "argumentTypes": null, + "id": 3430, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6594:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "6584:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3436, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6628:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3432, + "name": "_balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3136, + "src": "6605:9:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3434, + "indexExpression": { + "argumentTypes": null, + "id": 3433, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6615:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6605:18:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3435, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "6605:22:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3437, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6605:29:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6584:50:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3439, + "nodeType": "ExpressionStatement", + "src": "6584:50:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3441, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3408, + "src": "6658:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6675:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3442, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6667:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3444, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6667:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 3445, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3410, + "src": "6679:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3440, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3638, + "src": "6649:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3446, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6649:36:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3447, + "nodeType": "EmitStatement", + "src": "6644:41:10" + } + ] + }, + "documentation": "@dev Destoys `amount` tokens from `account`, reducing the\ntotal supply.\n * Emits a `Transfer` event with `to` set to the zero address.\n * Requirements\n * - `account` cannot be the zero address.\n- `account` must have at least `amount` tokens.", + "id": 3449, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_burn", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3411, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3408, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3449, + "src": "6407:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3407, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6407:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3410, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3449, + "src": "6424:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3409, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6424:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6406:32:10" + }, + "returnParameters": { + "id": 3412, + "nodeType": "ParameterList", + "parameters": [], + "src": "6448:0:10" + }, + "scope": 3520, + "src": "6392:300:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3490, + "nodeType": "Block", + "src": "7191:255:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3459, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7209:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3461, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7226:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3460, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7218:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3462, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7218:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "7209:19:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373", + "id": 3464, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7230:38:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208", + "typeString": "literal_string \"ERC20: approve from the zero address\"" + }, + "value": "ERC20: approve from the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208", + "typeString": "literal_string \"ERC20: approve from the zero address\"" + } + ], + "id": 3458, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "7201:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3465, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7201:68:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3466, + "nodeType": "ExpressionStatement", + "src": "7201:68:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 3472, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 3468, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7287:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 3470, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7306:1:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 3469, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7298:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 3471, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7298:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "7287:21:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "45524332303a20617070726f766520746f20746865207a65726f2061646472657373", + "id": 3473, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7310:36:10", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029", + "typeString": "literal_string \"ERC20: approve to the zero address\"" + }, + "value": "ERC20: approve to the zero address" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029", + "typeString": "literal_string \"ERC20: approve to the zero address\"" + } + ], + "id": 3467, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3666, + "src": "7279:7:10", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 3474, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7279:68:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3475, + "nodeType": "ExpressionStatement", + "src": "7279:68:10" + }, + { + "expression": { + "argumentTypes": null, + "id": 3482, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3476, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "7358:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3479, + "indexExpression": { + "argumentTypes": null, + "id": 3477, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7370:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7358:18:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3480, + "indexExpression": { + "argumentTypes": null, + "id": 3478, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7377:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "7358:27:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 3481, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3455, + "src": "7388:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7358:35:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3483, + "nodeType": "ExpressionStatement", + "src": "7358:35:10" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3485, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3451, + "src": "7417:5:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3486, + "name": "spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3453, + "src": "7424:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3487, + "name": "value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3455, + "src": "7433:5:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3484, + "name": "Approval", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3646, + "src": "7408:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7408:31:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3489, + "nodeType": "EmitStatement", + "src": "7403:36:10" + } + ] + }, + "documentation": "@dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.\n * This is internal function is equivalent to `approve`, and can be used to\ne.g. set automatic allowances for certain subsystems, etc.\n * Emits an `Approval` event.\n * Requirements:\n * - `owner` cannot be the zero address.\n- `spender` cannot be the zero address.", + "id": 3491, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3456, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3451, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7135:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3450, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7135:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3453, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7150:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3452, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7150:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3455, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 3491, + "src": "7167:13:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3454, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7167:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7134:47:10" + }, + "returnParameters": { + "id": 3457, + "nodeType": "ParameterList", + "parameters": [], + "src": "7191:0:10" + }, + "scope": 3520, + "src": "7117:329:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 3518, + "nodeType": "Block", + "src": "7684:124:10", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3499, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7700:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 3500, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3495, + "src": "7709:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3498, + "name": "_burn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3449, + "src": "7694:5:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 3501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7694:22:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3502, + "nodeType": "ExpressionStatement", + "src": "7694:22:10" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3504, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7735:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3505, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "7744:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3506, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "7744:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 3514, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3495, + "src": "7793:6:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 3507, + "name": "_allowances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3142, + "src": "7756:11:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 3509, + "indexExpression": { + "argumentTypes": null, + "id": 3508, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3493, + "src": "7768:7:10", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7756:20:10", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 3512, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 3510, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "7777:3:10", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 3511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "7777:10:10", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7756:32:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 3513, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 3042, + "src": "7756:36:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 3515, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7756:44:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 3503, + "name": "_approve", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3491, + "src": "7726:8:10", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 3516, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7726:75:10", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 3517, + "nodeType": "ExpressionStatement", + "src": "7726:75:10" + } + ] + }, + "documentation": "@dev Destoys `amount` tokens from `account`.`amount` is then deducted\nfrom the caller's allowance.\n * See `_burn` and `_approve`.", + "id": 3519, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_burnFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 3496, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3493, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 3519, + "src": "7642:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 3492, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7642:7:10", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 3495, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 3519, + "src": "7659:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 3494, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7659:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7641:33:10" + }, + "returnParameters": { + "id": 3497, + "nodeType": "ParameterList", + "parameters": [], + "src": "7684:0:10" + }, + "scope": 3520, + "src": "7623:185:10", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + } + ], + "scope": 3521, + "src": "1232:6578:10" + } + ], + "src": "0:7811:10" + }, + "compiler": { + "name": "solc", + "version": "0.5.2+commit.1df8f40c.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "3.0.16", + "updatedAt": "2019-10-23T07:58:23.286Z", + "devdoc": { + "details": "Implementation of the `IERC20` interface. * This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using `_mint`. For a generic mechanism see `ERC20Mintable`. * *For a detailed writeup see our guide [How to implement supply mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. * Additionally, an `Approval` event is emitted on calls to `transferFrom`. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` functions have been added to mitigate the well-known issues around setting allowances. See `IERC20.approve`.", + "methods": { + "allowance(address,address)": { + "details": "See `IERC20.allowance`." + }, + "approve(address,uint256)": { + "details": "See `IERC20.approve`. * Requirements: * - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See `IERC20.balanceOf`." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. * This is an alternative to `approve` that can be used as a mitigation for problems described in `IERC20.approve`. * Emits an `Approval` event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. * This is an alternative to `approve` that can be used as a mitigation for problems described in `IERC20.approve`. * Emits an `Approval` event indicating the updated allowance. * Requirements: * - `spender` cannot be the zero address." + }, + "totalSupply()": { + "details": "See `IERC20.totalSupply`." + }, + "transfer(address,uint256)": { + "details": "See `IERC20.transfer`. * Requirements: * - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See `IERC20.transferFrom`. * Emits an `Approval` event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of `ERC20`; * Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `value`. - the caller must have allowance for `sender`'s tokens of at least `amount`." + } + } + }, + "userdoc": { + "methods": {} + } +} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/XBRMaintained.json b/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/XBRMaintained.json new file mode 100644 index 0000000..04446a4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/autobahn/xbr/contracts/XBRMaintained.json @@ -0,0 +1,2521 @@ +{ + "contractName": "XBRMaintained", + "abi": [ + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "account", + "type": "address" + } + ], + "name": "MaintainerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "account", + "type": "address" + } + ], + "name": "MaintainerRemoved", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "name": "account", + "type": "address" + } + ], + "name": "isMaintainer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "account", + "type": "address" + } + ], + "name": "addMaintainer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "renounceMaintainer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ], + "metadata": "", + "bytecode": "0x", + "deployedBytecode": "0x", + "sourceMap": "", + "deployedSourceMap": "", + "source": "///////////////////////////////////////////////////////////////////////////////\n//\n// Copyright (C) 2018-2019 Crossbar.io Technologies GmbH and contributors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n///////////////////////////////////////////////////////////////////////////////\n\npragma solidity ^0.5.2;\n\nimport \"openzeppelin-solidity/contracts/access/Roles.sol\";\n\n\n/**\n * XBR Network (and XBR Network Proxies) SCs inherit from this base contract\n * to manage network administration and maintenance via Role-based Access\n * Control (RBAC).\n * The implementation for management comes from the OpenZeppelin RBAC library.\n */\ncontract XBRMaintained {\n /// OpenZeppelin RBAC mixin.\n using Roles for Roles.Role;\n\n /**\n * Event fired when a maintainer was added.\n *\n * @param account The account that was added as a maintainer.\n */\n event MaintainerAdded(address indexed account);\n\n /**\n * Event fired when a maintainer was removed.\n *\n * @param account The account that was removed as a maintainer.\n */\n event MaintainerRemoved(address indexed account);\n\n /// Current list of XBR network maintainers.\n Roles.Role private maintainers;\n\n /// The constructor is internal (roles are managed by the OpenZeppelin base class).\n constructor () internal {\n _addMaintainer(msg.sender);\n }\n\n /**\n * Modifier to require maintainer-role for the sender when calling a SC.\n */\n modifier onlyMaintainer () {\n require(isMaintainer(msg.sender));\n _;\n }\n\n /**\n * Check if the given address is currently a maintainer.\n *\n * @param account The account to check.\n * @return `true` if the account is maintainer, otherwise `false`.\n */\n function isMaintainer (address account) public view returns (bool) {\n return maintainers.has(account);\n }\n\n /**\n * Add a new maintainer to the list of maintainers.\n *\n * @param account The account to grant maintainer rights to.\n */\n function addMaintainer (address account) public onlyMaintainer {\n _addMaintainer(account);\n }\n\n /**\n * Give away maintainer rights.\n */\n function renounceMaintainer () public {\n _removeMaintainer(msg.sender);\n }\n\n function _addMaintainer (address account) internal {\n maintainers.add(account);\n emit MaintainerAdded(account);\n }\n\n function _removeMaintainer (address account) internal {\n maintainers.remove(account);\n emit MaintainerRemoved(account);\n }\n}\n", + "sourcePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol", + "ast": { + "absolutePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol", + "exportedSymbols": { + "XBRMaintained": [ + 762 + ] + }, + "id": 763, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 661, + "literals": [ + "solidity", + "^", + "0.5", + ".2" + ], + "nodeType": "PragmaDirective", + "src": "810:23:2" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol", + "file": "openzeppelin-solidity/contracts/access/Roles.sol", + "id": 662, + "nodeType": "ImportDirective", + "scope": 763, + "sourceUnit": 2910, + "src": "835:58:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract\nto manage network administration and maintenance via Role-based Access\nControl (RBAC).\nThe implementation for management comes from the OpenZeppelin RBAC library.", + "fullyImplemented": true, + "id": 762, + "linearizedBaseContracts": [ + 762 + ], + "name": "XBRMaintained", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 665, + "libraryName": { + "contractScope": null, + "id": 663, + "name": "Roles", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2909, + "src": "1221:5:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Roles_$2909", + "typeString": "library Roles" + } + }, + "nodeType": "UsingForDirective", + "src": "1215:27:2", + "typeName": { + "contractScope": null, + "id": 664, + "name": "Roles.Role", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2835, + "src": "1231:10:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage_ptr", + "typeString": "struct Roles.Role" + } + } + }, + { + "anonymous": false, + "documentation": "Event fired when a maintainer was added.\n * @param account The account that was added as a maintainer.", + "id": 669, + "name": "MaintainerAdded", + "nodeType": "EventDefinition", + "parameters": { + "id": 668, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 667, + "indexed": true, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 669, + "src": "1407:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 666, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1407:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1406:25:2" + }, + "src": "1385:47:2" + }, + { + "anonymous": false, + "documentation": "Event fired when a maintainer was removed.\n * @param account The account that was removed as a maintainer.", + "id": 673, + "name": "MaintainerRemoved", + "nodeType": "EventDefinition", + "parameters": { + "id": 672, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 671, + "indexed": true, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 673, + "src": "1603:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 670, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1603:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1602:25:2" + }, + "src": "1579:49:2" + }, + { + "constant": false, + "id": 675, + "name": "maintainers", + "nodeType": "VariableDeclaration", + "scope": 762, + "src": "1683:30:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role" + }, + "typeName": { + "contractScope": null, + "id": 674, + "name": "Roles.Role", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2835, + "src": "1683:10:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage_ptr", + "typeString": "struct Roles.Role" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 683, + "nodeType": "Block", + "src": "1832:43:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 679, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "1857:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1857:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 678, + "name": "_addMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 745, + "src": "1842:14:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 681, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1842:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 682, + "nodeType": "ExpressionStatement", + "src": "1842:26:2" + } + ] + }, + "documentation": "The constructor is internal (roles are managed by the OpenZeppelin base class).", + "id": 684, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "1820:2:2" + }, + "returnParameters": { + "id": 677, + "nodeType": "ParameterList", + "parameters": [], + "src": "1832:0:2" + }, + "scope": 762, + "src": "1808:67:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 694, + "nodeType": "Block", + "src": "2001:61:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 688, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2032:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2032:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 687, + "name": "isMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 708, + "src": "2019:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$", + "typeString": "function (address) view returns (bool)" + } + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2019:24:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 686, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3665, + "src": "2011:7:2", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 691, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2011:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 692, + "nodeType": "ExpressionStatement", + "src": "2011:33:2" + }, + { + "id": 693, + "nodeType": "PlaceholderStatement", + "src": "2054:1:2" + } + ] + }, + "documentation": "Modifier to require maintainer-role for the sender when calling a SC.", + "id": 695, + "name": "onlyMaintainer", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 685, + "nodeType": "ParameterList", + "parameters": [], + "src": "1998:2:2" + }, + "src": "1974:88:2", + "visibility": "internal" + }, + { + "body": { + "id": 707, + "nodeType": "Block", + "src": "2334:48:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 704, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 697, + "src": "2367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 702, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2351:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 703, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "has", + "nodeType": "MemberAccess", + "referencedDeclaration": 2908, + "src": "2351:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)" + } + }, + "id": 705, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2351:24:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 701, + "id": 706, + "nodeType": "Return", + "src": "2344:31:2" + } + ] + }, + "documentation": "Check if the given address is currently a maintainer.\n * @param account The account to check.\n@return `true` if the account is maintainer, otherwise `false`.", + "id": 708, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 698, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 697, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "2290:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 696, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2290:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2289:17:2" + }, + "returnParameters": { + "id": 701, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 700, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "2328:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 699, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2328:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2327:6:2" + }, + "scope": 762, + "src": "2267:115:2", + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 719, + "nodeType": "Block", + "src": "2595:40:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 716, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 710, + "src": "2620:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 715, + "name": "_addMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 745, + "src": "2605:14:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2605:23:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 718, + "nodeType": "ExpressionStatement", + "src": "2605:23:2" + } + ] + }, + "documentation": "Add a new maintainer to the list of maintainers.\n * @param account The account to grant maintainer rights to.", + "id": 720, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 713, + "modifierName": { + "argumentTypes": null, + "id": 712, + "name": "onlyMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 695, + "src": "2580:14:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "2580:14:2" + } + ], + "name": "addMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 711, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 710, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 720, + "src": "2556:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 709, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2556:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2555:17:2" + }, + "returnParameters": { + "id": 714, + "nodeType": "ParameterList", + "parameters": [], + "src": "2595:0:2" + }, + "scope": 762, + "src": "2532:103:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 728, + "nodeType": "Block", + "src": "2731:46:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2759:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2759:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 723, + "name": "_removeMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 761, + "src": "2741:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2741:29:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "2741:29:2" + } + ] + }, + "documentation": "Give away maintainer rights.", + "id": 729, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "renounceMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 721, + "nodeType": "ParameterList", + "parameters": [], + "src": "2721:2:2" + }, + "returnParameters": { + "id": 722, + "nodeType": "ParameterList", + "parameters": [], + "src": "2731:0:2" + }, + "scope": 762, + "src": "2693:84:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 744, + "nodeType": "Block", + "src": "2834:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 737, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 731, + "src": "2860:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 734, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2844:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 736, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 2860, + "src": "2844:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address)" + } + }, + "id": 738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2844:24:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 739, + "nodeType": "ExpressionStatement", + "src": "2844:24:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 741, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 731, + "src": "2899:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 740, + "name": "MaintainerAdded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "2883:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2883:24:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 743, + "nodeType": "EmitStatement", + "src": "2878:29:2" + } + ] + }, + "documentation": null, + "id": 745, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_addMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 732, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 731, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 745, + "src": "2808:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 730, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2808:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2807:17:2" + }, + "returnParameters": { + "id": 733, + "nodeType": "ParameterList", + "parameters": [], + "src": "2834:0:2" + }, + "scope": 762, + "src": "2783:131:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 760, + "nodeType": "Block", + "src": "2974:85:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 753, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 747, + "src": "3003:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 750, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2984:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 752, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "remove", + "nodeType": "MemberAccess", + "referencedDeclaration": 2884, + "src": "2984:18:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address)" + } + }, + "id": 754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2984:27:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 755, + "nodeType": "ExpressionStatement", + "src": "2984:27:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 757, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 747, + "src": "3044:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 756, + "name": "MaintainerRemoved", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 673, + "src": "3026:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 758, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3026:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 759, + "nodeType": "EmitStatement", + "src": "3021:31:2" + } + ] + }, + "documentation": null, + "id": 761, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_removeMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 748, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 747, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 761, + "src": "2948:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 746, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2948:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2947:17:2" + }, + "returnParameters": { + "id": 749, + "nodeType": "ParameterList", + "parameters": [], + "src": "2974:0:2" + }, + "scope": 762, + "src": "2920:139:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + } + ], + "scope": 763, + "src": "1153:1908:2" + } + ], + "src": "810:2252:2" + }, + "legacyAST": { + "absolutePath": "/home/oberstet/scm/crossbario/xbr-protocol/contracts/XBRMaintained.sol", + "exportedSymbols": { + "XBRMaintained": [ + 762 + ] + }, + "id": 763, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 661, + "literals": [ + "solidity", + "^", + "0.5", + ".2" + ], + "nodeType": "PragmaDirective", + "src": "810:23:2" + }, + { + "absolutePath": "openzeppelin-solidity/contracts/access/Roles.sol", + "file": "openzeppelin-solidity/contracts/access/Roles.sol", + "id": 662, + "nodeType": "ImportDirective", + "scope": 763, + "sourceUnit": 2910, + "src": "835:58:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract\nto manage network administration and maintenance via Role-based Access\nControl (RBAC).\nThe implementation for management comes from the OpenZeppelin RBAC library.", + "fullyImplemented": true, + "id": 762, + "linearizedBaseContracts": [ + 762 + ], + "name": "XBRMaintained", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 665, + "libraryName": { + "contractScope": null, + "id": 663, + "name": "Roles", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2909, + "src": "1221:5:2", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Roles_$2909", + "typeString": "library Roles" + } + }, + "nodeType": "UsingForDirective", + "src": "1215:27:2", + "typeName": { + "contractScope": null, + "id": 664, + "name": "Roles.Role", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2835, + "src": "1231:10:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage_ptr", + "typeString": "struct Roles.Role" + } + } + }, + { + "anonymous": false, + "documentation": "Event fired when a maintainer was added.\n * @param account The account that was added as a maintainer.", + "id": 669, + "name": "MaintainerAdded", + "nodeType": "EventDefinition", + "parameters": { + "id": 668, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 667, + "indexed": true, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 669, + "src": "1407:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 666, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1407:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1406:25:2" + }, + "src": "1385:47:2" + }, + { + "anonymous": false, + "documentation": "Event fired when a maintainer was removed.\n * @param account The account that was removed as a maintainer.", + "id": 673, + "name": "MaintainerRemoved", + "nodeType": "EventDefinition", + "parameters": { + "id": 672, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 671, + "indexed": true, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 673, + "src": "1603:23:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 670, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1603:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1602:25:2" + }, + "src": "1579:49:2" + }, + { + "constant": false, + "id": 675, + "name": "maintainers", + "nodeType": "VariableDeclaration", + "scope": 762, + "src": "1683:30:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role" + }, + "typeName": { + "contractScope": null, + "id": 674, + "name": "Roles.Role", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2835, + "src": "1683:10:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage_ptr", + "typeString": "struct Roles.Role" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 683, + "nodeType": "Block", + "src": "1832:43:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 679, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "1857:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1857:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 678, + "name": "_addMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 745, + "src": "1842:14:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 681, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1842:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 682, + "nodeType": "ExpressionStatement", + "src": "1842:26:2" + } + ] + }, + "documentation": "The constructor is internal (roles are managed by the OpenZeppelin base class).", + "id": 684, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "1820:2:2" + }, + "returnParameters": { + "id": 677, + "nodeType": "ParameterList", + "parameters": [], + "src": "1832:0:2" + }, + "scope": 762, + "src": "1808:67:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 694, + "nodeType": "Block", + "src": "2001:61:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 688, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2032:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2032:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 687, + "name": "isMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 708, + "src": "2019:12:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$", + "typeString": "function (address) view returns (bool)" + } + }, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2019:24:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 686, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 3665, + 3666 + ], + "referencedDeclaration": 3665, + "src": "2011:7:2", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 691, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2011:33:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 692, + "nodeType": "ExpressionStatement", + "src": "2011:33:2" + }, + { + "id": 693, + "nodeType": "PlaceholderStatement", + "src": "2054:1:2" + } + ] + }, + "documentation": "Modifier to require maintainer-role for the sender when calling a SC.", + "id": 695, + "name": "onlyMaintainer", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 685, + "nodeType": "ParameterList", + "parameters": [], + "src": "1998:2:2" + }, + "src": "1974:88:2", + "visibility": "internal" + }, + { + "body": { + "id": 707, + "nodeType": "Block", + "src": "2334:48:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 704, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 697, + "src": "2367:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 702, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2351:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 703, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "has", + "nodeType": "MemberAccess", + "referencedDeclaration": 2908, + "src": "2351:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address) view returns (bool)" + } + }, + "id": 705, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2351:24:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 701, + "id": 706, + "nodeType": "Return", + "src": "2344:31:2" + } + ] + }, + "documentation": "Check if the given address is currently a maintainer.\n * @param account The account to check.\n@return `true` if the account is maintainer, otherwise `false`.", + "id": 708, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 698, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 697, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "2290:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 696, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2290:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2289:17:2" + }, + "returnParameters": { + "id": 701, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 700, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "2328:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 699, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2328:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2327:6:2" + }, + "scope": 762, + "src": "2267:115:2", + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 719, + "nodeType": "Block", + "src": "2595:40:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 716, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 710, + "src": "2620:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 715, + "name": "_addMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 745, + "src": "2605:14:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 717, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2605:23:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 718, + "nodeType": "ExpressionStatement", + "src": "2605:23:2" + } + ] + }, + "documentation": "Add a new maintainer to the list of maintainers.\n * @param account The account to grant maintainer rights to.", + "id": 720, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 713, + "modifierName": { + "argumentTypes": null, + "id": 712, + "name": "onlyMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 695, + "src": "2580:14:2", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "2580:14:2" + } + ], + "name": "addMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 711, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 710, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 720, + "src": "2556:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 709, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2556:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2555:17:2" + }, + "returnParameters": { + "id": 714, + "nodeType": "ParameterList", + "parameters": [], + "src": "2595:0:2" + }, + "scope": 762, + "src": "2532:103:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 728, + "nodeType": "Block", + "src": "2731:46:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 724, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3662, + "src": "2759:3:2", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "2759:10:2", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "id": 723, + "name": "_removeMaintainer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 761, + "src": "2741:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2741:29:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 727, + "nodeType": "ExpressionStatement", + "src": "2741:29:2" + } + ] + }, + "documentation": "Give away maintainer rights.", + "id": 729, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "renounceMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 721, + "nodeType": "ParameterList", + "parameters": [], + "src": "2721:2:2" + }, + "returnParameters": { + "id": 722, + "nodeType": "ParameterList", + "parameters": [], + "src": "2731:0:2" + }, + "scope": 762, + "src": "2693:84:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 744, + "nodeType": "Block", + "src": "2834:80:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 737, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 731, + "src": "2860:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 734, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2844:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 736, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 2860, + "src": "2844:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address)" + } + }, + "id": 738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2844:24:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 739, + "nodeType": "ExpressionStatement", + "src": "2844:24:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 741, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 731, + "src": "2899:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 740, + "name": "MaintainerAdded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "2883:15:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2883:24:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 743, + "nodeType": "EmitStatement", + "src": "2878:29:2" + } + ] + }, + "documentation": null, + "id": 745, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_addMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 732, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 731, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 745, + "src": "2808:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 730, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2808:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2807:17:2" + }, + "returnParameters": { + "id": 733, + "nodeType": "ParameterList", + "parameters": [], + "src": "2834:0:2" + }, + "scope": 762, + "src": "2783:131:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 760, + "nodeType": "Block", + "src": "2974:85:2", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 753, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 747, + "src": "3003:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 750, + "name": "maintainers", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 675, + "src": "2984:11:2", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Role_$2835_storage", + "typeString": "struct Roles.Role storage ref" + } + }, + "id": 752, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "remove", + "nodeType": "MemberAccess", + "referencedDeclaration": 2884, + "src": "2984:18:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Role_$2835_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Role_$2835_storage_ptr_$", + "typeString": "function (struct Roles.Role storage pointer,address)" + } + }, + "id": 754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2984:27:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 755, + "nodeType": "ExpressionStatement", + "src": "2984:27:2" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 757, + "name": "account", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 747, + "src": "3044:7:2", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 756, + "name": "MaintainerRemoved", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 673, + "src": "3026:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 758, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3026:26:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 759, + "nodeType": "EmitStatement", + "src": "3021:31:2" + } + ] + }, + "documentation": null, + "id": 761, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_removeMaintainer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 748, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 747, + "name": "account", + "nodeType": "VariableDeclaration", + "scope": 761, + "src": "2948:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 746, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2948:7:2", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2947:17:2" + }, + "returnParameters": { + "id": 749, + "nodeType": "ParameterList", + "parameters": [], + "src": "2974:0:2" + }, + "scope": 762, + "src": "2920:139:2", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "internal" + } + ], + "scope": 763, + "src": "1153:1908:2" + } + ], + "src": "810:2252:2" + }, + "compiler": { + "name": "solc", + "version": "0.5.2+commit.1df8f40c.Emscripten.clang" + }, + "networks": {}, + "schemaVersion": "3.0.16", + "updatedAt": "2019-10-23T07:58:23.254Z", + "devdoc": { + "methods": { + "addMaintainer(address)": { + "params": { + "account": "The account to grant maintainer rights to." + } + }, + "isMaintainer(address)": { + "params": { + "account": "The account to check." + }, + "return": "`true` if the account is maintainer, otherwise `false`." + } + } + }, + "userdoc": { + "methods": { + "addMaintainer(address)": { + "notice": "Add a new maintainer to the list of maintainers." + }, + "constructor": "The constructor is internal (roles are managed by the OpenZeppelin base class).", + "isMaintainer(address)": { + "notice": "Check if the given address is currently a maintainer." + }, + "renounceMaintainer()": { + "notice": "Give away maintainer rights." + } + }, + "notice": "XBR Network (and XBR Network Proxies) SCs inherit from this base contract to manage network administration and maintenance via Role-based Access Control (RBAC). The implementation for management comes from the OpenZeppelin RBAC library." + } +} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/automat/_test/__init__.py b/venv/lib/python3.7/site-packages/automat/_test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/automat/_test/test_core.py b/venv/lib/python3.7/site-packages/automat/_test/test_core.py new file mode 100644 index 0000000..a9ff050 --- /dev/null +++ b/venv/lib/python3.7/site-packages/automat/_test/test_core.py @@ -0,0 +1,86 @@ + +from .._core import Automaton, NoTransition + +from unittest import TestCase + +class CoreTests(TestCase): + """ + Tests for Automat's (currently private, implementation detail) core. + """ + + def test_NoTransition(self): + """ + A L{NoTransition} exception describes the state and input symbol + that caused it. + """ + # NoTransition requires two arguments + with self.assertRaises(TypeError): + NoTransition() + + state = "current-state" + symbol = "transitionless-symbol" + noTransitionException = NoTransition(state=state, symbol=symbol) + + self.assertIs(noTransitionException.symbol, symbol) + + self.assertIn(state, str(noTransitionException)) + self.assertIn(symbol, str(noTransitionException)) + + + def test_noOutputForInput(self): + """ + L{Automaton.outputForInput} raises L{NoTransition} if no + transition for that input is defined. + """ + a = Automaton() + self.assertRaises(NoTransition, a.outputForInput, + "no-state", "no-symbol") + + + def test_oneTransition(self): + """ + L{Automaton.addTransition} adds its input symbol to + L{Automaton.inputAlphabet}, all its outputs to + L{Automaton.outputAlphabet}, and causes L{Automaton.outputForInput} to + start returning the new state and output symbols. + """ + a = Automaton() + a.addTransition("beginning", "begin", "ending", ["end"]) + self.assertEqual(a.inputAlphabet(), {"begin"}) + self.assertEqual(a.outputAlphabet(), {"end"}) + self.assertEqual(a.outputForInput("beginning", "begin"), + ("ending", ["end"])) + self.assertEqual(a.states(), {"beginning", "ending"}) + + + def test_oneTransition_nonIterableOutputs(self): + """ + L{Automaton.addTransition} raises a TypeError when given outputs + that aren't iterable and doesn't add any transitions. + """ + a = Automaton() + nonIterableOutputs = 1 + self.assertRaises( + TypeError, + a.addTransition, + "fromState", "viaSymbol", "toState", nonIterableOutputs) + self.assertFalse(a.inputAlphabet()) + self.assertFalse(a.outputAlphabet()) + self.assertFalse(a.states()) + self.assertFalse(a.allTransitions()) + + + def test_initialState(self): + """ + L{Automaton.initialState} is a descriptor that sets the initial + state if it's not yet set, and raises L{ValueError} if it is. + + """ + a = Automaton() + a.initialState = "a state" + self.assertEqual(a.initialState, "a state") + with self.assertRaises(ValueError): + a.initialState = "another state" + + +# FIXME: addTransition for transition that's been added before diff --git a/venv/lib/python3.7/site-packages/automat/_test/test_discover.py b/venv/lib/python3.7/site-packages/automat/_test/test_discover.py new file mode 100644 index 0000000..2aaf16a --- /dev/null +++ b/venv/lib/python3.7/site-packages/automat/_test/test_discover.py @@ -0,0 +1,609 @@ +import operator +import os +import shutil +import sys +import textwrap +import tempfile +from unittest import skipIf, TestCase + +import six + + +def isTwistedInstalled(): + try: + __import__('twisted') + except ImportError: + return False + else: + return True + + +class _WritesPythonModules(TestCase): + """ + A helper that enables generating Python module test fixtures. + """ + + def setUp(self): + super(_WritesPythonModules, self).setUp() + + from twisted.python.modules import getModule, PythonPath + from twisted.python.filepath import FilePath + + self.getModule = getModule + self.PythonPath = PythonPath + self.FilePath = FilePath + + self.originalSysModules = set(sys.modules.keys()) + self.savedSysPath = sys.path[:] + + self.pathDir = tempfile.mkdtemp() + self.makeImportable(self.pathDir) + + def tearDown(self): + super(_WritesPythonModules, self).tearDown() + + sys.path[:] = self.savedSysPath + modulesToDelete = six.viewkeys(sys.modules) - self.originalSysModules + for module in modulesToDelete: + del sys.modules[module] + + shutil.rmtree(self.pathDir) + + def makeImportable(self, path): + sys.path.append(path) + + def writeSourceInto(self, source, path, moduleName): + directory = self.FilePath(path) + + module = directory.child(moduleName) + # FilePath always opens a file in binary mode - but that will + # break on Python 3 + with open(module.path, 'w') as f: + f.write(textwrap.dedent(source)) + + return self.PythonPath([directory.path]) + + def makeModule(self, source, path, moduleName): + pythonModuleName, _ = os.path.splitext(moduleName) + return self.writeSourceInto(source, path, moduleName)[pythonModuleName] + + def attributesAsDict(self, hasIterAttributes): + return {attr.name: attr for attr in hasIterAttributes.iterAttributes()} + + def loadModuleAsDict(self, module): + module.load() + return self.attributesAsDict(module) + + def makeModuleAsDict(self, source, path, name): + return self.loadModuleAsDict(self.makeModule(source, path, name)) + + +@skipIf(not isTwistedInstalled(), "Twisted is not installed.") +class OriginalLocationTests(_WritesPythonModules): + """ + Tests that L{isOriginalLocation} detects when a + L{PythonAttribute}'s FQPN refers to an object inside the module + where it was defined. + + For example: A L{twisted.python.modules.PythonAttribute} with a + name of 'foo.bar' that refers to a 'bar' object defined in module + 'baz' does *not* refer to bar's original location, while a + L{PythonAttribute} with a name of 'baz.bar' does. + + """ + def setUp(self): + super(OriginalLocationTests, self).setUp() + from .._discover import isOriginalLocation + self.isOriginalLocation = isOriginalLocation + + def test_failsWithNoModule(self): + """ + L{isOriginalLocation} returns False when the attribute refers to an + object whose source module cannot be determined. + """ + source = """\ + class Fake(object): + pass + hasEmptyModule = Fake() + hasEmptyModule.__module__ = None + """ + + moduleDict = self.makeModuleAsDict(source, + self.pathDir, + 'empty_module_attr.py') + + self.assertFalse(self.isOriginalLocation( + moduleDict['empty_module_attr.hasEmptyModule'])) + + def test_failsWithDifferentModule(self): + """ + L{isOriginalLocation} returns False when the attribute refers to + an object outside of the module where that object was defined. + """ + originalSource = """\ + class ImportThisClass(object): + pass + importThisObject = ImportThisClass() + importThisNestingObject = ImportThisClass() + importThisNestingObject.nestedObject = ImportThisClass() + """ + + importingSource = """\ + from original import (ImportThisClass, + importThisObject, + importThisNestingObject) + """ + + self.makeModule(originalSource, self.pathDir, 'original.py') + importingDict = self.makeModuleAsDict(importingSource, + self.pathDir, + 'importing.py') + self.assertFalse( + self.isOriginalLocation( + importingDict['importing.ImportThisClass'])) + self.assertFalse( + self.isOriginalLocation( + importingDict['importing.importThisObject'])) + + nestingObject = importingDict['importing.importThisNestingObject'] + nestingObjectDict = self.attributesAsDict(nestingObject) + nestedObject = nestingObjectDict[ + 'importing.importThisNestingObject.nestedObject'] + + self.assertFalse(self.isOriginalLocation(nestedObject)) + + def test_succeedsWithSameModule(self): + """ + L{isOriginalLocation} returns True when the attribute refers to an + object inside the module where that object was defined. + """ + mSource = textwrap.dedent(""" + class ThisClassWasDefinedHere(object): + pass + anObject = ThisClassWasDefinedHere() + aNestingObject = ThisClassWasDefinedHere() + aNestingObject.nestedObject = ThisClassWasDefinedHere() + """) + mDict = self.makeModuleAsDict(mSource, self.pathDir, 'm.py') + self.assertTrue(self.isOriginalLocation( + mDict['m.ThisClassWasDefinedHere'])) + self.assertTrue(self.isOriginalLocation(mDict['m.aNestingObject'])) + + nestingObject = mDict['m.aNestingObject'] + nestingObjectDict = self.attributesAsDict(nestingObject) + nestedObject = nestingObjectDict['m.aNestingObject.nestedObject'] + + self.assertTrue(self.isOriginalLocation(nestedObject)) + + +@skipIf(not isTwistedInstalled(), "Twisted is not installed.") +class FindMachinesViaWrapperTests(_WritesPythonModules): + """ + L{findMachinesViaWrapper} recursively yields FQPN, + L{MethodicalMachine} pairs in and under a given + L{twisted.python.modules.PythonModule} or + L{twisted.python.modules.PythonAttribute}. + """ + TEST_MODULE_SOURCE = """ + from automat import MethodicalMachine + + + class PythonClass(object): + _classMachine = MethodicalMachine() + + class NestedClass(object): + _nestedClassMachine = MethodicalMachine() + + ignoredAttribute = "I am ignored." + + def ignoredMethod(self): + "I am also ignored." + + rootLevelMachine = MethodicalMachine() + ignoredPythonObject = PythonClass() + anotherIgnoredPythonObject = "I am ignored." + """ + + def setUp(self): + super(FindMachinesViaWrapperTests, self).setUp() + from .._discover import findMachinesViaWrapper + self.findMachinesViaWrapper = findMachinesViaWrapper + + def test_yieldsMachine(self): + """ + When given a L{twisted.python.modules.PythonAttribute} that refers + directly to a L{MethodicalMachine}, L{findMachinesViaWrapper} + yields that machine and its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + rootMachine = MethodicalMachine() + """ + + moduleDict = self.makeModuleAsDict(source, self.pathDir, 'root.py') + rootMachine = moduleDict['root.rootMachine'] + self.assertIn(('root.rootMachine', rootMachine.load()), + list(self.findMachinesViaWrapper(rootMachine))) + + def test_yieldsMachineInClass(self): + """ + When given a L{twisted.python.modules.PythonAttribute} that refers + to a class that contains a L{MethodicalMachine} as a class + variable, L{findMachinesViaWrapper} yields that machine and + its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + class PythonClass(object): + _classMachine = MethodicalMachine() + """ + moduleDict = self.makeModuleAsDict(source, self.pathDir, 'clsmod.py') + PythonClass = moduleDict['clsmod.PythonClass'] + self.assertIn(('clsmod.PythonClass._classMachine', + PythonClass.load()._classMachine), + list(self.findMachinesViaWrapper(PythonClass))) + + def test_yieldsMachineInNestedClass(self): + """ + When given a L{twisted.python.modules.PythonAttribute} that refers + to a nested class that contains a L{MethodicalMachine} as a + class variable, L{findMachinesViaWrapper} yields that machine + and its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + class PythonClass(object): + class NestedClass(object): + _classMachine = MethodicalMachine() + """ + moduleDict = self.makeModuleAsDict(source, + self.pathDir, + 'nestedcls.py') + + PythonClass = moduleDict['nestedcls.PythonClass'] + self.assertIn(('nestedcls.PythonClass.NestedClass._classMachine', + PythonClass.load().NestedClass._classMachine), + list(self.findMachinesViaWrapper(PythonClass))) + + def test_yieldsMachineInModule(self): + """ + When given a L{twisted.python.modules.PythonModule} that refers to + a module that contains a L{MethodicalMachine}, + L{findMachinesViaWrapper} yields that machine and its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + rootMachine = MethodicalMachine() + """ + module = self.makeModule(source, self.pathDir, 'root.py') + rootMachine = self.loadModuleAsDict(module)['root.rootMachine'].load() + self.assertIn(('root.rootMachine', rootMachine), + list(self.findMachinesViaWrapper(module))) + + def test_yieldsMachineInClassInModule(self): + """ + When given a L{twisted.python.modules.PythonModule} that refers to + the original module of a class containing a + L{MethodicalMachine}, L{findMachinesViaWrapper} yields that + machine and its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + class PythonClass(object): + _classMachine = MethodicalMachine() + """ + module = self.makeModule(source, self.pathDir, 'clsmod.py') + PythonClass = self.loadModuleAsDict( + module)['clsmod.PythonClass'].load() + self.assertIn(('clsmod.PythonClass._classMachine', + PythonClass._classMachine), + list(self.findMachinesViaWrapper(module))) + + def test_yieldsMachineInNestedClassInModule(self): + """ + When given a L{twisted.python.modules.PythonModule} that refers to + the original module of a nested class containing a + L{MethodicalMachine}, L{findMachinesViaWrapper} yields that + machine and its FQPN. + """ + source = """\ + from automat import MethodicalMachine + + class PythonClass(object): + class NestedClass(object): + _classMachine = MethodicalMachine() + """ + module = self.makeModule(source, self.pathDir, 'nestedcls.py') + PythonClass = self.loadModuleAsDict( + module)['nestedcls.PythonClass'].load() + + self.assertIn(('nestedcls.PythonClass.NestedClass._classMachine', + PythonClass.NestedClass._classMachine), + list(self.findMachinesViaWrapper(module))) + + def test_ignoresImportedClass(self): + """ + When given a L{twisted.python.modules.PythonAttribute} that refers + to a class imported from another module, any + L{MethodicalMachine}s on that class are ignored. + + This behavior ensures that a machine is only discovered on a + class when visiting the module where that class was defined. + """ + originalSource = """ + from automat import MethodicalMachine + + class PythonClass(object): + _classMachine = MethodicalMachine() + """ + + importingSource = """ + from original import PythonClass + """ + + self.makeModule(originalSource, self.pathDir, 'original.py') + importingModule = self.makeModule(importingSource, + self.pathDir, + 'importing.py') + + self.assertFalse(list(self.findMachinesViaWrapper(importingModule))) + + def test_descendsIntoPackages(self): + """ + L{findMachinesViaWrapper} descends into packages to discover + machines. + """ + pythonPath = self.PythonPath([self.pathDir]) + package = self.FilePath(self.pathDir).child("test_package") + package.makedirs() + package.child('__init__.py').touch() + + source = """ + from automat import MethodicalMachine + + + class PythonClass(object): + _classMachine = MethodicalMachine() + + + rootMachine = MethodicalMachine() + """ + self.makeModule(source, package.path, 'module.py') + + test_package = pythonPath['test_package'] + machines = sorted(self.findMachinesViaWrapper(test_package), + key=operator.itemgetter(0)) + + moduleDict = self.loadModuleAsDict(test_package['module']) + rootMachine = moduleDict['test_package.module.rootMachine'].load() + PythonClass = moduleDict['test_package.module.PythonClass'].load() + + expectedMachines = sorted( + [('test_package.module.rootMachine', + rootMachine), + ('test_package.module.PythonClass._classMachine', + PythonClass._classMachine)], key=operator.itemgetter(0)) + + self.assertEqual(expectedMachines, machines) + + def test_infiniteLoop(self): + """ + L{findMachinesViaWrapper} ignores infinite loops. + + Note this test can't fail - it can only run forever! + """ + source = """ + class InfiniteLoop(object): + pass + + InfiniteLoop.loop = InfiniteLoop + """ + module = self.makeModule(source, self.pathDir, 'loop.py') + self.assertFalse(list(self.findMachinesViaWrapper(module))) + + +@skipIf(not isTwistedInstalled(), "Twisted is not installed.") +class WrapFQPNTests(TestCase): + """ + Tests that ensure L{wrapFQPN} loads the + L{twisted.python.modules.PythonModule} or + L{twisted.python.modules.PythonAttribute} for a given FQPN. + """ + + def setUp(self): + from twisted.python.modules import PythonModule, PythonAttribute + from .._discover import wrapFQPN, InvalidFQPN, NoModule, NoObject + + self.PythonModule = PythonModule + self.PythonAttribute = PythonAttribute + self.wrapFQPN = wrapFQPN + self.InvalidFQPN = InvalidFQPN + self.NoModule = NoModule + self.NoObject = NoObject + + def assertModuleWrapperRefersTo(self, moduleWrapper, module): + """ + Assert that a L{twisted.python.modules.PythonModule} refers to a + particular Python module. + """ + self.assertIsInstance(moduleWrapper, self.PythonModule) + self.assertEqual(moduleWrapper.name, module.__name__) + self.assertIs(moduleWrapper.load(), module) + + def assertAttributeWrapperRefersTo(self, attributeWrapper, fqpn, obj): + """ + Assert that a L{twisted.python.modules.PythonAttribute} refers to a + particular Python object. + """ + self.assertIsInstance(attributeWrapper, self.PythonAttribute) + self.assertEqual(attributeWrapper.name, fqpn) + self.assertIs(attributeWrapper.load(), obj) + + def test_failsWithEmptyFQPN(self): + """ + L{wrapFQPN} raises L{InvalidFQPN} when given an empty string. + """ + with self.assertRaises(self.InvalidFQPN): + self.wrapFQPN('') + + def test_failsWithBadDotting(self): + """" + L{wrapFQPN} raises L{InvalidFQPN} when given a badly-dotted + FQPN. (e.g., x..y). + """ + for bad in ('.fails', 'fails.', 'this..fails'): + with self.assertRaises(self.InvalidFQPN): + self.wrapFQPN(bad) + + def test_singleModule(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonModule} + referring to the single module a dotless FQPN describes. + """ + import os + + moduleWrapper = self.wrapFQPN('os') + + self.assertIsInstance(moduleWrapper, self.PythonModule) + self.assertIs(moduleWrapper.load(), os) + + def test_failsWithMissingSingleModuleOrPackage(self): + """ + L{wrapFQPN} raises L{NoModule} when given a dotless FQPN that does + not refer to a module or package. + """ + with self.assertRaises(self.NoModule): + self.wrapFQPN("this is not an acceptable name!") + + def test_singlePackage(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonModule} + referring to the single package a dotless FQPN describes. + """ + import xml + self.assertModuleWrapperRefersTo(self.wrapFQPN('xml'), xml) + + def test_multiplePackages(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonModule} + referring to the deepest package described by dotted FQPN. + """ + import xml.etree + self.assertModuleWrapperRefersTo(self.wrapFQPN('xml.etree'), xml.etree) + + def test_multiplePackagesFinalModule(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonModule} + referring to the deepest module described by dotted FQPN. + """ + import xml.etree.ElementTree + self.assertModuleWrapperRefersTo( + self.wrapFQPN('xml.etree.ElementTree'), xml.etree.ElementTree) + + def test_singleModuleObject(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonAttribute} + referring to the deepest object an FQPN names, traversing one module. + """ + import os + self.assertAttributeWrapperRefersTo( + self.wrapFQPN('os.path'), 'os.path', os.path) + + def test_multiplePackagesObject(self): + """ + L{wrapFQPN} returns a L{twisted.python.modules.PythonAttribute} + referring to the deepest object described by an FQPN, + descending through several packages. + """ + import xml.etree.ElementTree + import automat + + for fqpn, obj in [('xml.etree.ElementTree.fromstring', + xml.etree.ElementTree.fromstring), + ('automat.MethodicalMachine.__doc__', + automat.MethodicalMachine.__doc__)]: + self.assertAttributeWrapperRefersTo( + self.wrapFQPN(fqpn), fqpn, obj) + + def test_failsWithMultiplePackagesMissingModuleOrPackage(self): + """ + L{wrapFQPN} raises L{NoObject} when given an FQPN that contains a + missing attribute, module, or package. + """ + for bad in ('xml.etree.nope!', + 'xml.etree.nope!.but.the.rest.is.believable'): + with self.assertRaises(self.NoObject): + self.wrapFQPN(bad) + + +@skipIf(not isTwistedInstalled(), "Twisted is not installed.") +class FindMachinesIntegrationTests(_WritesPythonModules): + """ + Integration tests to check that L{findMachines} yields all + machines discoverable at or below an FQPN. + """ + + SOURCE = """ + from automat import MethodicalMachine + + class PythonClass(object): + _machine = MethodicalMachine() + ignored = "i am ignored" + + rootLevel = MethodicalMachine() + + ignored = "i am ignored" + """ + + def setUp(self): + super(FindMachinesIntegrationTests, self).setUp() + from .._discover import findMachines + + self.findMachines = findMachines + + packageDir = self.FilePath(self.pathDir).child("test_package") + packageDir.makedirs() + self.pythonPath = self.PythonPath([self.pathDir]) + self.writeSourceInto(self.SOURCE, packageDir.path, '__init__.py') + + subPackageDir = packageDir.child('subpackage') + subPackageDir.makedirs() + subPackageDir.child('__init__.py').touch() + + self.makeModule(self.SOURCE, subPackageDir.path, 'module.py') + + self.packageDict = self.loadModuleAsDict( + self.pythonPath['test_package']) + self.moduleDict = self.loadModuleAsDict( + self.pythonPath['test_package']['subpackage']['module']) + + def test_discoverAll(self): + """ + Given a top-level package FQPN, L{findMachines} discovers all + L{MethodicalMachine} instances in and below it. + """ + machines = sorted(self.findMachines('test_package'), + key=operator.itemgetter(0)) + + tpRootLevel = self.packageDict['test_package.rootLevel'].load() + tpPythonClass = self.packageDict['test_package.PythonClass'].load() + + mRLAttr = self.moduleDict['test_package.subpackage.module.rootLevel'] + mRootLevel = mRLAttr.load() + mPCAttr = self.moduleDict['test_package.subpackage.module.PythonClass'] + mPythonClass = mPCAttr.load() + + expectedMachines = sorted( + [('test_package.rootLevel', tpRootLevel), + ('test_package.PythonClass._machine', tpPythonClass._machine), + ('test_package.subpackage.module.rootLevel', mRootLevel), + ('test_package.subpackage.module.PythonClass._machine', + mPythonClass._machine)], + key=operator.itemgetter(0)) + + self.assertEqual(expectedMachines, machines) diff --git a/venv/lib/python3.7/site-packages/automat/_test/test_trace.py b/venv/lib/python3.7/site-packages/automat/_test/test_trace.py new file mode 100644 index 0000000..6d7433b --- /dev/null +++ b/venv/lib/python3.7/site-packages/automat/_test/test_trace.py @@ -0,0 +1,98 @@ +from unittest import TestCase +from .._methodical import MethodicalMachine + +class SampleObject(object): + mm = MethodicalMachine() + + @mm.state(initial=True) + def begin(self): + "initial state" + @mm.state() + def middle(self): + "middle state" + @mm.state() + def end(self): + "end state" + + @mm.input() + def go1(self): + "sample input" + @mm.input() + def go2(self): + "sample input" + @mm.input() + def back(self): + "sample input" + + @mm.output() + def out(self): + "sample output" + + setTrace = mm._setTrace + + begin.upon(go1, middle, [out]) + middle.upon(go2, end, [out]) + end.upon(back, middle, []) + middle.upon(back, begin, []) + +class TraceTests(TestCase): + def test_only_inputs(self): + traces = [] + def tracer(old_state, input, new_state): + traces.append((old_state, input, new_state)) + return None # "I only care about inputs, not outputs" + s = SampleObject() + s.setTrace(tracer) + + s.go1() + self.assertEqual(traces, [("begin", "go1", "middle"), + ]) + + s.go2() + self.assertEqual(traces, [("begin", "go1", "middle"), + ("middle", "go2", "end"), + ]) + s.setTrace(None) + s.back() + self.assertEqual(traces, [("begin", "go1", "middle"), + ("middle", "go2", "end"), + ]) + s.go2() + self.assertEqual(traces, [("begin", "go1", "middle"), + ("middle", "go2", "end"), + ]) + + def test_inputs_and_outputs(self): + traces = [] + def tracer(old_state, input, new_state): + traces.append((old_state, input, new_state, None)) + def trace_outputs(output): + traces.append((old_state, input, new_state, output)) + return trace_outputs # "I care about outputs too" + s = SampleObject() + s.setTrace(tracer) + + s.go1() + self.assertEqual(traces, [("begin", "go1", "middle", None), + ("begin", "go1", "middle", "out"), + ]) + + s.go2() + self.assertEqual(traces, [("begin", "go1", "middle", None), + ("begin", "go1", "middle", "out"), + ("middle", "go2", "end", None), + ("middle", "go2", "end", "out"), + ]) + s.setTrace(None) + s.back() + self.assertEqual(traces, [("begin", "go1", "middle", None), + ("begin", "go1", "middle", "out"), + ("middle", "go2", "end", None), + ("middle", "go2", "end", "out"), + ]) + s.go2() + self.assertEqual(traces, [("begin", "go1", "middle", None), + ("begin", "go1", "middle", "out"), + ("middle", "go2", "end", None), + ("middle", "go2", "end", "out"), + ]) diff --git a/venv/lib/python3.7/site-packages/automat/_test/test_visualize.py b/venv/lib/python3.7/site-packages/automat/_test/test_visualize.py new file mode 100644 index 0000000..987eb3c --- /dev/null +++ b/venv/lib/python3.7/site-packages/automat/_test/test_visualize.py @@ -0,0 +1,430 @@ +from __future__ import print_function +import functools + +import os +import subprocess +from unittest import TestCase, skipIf + +import attr + +from .._methodical import MethodicalMachine + +from .test_discover import isTwistedInstalled + + +def isGraphvizModuleInstalled(): + """ + Is the graphviz Python module installed? + """ + try: + __import__("graphviz") + except ImportError: + return False + else: + return True + + +def isGraphvizInstalled(): + """ + Are the graphviz tools installed? + """ + r, w = os.pipe() + os.close(w) + try: + return not subprocess.call("dot", stdin=r, shell=True) + finally: + os.close(r) + + + +def sampleMachine(): + """ + Create a sample L{MethodicalMachine} with some sample states. + """ + mm = MethodicalMachine() + class SampleObject(object): + @mm.state(initial=True) + def begin(self): + "initial state" + @mm.state() + def end(self): + "end state" + @mm.input() + def go(self): + "sample input" + @mm.output() + def out(self): + "sample output" + begin.upon(go, end, [out]) + so = SampleObject() + so.go() + return mm + + +@skipIf(not isGraphvizModuleInstalled(), "Graphviz module is not installed.") +class ElementMakerTests(TestCase): + """ + L{elementMaker} generates HTML representing the specified element. + """ + + def setUp(self): + from .._visualize import elementMaker + self.elementMaker = elementMaker + + def test_sortsAttrs(self): + """ + L{elementMaker} orders HTML attributes lexicographically. + """ + expected = r'
' + self.assertEqual(expected, + self.elementMaker("div", + b='2', + a='1', + c='3')) + + def test_quotesAttrs(self): + """ + L{elementMaker} quotes HTML attributes according to DOT's quoting rule. + + See U{http://www.graphviz.org/doc/info/lang.html}, footnote 1. + """ + expected = r'
' + self.assertEqual(expected, + self.elementMaker("div", + b='a " quote', + a=1, + c="a string")) + + def test_noAttrs(self): + """ + L{elementMaker} should render an element with no attributes. + """ + expected = r'
' + self.assertEqual(expected, self.elementMaker("div")) + + +@attr.s +class HTMLElement(object): + """Holds an HTML element, as created by elementMaker.""" + name = attr.ib() + children = attr.ib() + attributes = attr.ib() + + +def findElements(element, predicate): + """ + Recursively collect all elements in an L{HTMLElement} tree that + match the optional predicate. + """ + if predicate(element): + return [element] + elif isLeaf(element): + return [] + + return [result + for child in element.children + for result in findElements(child, predicate)] + + +def isLeaf(element): + """ + This HTML element is actually leaf node. + """ + return not isinstance(element, HTMLElement) + + +@skipIf(not isGraphvizModuleInstalled(), "Graphviz module is not installed.") +class TableMakerTests(TestCase): + """ + Tests that ensure L{tableMaker} generates HTML tables usable as + labels in DOT graphs. + + For more information, read the "HTML-Like Labels" section of + U{http://www.graphviz.org/doc/info/shapes.html}. + """ + + def fakeElementMaker(self, name, *children, **attributes): + return HTMLElement(name=name, children=children, attributes=attributes) + + def setUp(self): + from .._visualize import tableMaker + + self.inputLabel = "input label" + self.port = "the port" + self.tableMaker = functools.partial(tableMaker, + _E=self.fakeElementMaker) + + def test_inputLabelRow(self): + """ + The table returned by L{tableMaker} always contains the input + symbol label in its first row, and that row contains one cell + with a port attribute set to the provided port. + """ + + def hasPort(element): + return (not isLeaf(element) + and element.attributes.get("port") == self.port) + + for outputLabels in ([], ["an output label"]): + table = self.tableMaker(self.inputLabel, outputLabels, + port=self.port) + self.assertGreater(len(table.children), 0) + inputLabelRow = table.children[0] + + portCandidates = findElements(table, hasPort) + + self.assertEqual(len(portCandidates), 1) + self.assertEqual(portCandidates[0].name, "td") + self.assertEqual(findElements(inputLabelRow, isLeaf), + [self.inputLabel]) + + def test_noOutputLabels(self): + """ + L{tableMaker} does not add a colspan attribute to the input + label's cell or a second row if there no output labels. + """ + table = self.tableMaker("input label", (), port=self.port) + self.assertEqual(len(table.children), 1) + (inputLabelRow,) = table.children + self.assertNotIn("colspan", inputLabelRow.attributes) + + def test_withOutputLabels(self): + """ + L{tableMaker} adds a colspan attribute to the input label's cell + equal to the number of output labels and a second row that + contains the output labels. + """ + table = self.tableMaker(self.inputLabel, ("output label 1", + "output label 2"), + port=self.port) + + self.assertEqual(len(table.children), 2) + inputRow, outputRow = table.children + + def hasCorrectColspan(element): + return (not isLeaf(element) + and element.name == "td" + and element.attributes.get('colspan') == "2") + + self.assertEqual(len(findElements(inputRow, hasCorrectColspan)), + 1) + self.assertEqual(findElements(outputRow, isLeaf), ["output label 1", + "output label 2"]) + + +@skipIf(not isGraphvizModuleInstalled(), "Graphviz module is not installed.") +@skipIf(not isGraphvizInstalled(), "Graphviz tools are not installed.") +class IntegrationTests(TestCase): + """ + Tests which make sure Graphviz can understand the output produced by + Automat. + """ + + def test_validGraphviz(self): + """ + L{graphviz} emits valid graphviz data. + """ + p = subprocess.Popen("dot", stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + out, err = p.communicate("".join(sampleMachine().asDigraph()) + .encode("utf-8")) + self.assertEqual(p.returncode, 0) + + +@skipIf(not isGraphvizModuleInstalled(), "Graphviz module is not installed.") +class SpotChecks(TestCase): + """ + Tests to make sure that the output contains salient features of the machine + being generated. + """ + + def test_containsMachineFeatures(self): + """ + The output of L{graphviz} should contain the names of the states, + inputs, outputs in the state machine. + """ + gvout = "".join(sampleMachine().asDigraph()) + self.assertIn("begin", gvout) + self.assertIn("end", gvout) + self.assertIn("go", gvout) + self.assertIn("out", gvout) + + +class RecordsDigraphActions(object): + """ + Records calls made to L{FakeDigraph}. + """ + + def __init__(self): + self.reset() + + def reset(self): + self.renderCalls = [] + self.saveCalls = [] + + +class FakeDigraph(object): + """ + A fake L{graphviz.Digraph}. Instantiate it with a + L{RecordsDigraphActions}. + """ + + def __init__(self, recorder): + self._recorder = recorder + + def render(self, **kwargs): + self._recorder.renderCalls.append(kwargs) + + def save(self, **kwargs): + self._recorder.saveCalls.append(kwargs) + + +class FakeMethodicalMachine(object): + """ + A fake L{MethodicalMachine}. Instantiate it with a L{FakeDigraph} + """ + + def __init__(self, digraph): + self._digraph = digraph + + def asDigraph(self): + return self._digraph + + +@skipIf(not isGraphvizModuleInstalled(), "Graphviz module is not installed.") +@skipIf(not isGraphvizInstalled(), "Graphviz tools are not installed.") +@skipIf(not isTwistedInstalled(), "Twisted is not installed.") +class VisualizeToolTests(TestCase): + + def setUp(self): + self.digraphRecorder = RecordsDigraphActions() + self.fakeDigraph = FakeDigraph(self.digraphRecorder) + + self.fakeProgname = 'tool-test' + self.fakeSysPath = ['ignored'] + self.collectedOutput = [] + self.fakeFQPN = 'fake.fqpn' + + def collectPrints(self, *args): + self.collectedOutput.append(' '.join(args)) + + def fakeFindMachines(self, fqpn): + yield fqpn, FakeMethodicalMachine(self.fakeDigraph) + + def tool(self, + progname=None, + argv=None, + syspath=None, + findMachines=None, + print=None): + from .._visualize import tool + return tool( + _progname=progname or self.fakeProgname, + _argv=argv or [self.fakeFQPN], + _syspath=syspath or self.fakeSysPath, + _findMachines=findMachines or self.fakeFindMachines, + _print=print or self.collectPrints) + + def test_checksCurrentDirectory(self): + """ + L{tool} adds '' to sys.path to ensure + L{automat._discover.findMachines} searches the current + directory. + """ + self.tool(argv=[self.fakeFQPN]) + self.assertEqual(self.fakeSysPath[0], '') + + def test_quietHidesOutput(self): + """ + Passing -q/--quiet hides all output. + """ + self.tool(argv=[self.fakeFQPN, '--quiet']) + self.assertFalse(self.collectedOutput) + self.tool(argv=[self.fakeFQPN, '-q']) + self.assertFalse(self.collectedOutput) + + def test_onlySaveDot(self): + """ + Passing an empty string for --image-directory/-i disables + rendering images. + """ + for arg in ('--image-directory', '-i'): + self.digraphRecorder.reset() + self.collectedOutput = [] + + self.tool(argv=[self.fakeFQPN, arg, '']) + self.assertFalse(any("image" in line + for line in self.collectedOutput)) + + self.assertEqual(len(self.digraphRecorder.saveCalls), 1) + (call,) = self.digraphRecorder.saveCalls + self.assertEqual("{}.dot".format(self.fakeFQPN), + call['filename']) + + self.assertFalse(self.digraphRecorder.renderCalls) + + def test_saveOnlyImage(self): + """ + Passing an empty string for --dot-directory/-d disables saving dot + files. + """ + for arg in ('--dot-directory', '-d'): + self.digraphRecorder.reset() + self.collectedOutput = [] + self.tool(argv=[self.fakeFQPN, arg, '']) + + self.assertFalse(any("dot" in line + for line in self.collectedOutput)) + + self.assertEqual(len(self.digraphRecorder.renderCalls), 1) + (call,) = self.digraphRecorder.renderCalls + self.assertEqual("{}.dot".format(self.fakeFQPN), + call['filename']) + self.assertTrue(call['cleanup']) + + self.assertFalse(self.digraphRecorder.saveCalls) + + def test_saveDotAndImagesInDifferentDirectories(self): + """ + Passing different directories to --image-directory and --dot-directory + writes images and dot files to those directories. + """ + imageDirectory = 'image' + dotDirectory = 'dot' + self.tool(argv=[self.fakeFQPN, + '--image-directory', imageDirectory, + '--dot-directory', dotDirectory]) + + self.assertTrue(any("image" in line + for line in self.collectedOutput)) + self.assertTrue(any("dot" in line + for line in self.collectedOutput)) + + self.assertEqual(len(self.digraphRecorder.renderCalls), 1) + (renderCall,) = self.digraphRecorder.renderCalls + self.assertEqual(renderCall["directory"], imageDirectory) + self.assertTrue(renderCall['cleanup']) + + self.assertEqual(len(self.digraphRecorder.saveCalls), 1) + (saveCall,) = self.digraphRecorder.saveCalls + self.assertEqual(saveCall["directory"], dotDirectory) + + def test_saveDotAndImagesInSameDirectory(self): + """ + Passing the same directory to --image-directory and --dot-directory + writes images and dot files to that one directory. + """ + directory = 'imagesAndDot' + self.tool(argv=[self.fakeFQPN, + '--image-directory', directory, + '--dot-directory', directory]) + + self.assertTrue(any("image and dot" in line + for line in self.collectedOutput)) + + self.assertEqual(len(self.digraphRecorder.renderCalls), 1) + (renderCall,) = self.digraphRecorder.renderCalls + self.assertEqual(renderCall["directory"], directory) + self.assertFalse(renderCall['cleanup']) + + self.assertFalse(len(self.digraphRecorder.saveCalls)) diff --git a/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/METADATA b/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/METADATA new file mode 100644 index 0000000..bc0532f --- /dev/null +++ b/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/METADATA @@ -0,0 +1,74 @@ +Metadata-Version: 2.0 +Name: certifi +Version: 2019.11.28 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python2.7/site-packages/certifi/cacert.pem + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/metadata.json b/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/metadata.json new file mode 100644 index 0000000..3a14841 --- /dev/null +++ b/venv/lib/python3.7/site-packages/certifi-2019.11.28.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7"], "extensions": {"python.details": {"contacts": [{"email": "me@kennethreitz.com", "name": "Kenneth Reitz", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://certifi.io/"}}}, "generator": "bdist_wheel (0.30.0.a0)", "license": "MPL-2.0", "metadata_version": "2.0", "name": "certifi", "summary": "Python package for providing Mozilla's CA Bundle.", "version": "2019.11.28"} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/certifi/cacert.pem b/venv/lib/python3.7/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..a4758ef --- /dev/null +++ b/venv/lib/python3.7/site-packages/certifi/cacert.pem @@ -0,0 +1,4602 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- diff --git a/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/METADATA b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/METADATA new file mode 100644 index 0000000..9bbb9ee --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/METADATA @@ -0,0 +1,36 @@ +Metadata-Version: 2.1 +Name: cffi +Version: 1.13.2 +Summary: Foreign Function Interface for Python calling C code. +Home-page: http://cffi.readthedocs.org +Author: Armin Rigo, Maciej Fijalkowski +Author-email: python-cffi@googlegroups.com +License: MIT +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Dist: pycparser + + +CFFI +==== + +Foreign Function Interface for Python calling C code. +Please see the `Documentation `_. + +Contact +------- + +`Mailing list `_ + + diff --git a/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/RECORD b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/RECORD new file mode 100644 index 0000000..a6ab8f3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/RECORD @@ -0,0 +1,44 @@ +_cffi_backend.cpython-37m-darwin.so,sha256=LJzSWP4IkbkOAteI0N3d_C0N6WbcaMVgMTtnenPD7cs,405376 +cffi/__init__.py,sha256=S9BTr5ma0KrdRubi0WQGrLfmLhRgkYWvLaGRqy2xiPc,513 +cffi/_cffi_errors.h,sha256=6nFQ-4dRQI1bXRoSeqdvyKU33TmutQJB_2fAhWSzdl8,3856 +cffi/_cffi_include.h,sha256=JuFfmwpRE65vym3Nxr9vDMOIEuv21tXdarkL1l2WNms,12149 +cffi/_embedding.h,sha256=fXmvYWE96kCgekPNX1_FnYAUJ9I6gnSrBhhRAHKdhww,17411 +cffi/api.py,sha256=Q07iwDD0FRwWa2fx2ZzQft69iJs9aNR52fvrtUy3EY4,41800 +cffi/backend_ctypes.py,sha256=h5ZIzLc6BFVXnGyc9xPqZWUS7qGy7yFSDqXe68Sa8z4,42454 +cffi/cffi_opcode.py,sha256=v9RdD_ovA8rCtqsC95Ivki5V667rAOhGgs3fb2q9xpM,5724 +cffi/commontypes.py,sha256=QS4uxCDI7JhtTyjh1hlnCA-gynmaszWxJaRRLGkJa1A,2689 +cffi/cparser.py,sha256=l4Hy6H2H3q4-0-Mv-5ld3mkH4qRFybWz2CTwNUtNpw0,42071 +cffi/error.py,sha256=v6xTiS4U0kvDcy4h_BDRo5v39ZQuj-IMRYLv5ETddZs,877 +cffi/ffiplatform.py,sha256=HMXqR8ks2wtdsNxGaWpQ_PyqIvtiuos_vf1qKCy-cwg,4046 +cffi/lock.py,sha256=l9TTdwMIMpi6jDkJGnQgE9cvTIR7CAntIJr8EGHt3pY,747 +cffi/model.py,sha256=AYyjS26uiFKXtkm43qmStpy9zfGh5HVJF4UETYFBt6w,21682 +cffi/parse_c_type.h,sha256=OdwQfwM9ktq6vlCB43exFQmxDBtj2MBNdK8LYl15tjw,5976 +cffi/pkgconfig.py,sha256=LP1w7vmWvmKwyqLaU1Z243FOWGNQMrgMUZrvgFuOlco,4374 +cffi/recompiler.py,sha256=9BR4oOQ9wFTMrp6CGa4Pa4U1pAU64Mv5-KwW5Hdn3ZM,62755 +cffi/setuptools_ext.py,sha256=qc6arfrSzm4RNT5oJz6d5td7KJ-pHfI7bqYD0X4Q-08,8848 +cffi/vengine_cpy.py,sha256=hdyjjZNijLrg_uGMnnFyC-7GG_LxWtwB8BlS2vvVDQ0,41470 +cffi/vengine_gen.py,sha256=Zkq0-EdeZwn6qUvf_CI8iUEs2UxVIvDmKCH1j0-y0GI,26676 +cffi/verifier.py,sha256=J9Enz2rbJb9CHPqWlWQ5uQESoyr0uc7MNWugchjXBv4,11207 +cffi-1.13.2.dist-info/LICENSE,sha256=BLgPWwd7vtaICM_rreteNSPyqMmpZJXFh72W3x6sKjM,1294 +cffi-1.13.2.dist-info/METADATA,sha256=7iXowU_BLqDyZXb5vOztg3wha0RmjMcxL_MtvN0EnDo,1140 +cffi-1.13.2.dist-info/WHEEL,sha256=ZAPg4sh1IYHKqp2FoarXKab2VRxd7s7md0doFSVDALY,109 +cffi-1.13.2.dist-info/entry_points.txt,sha256=Q9f5C9IpjYxo0d2PK9eUcnkgxHc9pHWwjEMaANPKNCI,76 +cffi-1.13.2.dist-info/top_level.txt,sha256=rE7WR3rZfNKxWI9-jn6hsHCAl7MDkB-FmuQbxWjFehQ,19 +cffi-1.13.2.dist-info/RECORD,, +cffi-1.13.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cffi/__pycache__/ffiplatform.cpython-37.pyc,, +cffi/__pycache__/commontypes.cpython-37.pyc,, +cffi/__pycache__/cffi_opcode.cpython-37.pyc,, +cffi/__pycache__/backend_ctypes.cpython-37.pyc,, +cffi/__pycache__/model.cpython-37.pyc,, +cffi/__pycache__/vengine_cpy.cpython-37.pyc,, +cffi/__pycache__/verifier.cpython-37.pyc,, +cffi/__pycache__/pkgconfig.cpython-37.pyc,, +cffi/__pycache__/lock.cpython-37.pyc,, +cffi/__pycache__/cparser.cpython-37.pyc,, +cffi/__pycache__/setuptools_ext.cpython-37.pyc,, +cffi/__pycache__/vengine_gen.cpython-37.pyc,, +cffi/__pycache__/api.cpython-37.pyc,, +cffi/__pycache__/error.cpython-37.pyc,, +cffi/__pycache__/__init__.cpython-37.pyc,, +cffi/__pycache__/recompiler.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/top_level.txt new file mode 100644 index 0000000..f645779 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi-1.13.2.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_cffi_backend +cffi diff --git a/venv/lib/python3.7/site-packages/cffi/_cffi_errors.h b/venv/lib/python3.7/site-packages/cffi/_cffi_errors.h new file mode 100644 index 0000000..83cdad0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/_cffi_errors.h @@ -0,0 +1,147 @@ +#ifndef CFFI_MESSAGEBOX +# ifdef _MSC_VER +# define CFFI_MESSAGEBOX 1 +# else +# define CFFI_MESSAGEBOX 0 +# endif +#endif + + +#if CFFI_MESSAGEBOX +/* Windows only: logic to take the Python-CFFI embedding logic + initialization errors and display them in a background thread + with MessageBox. The idea is that if the whole program closes + as a result of this problem, then likely it is already a console + program and you can read the stderr output in the console too. + If it is not a console program, then it will likely show its own + dialog to complain, or generally not abruptly close, and for this + case the background thread should stay alive. +*/ +static void *volatile _cffi_bootstrap_text; + +static PyObject *_cffi_start_error_capture(void) +{ + PyObject *result = NULL; + PyObject *x, *m, *bi; + + if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text, + (void *)1, NULL) != NULL) + return (PyObject *)1; + + m = PyImport_AddModule("_cffi_error_capture"); + if (m == NULL) + goto error; + + result = PyModule_GetDict(m); + if (result == NULL) + goto error; + +#if PY_MAJOR_VERSION >= 3 + bi = PyImport_ImportModule("builtins"); +#else + bi = PyImport_ImportModule("__builtin__"); +#endif + if (bi == NULL) + goto error; + PyDict_SetItemString(result, "__builtins__", bi); + Py_DECREF(bi); + + x = PyRun_String( + "import sys\n" + "class FileLike:\n" + " def write(self, x):\n" + " try:\n" + " of.write(x)\n" + " except: pass\n" + " self.buf += x\n" + "fl = FileLike()\n" + "fl.buf = ''\n" + "of = sys.stderr\n" + "sys.stderr = fl\n" + "def done():\n" + " sys.stderr = of\n" + " return fl.buf\n", /* make sure the returned value stays alive */ + Py_file_input, + result, result); + Py_XDECREF(x); + + error: + if (PyErr_Occurred()) + { + PyErr_WriteUnraisable(Py_None); + PyErr_Clear(); + } + return result; +} + +#pragma comment(lib, "user32.lib") + +static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored) +{ + Sleep(666); /* may be interrupted if the whole process is closing */ +#if PY_MAJOR_VERSION >= 3 + MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text, + L"Python-CFFI error", + MB_OK | MB_ICONERROR); +#else + MessageBoxA(NULL, (char *)_cffi_bootstrap_text, + "Python-CFFI error", + MB_OK | MB_ICONERROR); +#endif + _cffi_bootstrap_text = NULL; + return 0; +} + +static void _cffi_stop_error_capture(PyObject *ecap) +{ + PyObject *s; + void *text; + + if (ecap == (PyObject *)1) + return; + + if (ecap == NULL) + goto error; + + s = PyRun_String("done()", Py_eval_input, ecap, ecap); + if (s == NULL) + goto error; + + /* Show a dialog box, but in a background thread, and + never show multiple dialog boxes at once. */ +#if PY_MAJOR_VERSION >= 3 + text = PyUnicode_AsWideCharString(s, NULL); +#else + text = PyString_AsString(s); +#endif + + _cffi_bootstrap_text = text; + + if (text != NULL) + { + HANDLE h; + h = CreateThread(NULL, 0, _cffi_bootstrap_dialog, + NULL, 0, NULL); + if (h != NULL) + CloseHandle(h); + } + /* decref the string, but it should stay alive as 'fl.buf' + in the small module above. It will really be freed only if + we later get another similar error. So it's a leak of at + most one copy of the small module. That's fine for this + situation which is usually a "fatal error" anyway. */ + Py_DECREF(s); + PyErr_Clear(); + return; + + error: + _cffi_bootstrap_text = NULL; + PyErr_Clear(); +} + +#else + +static PyObject *_cffi_start_error_capture(void) { return NULL; } +static void _cffi_stop_error_capture(PyObject *ecap) { } + +#endif diff --git a/venv/lib/python3.7/site-packages/cffi/commontypes.py b/venv/lib/python3.7/site-packages/cffi/commontypes.py new file mode 100644 index 0000000..8ec97c7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/commontypes.py @@ -0,0 +1,80 @@ +import sys +from . import model +from .error import FFIError + + +COMMON_TYPES = {} + +try: + # fetch "bool" and all simple Windows types + from _cffi_backend import _get_common_types + _get_common_types(COMMON_TYPES) +except ImportError: + pass + +COMMON_TYPES['FILE'] = model.unknown_type('FILE', '_IO_FILE') +COMMON_TYPES['bool'] = '_Bool' # in case we got ImportError above + +for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + if _type.endswith('_t'): + COMMON_TYPES[_type] = _type +del _type + +_CACHE = {} + +def resolve_common_type(parser, commontype): + try: + return _CACHE[commontype] + except KeyError: + cdecl = COMMON_TYPES.get(commontype, commontype) + if not isinstance(cdecl, str): + result, quals = cdecl, 0 # cdecl is already a BaseType + elif cdecl in model.PrimitiveType.ALL_PRIMITIVE_TYPES: + result, quals = model.PrimitiveType(cdecl), 0 + elif cdecl == 'set-unicode-needed': + raise FFIError("The Windows type %r is only available after " + "you call ffi.set_unicode()" % (commontype,)) + else: + if commontype == cdecl: + raise FFIError( + "Unsupported type: %r. Please look at " + "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations " + "and file an issue if you think this type should really " + "be supported." % (commontype,)) + result, quals = parser.parse_type_and_quals(cdecl) # recursive + + assert isinstance(result, model.BaseTypeByIdentity) + _CACHE[commontype] = result, quals + return result, quals + + +# ____________________________________________________________ +# extra types for Windows (most of them are in commontypes.c) + + +def win_common_types(): + return { + "UNICODE_STRING": model.StructType( + "_UNICODE_STRING", + ["Length", + "MaximumLength", + "Buffer"], + [model.PrimitiveType("unsigned short"), + model.PrimitiveType("unsigned short"), + model.PointerType(model.PrimitiveType("wchar_t"))], + [-1, -1, -1]), + "PUNICODE_STRING": "UNICODE_STRING *", + "PCUNICODE_STRING": "const UNICODE_STRING *", + + "TBYTE": "set-unicode-needed", + "TCHAR": "set-unicode-needed", + "LPCTSTR": "set-unicode-needed", + "PCTSTR": "set-unicode-needed", + "LPTSTR": "set-unicode-needed", + "PTSTR": "set-unicode-needed", + "PTBYTE": "set-unicode-needed", + "PTCHAR": "set-unicode-needed", + } + +if sys.platform == 'win32': + COMMON_TYPES.update(win_common_types()) diff --git a/venv/lib/python3.7/site-packages/cffi/cparser.py b/venv/lib/python3.7/site-packages/cffi/cparser.py new file mode 100644 index 0000000..ea27c48 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/cparser.py @@ -0,0 +1,963 @@ +from . import model +from .commontypes import COMMON_TYPES, resolve_common_type +from .error import FFIError, CDefError +try: + from . import _pycparser as pycparser +except ImportError: + import pycparser +import weakref, re, sys + +try: + if sys.version_info < (3,): + import thread as _thread + else: + import _thread + lock = _thread.allocate_lock() +except ImportError: + lock = None + +def _workaround_for_static_import_finders(): + # Issue #392: packaging tools like cx_Freeze can not find these + # because pycparser uses exec dynamic import. This is an obscure + # workaround. This function is never called. + import pycparser.yacctab + import pycparser.lextab + +CDEF_SOURCE_STRING = "" +_r_comment = re.compile(r"/\*.*?\*/|//([^\n\\]|\\.)*?$", + re.DOTALL | re.MULTILINE) +_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)" + r"\b((?:[^\n\\]|\\.)*?)$", + re.DOTALL | re.MULTILINE) +_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}") +_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$") +_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]") +_r_words = re.compile(r"\w+|\S") +_parser_cache = None +_r_int_literal = re.compile(r"-?0?x?[0-9a-f]+[lu]*$", re.IGNORECASE) +_r_stdcall1 = re.compile(r"\b(__stdcall|WINAPI)\b") +_r_stdcall2 = re.compile(r"[(]\s*(__stdcall|WINAPI)\b") +_r_cdecl = re.compile(r"\b__cdecl\b") +_r_extern_python = re.compile(r'\bextern\s*"' + r'(Python|Python\s*\+\s*C|C\s*\+\s*Python)"\s*.') +_r_star_const_space = re.compile( # matches "* const " + r"[*]\s*((const|volatile|restrict)\b\s*)+") +_r_int_dotdotdot = re.compile(r"(\b(int|long|short|signed|unsigned|char)\s*)+" + r"\.\.\.") +_r_float_dotdotdot = re.compile(r"\b(double|float)\s*\.\.\.") + +def _get_parser(): + global _parser_cache + if _parser_cache is None: + _parser_cache = pycparser.CParser() + return _parser_cache + +def _workaround_for_old_pycparser(csource): + # Workaround for a pycparser issue (fixed between pycparser 2.10 and + # 2.14): "char*const***" gives us a wrong syntax tree, the same as + # for "char***(*const)". This means we can't tell the difference + # afterwards. But "char(*const(***))" gives us the right syntax + # tree. The issue only occurs if there are several stars in + # sequence with no parenthesis inbetween, just possibly qualifiers. + # Attempt to fix it by adding some parentheses in the source: each + # time we see "* const" or "* const *", we add an opening + # parenthesis before each star---the hard part is figuring out where + # to close them. + parts = [] + while True: + match = _r_star_const_space.search(csource) + if not match: + break + #print repr(''.join(parts)+csource), '=>', + parts.append(csource[:match.start()]) + parts.append('('); closing = ')' + parts.append(match.group()) # e.g. "* const " + endpos = match.end() + if csource.startswith('*', endpos): + parts.append('('); closing += ')' + level = 0 + i = endpos + while i < len(csource): + c = csource[i] + if c == '(': + level += 1 + elif c == ')': + if level == 0: + break + level -= 1 + elif c in ',;=': + if level == 0: + break + i += 1 + csource = csource[endpos:i] + closing + csource[i:] + #print repr(''.join(parts)+csource) + parts.append(csource) + return ''.join(parts) + +def _preprocess_extern_python(csource): + # input: `extern "Python" int foo(int);` or + # `extern "Python" { int foo(int); }` + # output: + # void __cffi_extern_python_start; + # int foo(int); + # void __cffi_extern_python_stop; + # + # input: `extern "Python+C" int foo(int);` + # output: + # void __cffi_extern_python_plus_c_start; + # int foo(int); + # void __cffi_extern_python_stop; + parts = [] + while True: + match = _r_extern_python.search(csource) + if not match: + break + endpos = match.end() - 1 + #print + #print ''.join(parts)+csource + #print '=>' + parts.append(csource[:match.start()]) + if 'C' in match.group(1): + parts.append('void __cffi_extern_python_plus_c_start; ') + else: + parts.append('void __cffi_extern_python_start; ') + if csource[endpos] == '{': + # grouping variant + closing = csource.find('}', endpos) + if closing < 0: + raise CDefError("'extern \"Python\" {': no '}' found") + if csource.find('{', endpos + 1, closing) >= 0: + raise NotImplementedError("cannot use { } inside a block " + "'extern \"Python\" { ... }'") + parts.append(csource[endpos+1:closing]) + csource = csource[closing+1:] + else: + # non-grouping variant + semicolon = csource.find(';', endpos) + if semicolon < 0: + raise CDefError("'extern \"Python\": no ';' found") + parts.append(csource[endpos:semicolon+1]) + csource = csource[semicolon+1:] + parts.append(' void __cffi_extern_python_stop;') + #print ''.join(parts)+csource + #print + parts.append(csource) + return ''.join(parts) + +def _warn_for_string_literal(csource): + if '"' not in csource: + return + for line in csource.splitlines(): + if '"' in line and not line.lstrip().startswith('#'): + import warnings + warnings.warn("String literal found in cdef() or type source. " + "String literals are ignored here, but you should " + "remove them anyway because some character sequences " + "confuse pre-parsing.") + break + +def _warn_for_non_extern_non_static_global_variable(decl): + if not decl.storage: + import warnings + warnings.warn("Global variable '%s' in cdef(): for consistency " + "with C it should have a storage class specifier " + "(usually 'extern')" % (decl.name,)) + +def _preprocess(csource): + # Remove comments. NOTE: this only work because the cdef() section + # should not contain any string literal! + csource = _r_comment.sub(' ', csource) + # Remove the "#define FOO x" lines + macros = {} + for match in _r_define.finditer(csource): + macroname, macrovalue = match.groups() + macrovalue = macrovalue.replace('\\\n', '').strip() + macros[macroname] = macrovalue + csource = _r_define.sub('', csource) + # + if pycparser.__version__ < '2.14': + csource = _workaround_for_old_pycparser(csource) + # + # BIG HACK: replace WINAPI or __stdcall with "volatile const". + # It doesn't make sense for the return type of a function to be + # "volatile volatile const", so we abuse it to detect __stdcall... + # Hack number 2 is that "int(volatile *fptr)();" is not valid C + # syntax, so we place the "volatile" before the opening parenthesis. + csource = _r_stdcall2.sub(' volatile volatile const(', csource) + csource = _r_stdcall1.sub(' volatile volatile const ', csource) + csource = _r_cdecl.sub(' ', csource) + # + # Replace `extern "Python"` with start/end markers + csource = _preprocess_extern_python(csource) + # + # Now there should not be any string literal left; warn if we get one + _warn_for_string_literal(csource) + # + # Replace "[...]" with "[__dotdotdotarray__]" + csource = _r_partial_array.sub('[__dotdotdotarray__]', csource) + # + # Replace "...}" with "__dotdotdotNUM__}". This construction should + # occur only at the end of enums; at the end of structs we have "...;}" + # and at the end of vararg functions "...);". Also replace "=...[,}]" + # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when + # giving an unknown value. + matches = list(_r_partial_enum.finditer(csource)) + for number, match in enumerate(reversed(matches)): + p = match.start() + if csource[p] == '=': + p2 = csource.find('...', p, match.end()) + assert p2 > p + csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number, + csource[p2+3:]) + else: + assert csource[p:p+3] == '...' + csource = '%s __dotdotdot%d__ %s' % (csource[:p], number, + csource[p+3:]) + # Replace "int ..." or "unsigned long int..." with "__dotdotdotint__" + csource = _r_int_dotdotdot.sub(' __dotdotdotint__ ', csource) + # Replace "float ..." or "double..." with "__dotdotdotfloat__" + csource = _r_float_dotdotdot.sub(' __dotdotdotfloat__ ', csource) + # Replace all remaining "..." with the same name, "__dotdotdot__", + # which is declared with a typedef for the purpose of C parsing. + return csource.replace('...', ' __dotdotdot__ '), macros + +def _common_type_names(csource): + # Look in the source for what looks like usages of types from the + # list of common types. A "usage" is approximated here as the + # appearance of the word, minus a "definition" of the type, which + # is the last word in a "typedef" statement. Approximative only + # but should be fine for all the common types. + look_for_words = set(COMMON_TYPES) + look_for_words.add(';') + look_for_words.add(',') + look_for_words.add('(') + look_for_words.add(')') + look_for_words.add('typedef') + words_used = set() + is_typedef = False + paren = 0 + previous_word = '' + for word in _r_words.findall(csource): + if word in look_for_words: + if word == ';': + if is_typedef: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + is_typedef = False + elif word == 'typedef': + is_typedef = True + paren = 0 + elif word == '(': + paren += 1 + elif word == ')': + paren -= 1 + elif word == ',': + if is_typedef and paren == 0: + words_used.discard(previous_word) + look_for_words.discard(previous_word) + else: # word in COMMON_TYPES + words_used.add(word) + previous_word = word + return words_used + + +class Parser(object): + + def __init__(self): + self._declarations = {} + self._included_declarations = set() + self._anonymous_counter = 0 + self._structnode2type = weakref.WeakKeyDictionary() + self._options = {} + self._int_constants = {} + self._recomplete = [] + self._uses_new_feature = None + + def _parse(self, csource): + csource, macros = _preprocess(csource) + # XXX: for more efficiency we would need to poke into the + # internals of CParser... the following registers the + # typedefs, because their presence or absence influences the + # parsing itself (but what they are typedef'ed to plays no role) + ctn = _common_type_names(csource) + typenames = [] + for name in sorted(self._declarations): + if name.startswith('typedef '): + name = name[8:] + typenames.append(name) + ctn.discard(name) + typenames += sorted(ctn) + # + csourcelines = [] + csourcelines.append('# 1 ""') + for typename in typenames: + csourcelines.append('typedef int %s;' % typename) + csourcelines.append('typedef int __dotdotdotint__, __dotdotdotfloat__,' + ' __dotdotdot__;') + # this forces pycparser to consider the following in the file + # called from line 1 + csourcelines.append('# 1 "%s"' % (CDEF_SOURCE_STRING,)) + csourcelines.append(csource) + fullcsource = '\n'.join(csourcelines) + if lock is not None: + lock.acquire() # pycparser is not thread-safe... + try: + ast = _get_parser().parse(fullcsource) + except pycparser.c_parser.ParseError as e: + self.convert_pycparser_error(e, csource) + finally: + if lock is not None: + lock.release() + # csource will be used to find buggy source text + return ast, macros, csource + + def _convert_pycparser_error(self, e, csource): + # xxx look for ":NUM:" at the start of str(e) + # and interpret that as a line number. This will not work if + # the user gives explicit ``# NUM "FILE"`` directives. + line = None + msg = str(e) + match = re.match(r"%s:(\d+):" % (CDEF_SOURCE_STRING,), msg) + if match: + linenum = int(match.group(1), 10) + csourcelines = csource.splitlines() + if 1 <= linenum <= len(csourcelines): + line = csourcelines[linenum-1] + return line + + def convert_pycparser_error(self, e, csource): + line = self._convert_pycparser_error(e, csource) + + msg = str(e) + if line: + msg = 'cannot parse "%s"\n%s' % (line.strip(), msg) + else: + msg = 'parse error\n%s' % (msg,) + raise CDefError(msg) + + def parse(self, csource, override=False, packed=False, pack=None, + dllexport=False): + if packed: + if packed != True: + raise ValueError("'packed' should be False or True; use " + "'pack' to give another value") + if pack: + raise ValueError("cannot give both 'pack' and 'packed'") + pack = 1 + elif pack: + if pack & (pack - 1): + raise ValueError("'pack' must be a power of two, not %r" % + (pack,)) + else: + pack = 0 + prev_options = self._options + try: + self._options = {'override': override, + 'packed': pack, + 'dllexport': dllexport} + self._internal_parse(csource) + finally: + self._options = prev_options + + def _internal_parse(self, csource): + ast, macros, csource = self._parse(csource) + # add the macros + self._process_macros(macros) + # find the first "__dotdotdot__" and use that as a separator + # between the repeated typedefs and the real csource + iterator = iter(ast.ext) + for decl in iterator: + if decl.name == '__dotdotdot__': + break + else: + assert 0 + current_decl = None + # + try: + self._inside_extern_python = '__cffi_extern_python_stop' + for decl in iterator: + current_decl = decl + if isinstance(decl, pycparser.c_ast.Decl): + self._parse_decl(decl) + elif isinstance(decl, pycparser.c_ast.Typedef): + if not decl.name: + raise CDefError("typedef does not declare any name", + decl) + quals = 0 + if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) and + decl.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_type(decl) + elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and + isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and + isinstance(decl.type.type.type, + pycparser.c_ast.IdentifierType) and + decl.type.type.type.names[-1].startswith('__dotdotdot')): + realtype = self._get_unknown_ptr_type(decl) + else: + realtype, quals = self._get_type_and_quals( + decl.type, name=decl.name, partial_length_ok=True) + self._declare('typedef ' + decl.name, realtype, quals=quals) + elif decl.__class__.__name__ == 'Pragma': + pass # skip pragma, only in pycparser 2.15 + else: + raise CDefError("unexpected <%s>: this construct is valid " + "C but not valid in cdef()" % + decl.__class__.__name__, decl) + except CDefError as e: + if len(e.args) == 1: + e.args = e.args + (current_decl,) + raise + except FFIError as e: + msg = self._convert_pycparser_error(e, csource) + if msg: + e.args = (e.args[0] + "\n *** Err: %s" % msg,) + raise + + def _add_constants(self, key, val): + if key in self._int_constants: + if self._int_constants[key] == val: + return # ignore identical double declarations + raise FFIError( + "multiple declarations of constant: %s" % (key,)) + self._int_constants[key] = val + + def _add_integer_constant(self, name, int_str): + int_str = int_str.lower().rstrip("ul") + neg = int_str.startswith('-') + if neg: + int_str = int_str[1:] + # "010" is not valid oct in py3 + if (int_str.startswith("0") and int_str != '0' + and not int_str.startswith("0x")): + int_str = "0o" + int_str[1:] + pyvalue = int(int_str, 0) + if neg: + pyvalue = -pyvalue + self._add_constants(name, pyvalue) + self._declare('macro ' + name, pyvalue) + + def _process_macros(self, macros): + for key, value in macros.items(): + value = value.strip() + if _r_int_literal.match(value): + self._add_integer_constant(key, value) + elif value == '...': + self._declare('macro ' + key, value) + else: + raise CDefError( + 'only supports one of the following syntax:\n' + ' #define %s ... (literally dot-dot-dot)\n' + ' #define %s NUMBER (with NUMBER an integer' + ' constant, decimal/hex/octal)\n' + 'got:\n' + ' #define %s %s' + % (key, key, key, value)) + + def _declare_function(self, tp, quals, decl): + tp = self._get_type_pointer(tp, quals) + if self._options.get('dllexport'): + tag = 'dllexport_python ' + elif self._inside_extern_python == '__cffi_extern_python_start': + tag = 'extern_python ' + elif self._inside_extern_python == '__cffi_extern_python_plus_c_start': + tag = 'extern_python_plus_c ' + else: + tag = 'function ' + self._declare(tag + decl.name, tp) + + def _parse_decl(self, decl): + node = decl.type + if isinstance(node, pycparser.c_ast.FuncDecl): + tp, quals = self._get_type_and_quals(node, name=decl.name) + assert isinstance(tp, model.RawFunctionType) + self._declare_function(tp, quals, decl) + else: + if isinstance(node, pycparser.c_ast.Struct): + self._get_struct_union_enum_type('struct', node) + elif isinstance(node, pycparser.c_ast.Union): + self._get_struct_union_enum_type('union', node) + elif isinstance(node, pycparser.c_ast.Enum): + self._get_struct_union_enum_type('enum', node) + elif not decl.name: + raise CDefError("construct does not declare any variable", + decl) + # + if decl.name: + tp, quals = self._get_type_and_quals(node, + partial_length_ok=True) + if tp.is_raw_function: + self._declare_function(tp, quals, decl) + elif (tp.is_integer_type() and + hasattr(decl, 'init') and + hasattr(decl.init, 'value') and + _r_int_literal.match(decl.init.value)): + self._add_integer_constant(decl.name, decl.init.value) + elif (tp.is_integer_type() and + isinstance(decl.init, pycparser.c_ast.UnaryOp) and + decl.init.op == '-' and + hasattr(decl.init.expr, 'value') and + _r_int_literal.match(decl.init.expr.value)): + self._add_integer_constant(decl.name, + '-' + decl.init.expr.value) + elif (tp is model.void_type and + decl.name.startswith('__cffi_extern_python_')): + # hack: `extern "Python"` in the C source is replaced + # with "void __cffi_extern_python_start;" and + # "void __cffi_extern_python_stop;" + self._inside_extern_python = decl.name + else: + if self._inside_extern_python !='__cffi_extern_python_stop': + raise CDefError( + "cannot declare constants or " + "variables with 'extern \"Python\"'") + if (quals & model.Q_CONST) and not tp.is_array_type: + self._declare('constant ' + decl.name, tp, quals=quals) + else: + _warn_for_non_extern_non_static_global_variable(decl) + self._declare('variable ' + decl.name, tp, quals=quals) + + def parse_type(self, cdecl): + return self.parse_type_and_quals(cdecl)[0] + + def parse_type_and_quals(self, cdecl): + ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2] + assert not macros + exprnode = ast.ext[-1].type.args.params[0] + if isinstance(exprnode, pycparser.c_ast.ID): + raise CDefError("unknown identifier '%s'" % (exprnode.name,)) + return self._get_type_and_quals(exprnode.type) + + def _declare(self, name, obj, included=False, quals=0): + if name in self._declarations: + prevobj, prevquals = self._declarations[name] + if prevobj is obj and prevquals == quals: + return + if not self._options.get('override'): + raise FFIError( + "multiple declarations of %s (for interactive usage, " + "try cdef(xx, override=True))" % (name,)) + assert '__dotdotdot__' not in name.split() + self._declarations[name] = (obj, quals) + if included: + self._included_declarations.add(obj) + + def _extract_quals(self, type): + quals = 0 + if isinstance(type, (pycparser.c_ast.TypeDecl, + pycparser.c_ast.PtrDecl)): + if 'const' in type.quals: + quals |= model.Q_CONST + if 'volatile' in type.quals: + quals |= model.Q_VOLATILE + if 'restrict' in type.quals: + quals |= model.Q_RESTRICT + return quals + + def _get_type_pointer(self, type, quals, declname=None): + if isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + if (isinstance(type, model.StructOrUnionOrEnum) and + type.name.startswith('$') and type.name[1:].isdigit() and + type.forcename is None and declname is not None): + return model.NamedPointerType(type, declname, quals) + return model.PointerType(type, quals) + + def _get_type_and_quals(self, typenode, name=None, partial_length_ok=False): + # first, dereference typedefs, if we have it already parsed, we're good + if (isinstance(typenode, pycparser.c_ast.TypeDecl) and + isinstance(typenode.type, pycparser.c_ast.IdentifierType) and + len(typenode.type.names) == 1 and + ('typedef ' + typenode.type.names[0]) in self._declarations): + tp, quals = self._declarations['typedef ' + typenode.type.names[0]] + quals |= self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.ArrayDecl): + # array type + if typenode.dim is None: + length = None + else: + length = self._parse_constant( + typenode.dim, partial_length_ok=partial_length_ok) + tp, quals = self._get_type_and_quals(typenode.type, + partial_length_ok=partial_length_ok) + return model.ArrayType(tp, length), quals + # + if isinstance(typenode, pycparser.c_ast.PtrDecl): + # pointer type + itemtype, itemquals = self._get_type_and_quals(typenode.type) + tp = self._get_type_pointer(itemtype, itemquals, declname=name) + quals = self._extract_quals(typenode) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.TypeDecl): + quals = self._extract_quals(typenode) + type = typenode.type + if isinstance(type, pycparser.c_ast.IdentifierType): + # assume a primitive type. get it from .names, but reduce + # synonyms to a single chosen combination + names = list(type.names) + if names != ['signed', 'char']: # keep this unmodified + prefixes = {} + while names: + name = names[0] + if name in ('short', 'long', 'signed', 'unsigned'): + prefixes[name] = prefixes.get(name, 0) + 1 + del names[0] + else: + break + # ignore the 'signed' prefix below, and reorder the others + newnames = [] + for prefix in ('unsigned', 'short', 'long'): + for i in range(prefixes.get(prefix, 0)): + newnames.append(prefix) + if not names: + names = ['int'] # implicitly + if names == ['int']: # but kill it if 'short' or 'long' + if 'short' in prefixes or 'long' in prefixes: + names = [] + names = newnames + names + ident = ' '.join(names) + if ident == 'void': + return model.void_type, quals + if ident == '__dotdotdot__': + raise FFIError(':%d: bad usage of "..."' % + typenode.coord.line) + tp0, quals0 = resolve_common_type(self, ident) + return tp0, (quals | quals0) + # + if isinstance(type, pycparser.c_ast.Struct): + # 'struct foobar' + tp = self._get_struct_union_enum_type('struct', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Union): + # 'union foobar' + tp = self._get_struct_union_enum_type('union', type, name) + return tp, quals + # + if isinstance(type, pycparser.c_ast.Enum): + # 'enum foobar' + tp = self._get_struct_union_enum_type('enum', type, name) + return tp, quals + # + if isinstance(typenode, pycparser.c_ast.FuncDecl): + # a function type + return self._parse_function_type(typenode, name), 0 + # + # nested anonymous structs or unions end up here + if isinstance(typenode, pycparser.c_ast.Struct): + return self._get_struct_union_enum_type('struct', typenode, name, + nested=True), 0 + if isinstance(typenode, pycparser.c_ast.Union): + return self._get_struct_union_enum_type('union', typenode, name, + nested=True), 0 + # + raise FFIError(":%d: bad or unsupported type declaration" % + typenode.coord.line) + + def _parse_function_type(self, typenode, funcname=None): + params = list(getattr(typenode.args, 'params', [])) + for i, arg in enumerate(params): + if not hasattr(arg, 'type'): + raise CDefError("%s arg %d: unknown type '%s'" + " (if you meant to use the old C syntax of giving" + " untyped arguments, it is not supported)" + % (funcname or 'in expression', i + 1, + getattr(arg, 'name', '?'))) + ellipsis = ( + len(params) > 0 and + isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and + isinstance(params[-1].type.type, + pycparser.c_ast.IdentifierType) and + params[-1].type.type.names == ['__dotdotdot__']) + if ellipsis: + params.pop() + if not params: + raise CDefError( + "%s: a function with only '(...)' as argument" + " is not correct C" % (funcname or 'in expression')) + args = [self._as_func_arg(*self._get_type_and_quals(argdeclnode.type)) + for argdeclnode in params] + if not ellipsis and args == [model.void_type]: + args = [] + result, quals = self._get_type_and_quals(typenode.type) + # the 'quals' on the result type are ignored. HACK: we absure them + # to detect __stdcall functions: we textually replace "__stdcall" + # with "volatile volatile const" above. + abi = None + if hasattr(typenode.type, 'quals'): # else, probable syntax error anyway + if typenode.type.quals[-3:] == ['volatile', 'volatile', 'const']: + abi = '__stdcall' + return model.RawFunctionType(tuple(args), result, ellipsis, abi) + + def _as_func_arg(self, type, quals): + if isinstance(type, model.ArrayType): + return model.PointerType(type.item, quals) + elif isinstance(type, model.RawFunctionType): + return type.as_function_pointer() + else: + return type + + def _get_struct_union_enum_type(self, kind, type, name=None, nested=False): + # First, a level of caching on the exact 'type' node of the AST. + # This is obscure, but needed because pycparser "unrolls" declarations + # such as "typedef struct { } foo_t, *foo_p" and we end up with + # an AST that is not a tree, but a DAG, with the "type" node of the + # two branches foo_t and foo_p of the trees being the same node. + # It's a bit silly but detecting "DAG-ness" in the AST tree seems + # to be the only way to distinguish this case from two independent + # structs. See test_struct_with_two_usages. + try: + return self._structnode2type[type] + except KeyError: + pass + # + # Note that this must handle parsing "struct foo" any number of + # times and always return the same StructType object. Additionally, + # one of these times (not necessarily the first), the fields of + # the struct can be specified with "struct foo { ...fields... }". + # If no name is given, then we have to create a new anonymous struct + # with no caching; in this case, the fields are either specified + # right now or never. + # + force_name = name + name = type.name + # + # get the type or create it if needed + if name is None: + # 'force_name' is used to guess a more readable name for + # anonymous structs, for the common case "typedef struct { } foo". + if force_name is not None: + explicit_name = '$%s' % force_name + else: + self._anonymous_counter += 1 + explicit_name = '$%d' % self._anonymous_counter + tp = None + else: + explicit_name = name + key = '%s %s' % (kind, name) + tp, _ = self._declarations.get(key, (None, None)) + # + if tp is None: + if kind == 'struct': + tp = model.StructType(explicit_name, None, None, None) + elif kind == 'union': + tp = model.UnionType(explicit_name, None, None, None) + elif kind == 'enum': + if explicit_name == '__dotdotdot__': + raise CDefError("Enums cannot be declared with ...") + tp = self._build_enum_type(explicit_name, type.values) + else: + raise AssertionError("kind = %r" % (kind,)) + if name is not None: + self._declare(key, tp) + else: + if kind == 'enum' and type.values is not None: + raise NotImplementedError( + "enum %s: the '{}' declaration should appear on the first " + "time the enum is mentioned, not later" % explicit_name) + if not tp.forcename: + tp.force_the_name(force_name) + if tp.forcename and '$' in tp.name: + self._declare('anonymous %s' % tp.forcename, tp) + # + self._structnode2type[type] = tp + # + # enums: done here + if kind == 'enum': + return tp + # + # is there a 'type.decls'? If yes, then this is the place in the + # C sources that declare the fields. If no, then just return the + # existing type, possibly still incomplete. + if type.decls is None: + return tp + # + if tp.fldnames is not None: + raise CDefError("duplicate declaration of struct %s" % name) + fldnames = [] + fldtypes = [] + fldbitsize = [] + fldquals = [] + for decl in type.decls: + if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and + ''.join(decl.type.names) == '__dotdotdot__'): + # XXX pycparser is inconsistent: 'names' should be a list + # of strings, but is sometimes just one string. Use + # str.join() as a way to cope with both. + self._make_partial(tp, nested) + continue + if decl.bitsize is None: + bitsize = -1 + else: + bitsize = self._parse_constant(decl.bitsize) + self._partial_length = False + type, fqual = self._get_type_and_quals(decl.type, + partial_length_ok=True) + if self._partial_length: + self._make_partial(tp, nested) + if isinstance(type, model.StructType) and type.partial: + self._make_partial(tp, nested) + fldnames.append(decl.name or '') + fldtypes.append(type) + fldbitsize.append(bitsize) + fldquals.append(fqual) + tp.fldnames = tuple(fldnames) + tp.fldtypes = tuple(fldtypes) + tp.fldbitsize = tuple(fldbitsize) + tp.fldquals = tuple(fldquals) + if fldbitsize != [-1] * len(fldbitsize): + if isinstance(tp, model.StructType) and tp.partial: + raise NotImplementedError("%s: using both bitfields and '...;'" + % (tp,)) + tp.packed = self._options.get('packed') + if tp.completed: # must be re-completed: it is not opaque any more + tp.completed = 0 + self._recomplete.append(tp) + return tp + + def _make_partial(self, tp, nested): + if not isinstance(tp, model.StructOrUnion): + raise CDefError("%s cannot be partial" % (tp,)) + if not tp.has_c_name() and not nested: + raise NotImplementedError("%s is partial but has no C name" %(tp,)) + tp.partial = True + + def _parse_constant(self, exprnode, partial_length_ok=False): + # for now, limited to expressions that are an immediate number + # or positive/negative number + if isinstance(exprnode, pycparser.c_ast.Constant): + s = exprnode.value + if '0' <= s[0] <= '9': + s = s.rstrip('uUlL') + try: + if s.startswith('0'): + return int(s, 8) + else: + return int(s, 10) + except ValueError: + if len(s) > 1: + if s.lower()[0:2] == '0x': + return int(s, 16) + elif s.lower()[0:2] == '0b': + return int(s, 2) + raise CDefError("invalid constant %r" % (s,)) + elif s[0] == "'" and s[-1] == "'" and ( + len(s) == 3 or (len(s) == 4 and s[1] == "\\")): + return ord(s[-2]) + else: + raise CDefError("invalid constant %r" % (s,)) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '+'): + return self._parse_constant(exprnode.expr) + # + if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and + exprnode.op == '-'): + return -self._parse_constant(exprnode.expr) + # load previously defined int constant + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name in self._int_constants): + return self._int_constants[exprnode.name] + # + if (isinstance(exprnode, pycparser.c_ast.ID) and + exprnode.name == '__dotdotdotarray__'): + if partial_length_ok: + self._partial_length = True + return '...' + raise FFIError(":%d: unsupported '[...]' here, cannot derive " + "the actual array length in this context" + % exprnode.coord.line) + # + if isinstance(exprnode, pycparser.c_ast.BinaryOp): + left = self._parse_constant(exprnode.left) + right = self._parse_constant(exprnode.right) + if exprnode.op == '+': + return left + right + elif exprnode.op == '-': + return left - right + elif exprnode.op == '*': + return left * right + elif exprnode.op == '/': + return self._c_div(left, right) + elif exprnode.op == '%': + return left - self._c_div(left, right) * right + elif exprnode.op == '<<': + return left << right + elif exprnode.op == '>>': + return left >> right + elif exprnode.op == '&': + return left & right + elif exprnode.op == '|': + return left | right + elif exprnode.op == '^': + return left ^ right + # + raise FFIError(":%d: unsupported expression: expected a " + "simple numeric constant" % exprnode.coord.line) + + def _c_div(self, a, b): + result = a // b + if ((a < 0) ^ (b < 0)) and (a % b) != 0: + result += 1 + return result + + def _build_enum_type(self, explicit_name, decls): + if decls is not None: + partial = False + enumerators = [] + enumvalues = [] + nextenumvalue = 0 + for enum in decls.enumerators: + if _r_enum_dotdotdot.match(enum.name): + partial = True + continue + if enum.value is not None: + nextenumvalue = self._parse_constant(enum.value) + enumerators.append(enum.name) + enumvalues.append(nextenumvalue) + self._add_constants(enum.name, nextenumvalue) + nextenumvalue += 1 + enumerators = tuple(enumerators) + enumvalues = tuple(enumvalues) + tp = model.EnumType(explicit_name, enumerators, enumvalues) + tp.partial = partial + else: # opaque enum + tp = model.EnumType(explicit_name, (), ()) + return tp + + def include(self, other): + for name, (tp, quals) in other._declarations.items(): + if name.startswith('anonymous $enum_$'): + continue # fix for test_anonymous_enum_include + kind = name.split(' ', 1)[0] + if kind in ('struct', 'union', 'enum', 'anonymous', 'typedef'): + self._declare(name, tp, included=True, quals=quals) + for k, v in other._int_constants.items(): + self._add_constants(k, v) + + def _get_unknown_type(self, decl): + typenames = decl.type.type.names + if typenames == ['__dotdotdot__']: + return model.unknown_type(decl.name) + + if typenames == ['__dotdotdotint__']: + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef int... %s'" % decl.name + return model.UnknownIntegerType(decl.name) + + if typenames == ['__dotdotdotfloat__']: + # note: not for 'long double' so far + if self._uses_new_feature is None: + self._uses_new_feature = "'typedef float... %s'" % decl.name + return model.UnknownFloatType(decl.name) + + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) + + def _get_unknown_ptr_type(self, decl): + if decl.type.type.type.names == ['__dotdotdot__']: + return model.unknown_ptr_type(decl.name) + raise FFIError(':%d: unsupported usage of "..." in typedef' + % decl.coord.line) diff --git a/venv/lib/python3.7/site-packages/cffi/error.py b/venv/lib/python3.7/site-packages/cffi/error.py new file mode 100644 index 0000000..0a27247 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/error.py @@ -0,0 +1,31 @@ + +class FFIError(Exception): + __module__ = 'cffi' + +class CDefError(Exception): + __module__ = 'cffi' + def __str__(self): + try: + current_decl = self.args[1] + filename = current_decl.coord.file + linenum = current_decl.coord.line + prefix = '%s:%d: ' % (filename, linenum) + except (AttributeError, TypeError, IndexError): + prefix = '' + return '%s%s' % (prefix, self.args[0]) + +class VerificationError(Exception): + """ An error raised when verification fails + """ + __module__ = 'cffi' + +class VerificationMissing(Exception): + """ An error raised when incomplete structures are passed into + cdef, but no verification has been done + """ + __module__ = 'cffi' + +class PkgConfigError(Exception): + """ An error raised for missing modules in pkg-config + """ + __module__ = 'cffi' diff --git a/venv/lib/python3.7/site-packages/cffi/model.py b/venv/lib/python3.7/site-packages/cffi/model.py new file mode 100644 index 0000000..5f1b0d2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/model.py @@ -0,0 +1,614 @@ +import types +import weakref + +from .lock import allocate_lock +from .error import CDefError, VerificationError, VerificationMissing + +# type qualifiers +Q_CONST = 0x01 +Q_RESTRICT = 0x02 +Q_VOLATILE = 0x04 + +def qualify(quals, replace_with): + if quals & Q_CONST: + replace_with = ' const ' + replace_with.lstrip() + if quals & Q_VOLATILE: + replace_with = ' volatile ' + replace_with.lstrip() + if quals & Q_RESTRICT: + # It seems that __restrict is supported by gcc and msvc. + # If you hit some different compiler, add a #define in + # _cffi_include.h for it (and in its copies, documented there) + replace_with = ' __restrict ' + replace_with.lstrip() + return replace_with + + +class BaseTypeByIdentity(object): + is_array_type = False + is_raw_function = False + + def get_c_name(self, replace_with='', context='a C file', quals=0): + result = self.c_name_with_marker + assert result.count('&') == 1 + # some logic duplication with ffi.getctype()... :-( + replace_with = replace_with.strip() + if replace_with: + if replace_with.startswith('*') and '&[' in result: + replace_with = '(%s)' % replace_with + elif not replace_with[0] in '[(': + replace_with = ' ' + replace_with + replace_with = qualify(quals, replace_with) + result = result.replace('&', replace_with) + if '$' in result: + raise VerificationError( + "cannot generate '%s' in %s: unknown type name" + % (self._get_c_name(), context)) + return result + + def _get_c_name(self): + return self.c_name_with_marker.replace('&', '') + + def has_c_name(self): + return '$' not in self._get_c_name() + + def is_integer_type(self): + return False + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + try: + BType = ffi._cached_btypes[self] + except KeyError: + BType = self.build_backend_type(ffi, finishlist) + BType2 = ffi._cached_btypes.setdefault(self, BType) + assert BType2 is BType + return BType + + def __repr__(self): + return '<%s>' % (self._get_c_name(),) + + def _get_items(self): + return [(name, getattr(self, name)) for name in self._attrs_] + + +class BaseType(BaseTypeByIdentity): + + def __eq__(self, other): + return (self.__class__ == other.__class__ and + self._get_items() == other._get_items()) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.__class__, tuple(self._get_items()))) + + +class VoidType(BaseType): + _attrs_ = () + + def __init__(self): + self.c_name_with_marker = 'void&' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_void_type') + +void_type = VoidType() + + +class BasePrimitiveType(BaseType): + def is_complex_type(self): + return False + + +class PrimitiveType(BasePrimitiveType): + _attrs_ = ('name',) + + ALL_PRIMITIVE_TYPES = { + 'char': 'c', + 'short': 'i', + 'int': 'i', + 'long': 'i', + 'long long': 'i', + 'signed char': 'i', + 'unsigned char': 'i', + 'unsigned short': 'i', + 'unsigned int': 'i', + 'unsigned long': 'i', + 'unsigned long long': 'i', + 'float': 'f', + 'double': 'f', + 'long double': 'f', + 'float _Complex': 'j', + 'double _Complex': 'j', + '_Bool': 'i', + # the following types are not primitive in the C sense + 'wchar_t': 'c', + 'char16_t': 'c', + 'char32_t': 'c', + 'int8_t': 'i', + 'uint8_t': 'i', + 'int16_t': 'i', + 'uint16_t': 'i', + 'int32_t': 'i', + 'uint32_t': 'i', + 'int64_t': 'i', + 'uint64_t': 'i', + 'int_least8_t': 'i', + 'uint_least8_t': 'i', + 'int_least16_t': 'i', + 'uint_least16_t': 'i', + 'int_least32_t': 'i', + 'uint_least32_t': 'i', + 'int_least64_t': 'i', + 'uint_least64_t': 'i', + 'int_fast8_t': 'i', + 'uint_fast8_t': 'i', + 'int_fast16_t': 'i', + 'uint_fast16_t': 'i', + 'int_fast32_t': 'i', + 'uint_fast32_t': 'i', + 'int_fast64_t': 'i', + 'uint_fast64_t': 'i', + 'intptr_t': 'i', + 'uintptr_t': 'i', + 'intmax_t': 'i', + 'uintmax_t': 'i', + 'ptrdiff_t': 'i', + 'size_t': 'i', + 'ssize_t': 'i', + } + + def __init__(self, name): + assert name in self.ALL_PRIMITIVE_TYPES + self.name = name + self.c_name_with_marker = name + '&' + + def is_char_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'c' + def is_integer_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'i' + def is_float_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'f' + def is_complex_type(self): + return self.ALL_PRIMITIVE_TYPES[self.name] == 'j' + + def build_backend_type(self, ffi, finishlist): + return global_cache(self, ffi, 'new_primitive_type', self.name) + + +class UnknownIntegerType(BasePrimitiveType): + _attrs_ = ('name',) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def is_integer_type(self): + return True + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("integer type '%s' can only be used after " + "compilation" % self.name) + +class UnknownFloatType(BasePrimitiveType): + _attrs_ = ('name', ) + + def __init__(self, name): + self.name = name + self.c_name_with_marker = name + '&' + + def build_backend_type(self, ffi, finishlist): + raise NotImplementedError("float type '%s' can only be used after " + "compilation" % self.name) + + +class BaseFunctionType(BaseType): + _attrs_ = ('args', 'result', 'ellipsis', 'abi') + + def __init__(self, args, result, ellipsis, abi=None): + self.args = args + self.result = result + self.ellipsis = ellipsis + self.abi = abi + # + reprargs = [arg._get_c_name() for arg in self.args] + if self.ellipsis: + reprargs.append('...') + reprargs = reprargs or ['void'] + replace_with = self._base_pattern % (', '.join(reprargs),) + if abi is not None: + replace_with = replace_with[:1] + abi + ' ' + replace_with[1:] + self.c_name_with_marker = ( + self.result.c_name_with_marker.replace('&', replace_with)) + + +class RawFunctionType(BaseFunctionType): + # Corresponds to a C type like 'int(int)', which is the C type of + # a function, but not a pointer-to-function. The backend has no + # notion of such a type; it's used temporarily by parsing. + _base_pattern = '(&)(%s)' + is_raw_function = True + + def build_backend_type(self, ffi, finishlist): + raise CDefError("cannot render the type %r: it is a function " + "type, not a pointer-to-function type" % (self,)) + + def as_function_pointer(self): + return FunctionPtrType(self.args, self.result, self.ellipsis, self.abi) + + +class FunctionPtrType(BaseFunctionType): + _base_pattern = '(*&)(%s)' + + def build_backend_type(self, ffi, finishlist): + result = self.result.get_cached_btype(ffi, finishlist) + args = [] + for tp in self.args: + args.append(tp.get_cached_btype(ffi, finishlist)) + abi_args = () + if self.abi == "__stdcall": + if not self.ellipsis: # __stdcall ignored for variadic funcs + try: + abi_args = (ffi._backend.FFI_STDCALL,) + except AttributeError: + pass + return global_cache(self, ffi, 'new_function_type', + tuple(args), result, self.ellipsis, *abi_args) + + def as_raw_function(self): + return RawFunctionType(self.args, self.result, self.ellipsis, self.abi) + + +class PointerType(BaseType): + _attrs_ = ('totype', 'quals') + + def __init__(self, totype, quals=0): + self.totype = totype + self.quals = quals + extra = qualify(quals, " *&") + if totype.is_array_type: + extra = "(%s)" % (extra.lstrip(),) + self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra) + + def build_backend_type(self, ffi, finishlist): + BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True) + return global_cache(self, ffi, 'new_pointer_type', BItem) + +voidp_type = PointerType(void_type) + +def ConstPointerType(totype): + return PointerType(totype, Q_CONST) + +const_voidp_type = ConstPointerType(void_type) + + +class NamedPointerType(PointerType): + _attrs_ = ('totype', 'name') + + def __init__(self, totype, name, quals=0): + PointerType.__init__(self, totype, quals) + self.name = name + self.c_name_with_marker = name + '&' + + +class ArrayType(BaseType): + _attrs_ = ('item', 'length') + is_array_type = True + + def __init__(self, item, length): + self.item = item + self.length = length + # + if length is None: + brackets = '&[]' + elif length == '...': + brackets = '&[/*...*/]' + else: + brackets = '&[%s]' % length + self.c_name_with_marker = ( + self.item.c_name_with_marker.replace('&', brackets)) + + def resolve_length(self, newlength): + return ArrayType(self.item, newlength) + + def build_backend_type(self, ffi, finishlist): + if self.length == '...': + raise CDefError("cannot render the type %r: unknown length" % + (self,)) + self.item.get_cached_btype(ffi, finishlist) # force the item BType + BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist) + return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length) + +char_array_type = ArrayType(PrimitiveType('char'), None) + + +class StructOrUnionOrEnum(BaseTypeByIdentity): + _attrs_ = ('name',) + forcename = None + + def build_c_name_with_marker(self): + name = self.forcename or '%s %s' % (self.kind, self.name) + self.c_name_with_marker = name + '&' + + def force_the_name(self, forcename): + self.forcename = forcename + self.build_c_name_with_marker() + + def get_official_name(self): + assert self.c_name_with_marker.endswith('&') + return self.c_name_with_marker[:-1] + + +class StructOrUnion(StructOrUnionOrEnum): + fixedlayout = None + completed = 0 + partial = False + packed = 0 + + def __init__(self, name, fldnames, fldtypes, fldbitsize, fldquals=None): + self.name = name + self.fldnames = fldnames + self.fldtypes = fldtypes + self.fldbitsize = fldbitsize + self.fldquals = fldquals + self.build_c_name_with_marker() + + def anonymous_struct_fields(self): + if self.fldtypes is not None: + for name, type in zip(self.fldnames, self.fldtypes): + if name == '' and isinstance(type, StructOrUnion): + yield type + + def enumfields(self, expand_anonymous_struct_union=True): + fldquals = self.fldquals + if fldquals is None: + fldquals = (0,) * len(self.fldnames) + for name, type, bitsize, quals in zip(self.fldnames, self.fldtypes, + self.fldbitsize, fldquals): + if (name == '' and isinstance(type, StructOrUnion) + and expand_anonymous_struct_union): + # nested anonymous struct/union + for result in type.enumfields(): + yield result + else: + yield (name, type, bitsize, quals) + + def force_flatten(self): + # force the struct or union to have a declaration that lists + # directly all fields returned by enumfields(), flattening + # nested anonymous structs/unions. + names = [] + types = [] + bitsizes = [] + fldquals = [] + for name, type, bitsize, quals in self.enumfields(): + names.append(name) + types.append(type) + bitsizes.append(bitsize) + fldquals.append(quals) + self.fldnames = tuple(names) + self.fldtypes = tuple(types) + self.fldbitsize = tuple(bitsizes) + self.fldquals = tuple(fldquals) + + def get_cached_btype(self, ffi, finishlist, can_delay=False): + BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist, + can_delay) + if not can_delay: + self.finish_backend_type(ffi, finishlist) + return BType + + def finish_backend_type(self, ffi, finishlist): + if self.completed: + if self.completed != 2: + raise NotImplementedError("recursive structure declaration " + "for '%s'" % (self.name,)) + return + BType = ffi._cached_btypes[self] + # + self.completed = 1 + # + if self.fldtypes is None: + pass # not completing it: it's an opaque struct + # + elif self.fixedlayout is None: + fldtypes = [tp.get_cached_btype(ffi, finishlist) + for tp in self.fldtypes] + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize)) + extra_flags = () + if self.packed: + if self.packed == 1: + extra_flags = (8,) # SF_PACKED + else: + extra_flags = (0, self.packed) + ffi._backend.complete_struct_or_union(BType, lst, self, + -1, -1, *extra_flags) + # + else: + fldtypes = [] + fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout + for i in range(len(self.fldnames)): + fsize = fieldsize[i] + ftype = self.fldtypes[i] + # + if isinstance(ftype, ArrayType) and ftype.length == '...': + # fix the length to match the total size + BItemType = ftype.item.get_cached_btype(ffi, finishlist) + nlen, nrest = divmod(fsize, ffi.sizeof(BItemType)) + if nrest != 0: + self._verification_error( + "field '%s.%s' has a bogus size?" % ( + self.name, self.fldnames[i] or '{}')) + ftype = ftype.resolve_length(nlen) + self.fldtypes = (self.fldtypes[:i] + (ftype,) + + self.fldtypes[i+1:]) + # + BFieldType = ftype.get_cached_btype(ffi, finishlist) + if isinstance(ftype, ArrayType) and ftype.length is None: + assert fsize == 0 + else: + bitemsize = ffi.sizeof(BFieldType) + if bitemsize != fsize: + self._verification_error( + "field '%s.%s' is declared as %d bytes, but is " + "really %d bytes" % (self.name, + self.fldnames[i] or '{}', + bitemsize, fsize)) + fldtypes.append(BFieldType) + # + lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs)) + ffi._backend.complete_struct_or_union(BType, lst, self, + totalsize, totalalignment) + self.completed = 2 + + def _verification_error(self, msg): + raise VerificationError(msg) + + def check_not_partial(self): + if self.partial and self.fixedlayout is None: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + finishlist.append(self) + # + return global_cache(self, ffi, 'new_%s_type' % self.kind, + self.get_official_name(), key=self) + + +class StructType(StructOrUnion): + kind = 'struct' + + +class UnionType(StructOrUnion): + kind = 'union' + + +class EnumType(StructOrUnionOrEnum): + kind = 'enum' + partial = False + partial_resolved = False + + def __init__(self, name, enumerators, enumvalues, baseinttype=None): + self.name = name + self.enumerators = enumerators + self.enumvalues = enumvalues + self.baseinttype = baseinttype + self.build_c_name_with_marker() + + def force_the_name(self, forcename): + StructOrUnionOrEnum.force_the_name(self, forcename) + if self.forcename is None: + name = self.get_official_name() + self.forcename = '$' + name.replace(' ', '_') + + def check_not_partial(self): + if self.partial and not self.partial_resolved: + raise VerificationMissing(self._get_c_name()) + + def build_backend_type(self, ffi, finishlist): + self.check_not_partial() + base_btype = self.build_baseinttype(ffi, finishlist) + return global_cache(self, ffi, 'new_enum_type', + self.get_official_name(), + self.enumerators, self.enumvalues, + base_btype, key=self) + + def build_baseinttype(self, ffi, finishlist): + if self.baseinttype is not None: + return self.baseinttype.get_cached_btype(ffi, finishlist) + # + if self.enumvalues: + smallest_value = min(self.enumvalues) + largest_value = max(self.enumvalues) + else: + import warnings + try: + # XXX! The goal is to ensure that the warnings.warn() + # will not suppress the warning. We want to get it + # several times if we reach this point several times. + __warningregistry__.clear() + except NameError: + pass + warnings.warn("%r has no values explicitly defined; " + "guessing that it is equivalent to 'unsigned int'" + % self._get_c_name()) + smallest_value = largest_value = 0 + if smallest_value < 0: # needs a signed type + sign = 1 + candidate1 = PrimitiveType("int") + candidate2 = PrimitiveType("long") + else: + sign = 0 + candidate1 = PrimitiveType("unsigned int") + candidate2 = PrimitiveType("unsigned long") + btype1 = candidate1.get_cached_btype(ffi, finishlist) + btype2 = candidate2.get_cached_btype(ffi, finishlist) + size1 = ffi.sizeof(btype1) + size2 = ffi.sizeof(btype2) + if (smallest_value >= ((-1) << (8*size1-1)) and + largest_value < (1 << (8*size1-sign))): + return btype1 + if (smallest_value >= ((-1) << (8*size2-1)) and + largest_value < (1 << (8*size2-sign))): + return btype2 + raise CDefError("%s values don't all fit into either 'long' " + "or 'unsigned long'" % self._get_c_name()) + +def unknown_type(name, structname=None): + if structname is None: + structname = '$%s' % name + tp = StructType(structname, None, None, None) + tp.force_the_name(name) + tp.origin = "unknown_type" + return tp + +def unknown_ptr_type(name, structname=None): + if structname is None: + structname = '$$%s' % name + tp = StructType(structname, None, None, None) + return NamedPointerType(tp, name) + + +global_lock = allocate_lock() +_typecache_cffi_backend = weakref.WeakValueDictionary() + +def get_typecache(backend): + # returns _typecache_cffi_backend if backend is the _cffi_backend + # module, or type(backend).__typecache if backend is an instance of + # CTypesBackend (or some FakeBackend class during tests) + if isinstance(backend, types.ModuleType): + return _typecache_cffi_backend + with global_lock: + if not hasattr(type(backend), '__typecache'): + type(backend).__typecache = weakref.WeakValueDictionary() + return type(backend).__typecache + +def global_cache(srctype, ffi, funcname, *args, **kwds): + key = kwds.pop('key', (funcname, args)) + assert not kwds + try: + return ffi._typecache[key] + except KeyError: + pass + try: + res = getattr(ffi._backend, funcname)(*args) + except NotImplementedError as e: + raise NotImplementedError("%s: %r: %s" % (funcname, srctype, e)) + # note that setdefault() on WeakValueDictionary is not atomic + # and contains a rare bug (http://bugs.python.org/issue19542); + # we have to use a lock and do it ourselves + cache = ffi._typecache + with global_lock: + res1 = cache.get(key) + if res1 is None: + cache[key] = res + return res + else: + return res1 + +def pointer_cache(ffi, BType): + return global_cache('?', ffi, 'new_pointer_type', BType) + +def attach_exception_info(e, name): + if e.args and type(e.args[0]) is str: + e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:] diff --git a/venv/lib/python3.7/site-packages/cffi/parse_c_type.h b/venv/lib/python3.7/site-packages/cffi/parse_c_type.h new file mode 100644 index 0000000..84e4ef8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/parse_c_type.h @@ -0,0 +1,181 @@ + +/* This part is from file 'cffi/parse_c_type.h'. It is copied at the + beginning of C sources generated by CFFI's ffi.set_source(). */ + +typedef void *_cffi_opcode_t; + +#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8)) +#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode) +#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8) + +#define _CFFI_OP_PRIMITIVE 1 +#define _CFFI_OP_POINTER 3 +#define _CFFI_OP_ARRAY 5 +#define _CFFI_OP_OPEN_ARRAY 7 +#define _CFFI_OP_STRUCT_UNION 9 +#define _CFFI_OP_ENUM 11 +#define _CFFI_OP_FUNCTION 13 +#define _CFFI_OP_FUNCTION_END 15 +#define _CFFI_OP_NOOP 17 +#define _CFFI_OP_BITFIELD 19 +#define _CFFI_OP_TYPENAME 21 +#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs +#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs +#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg) +#define _CFFI_OP_CONSTANT 29 +#define _CFFI_OP_CONSTANT_INT 31 +#define _CFFI_OP_GLOBAL_VAR 33 +#define _CFFI_OP_DLOPEN_FUNC 35 +#define _CFFI_OP_DLOPEN_CONST 37 +#define _CFFI_OP_GLOBAL_VAR_F 39 +#define _CFFI_OP_EXTERN_PYTHON 41 + +#define _CFFI_PRIM_VOID 0 +#define _CFFI_PRIM_BOOL 1 +#define _CFFI_PRIM_CHAR 2 +#define _CFFI_PRIM_SCHAR 3 +#define _CFFI_PRIM_UCHAR 4 +#define _CFFI_PRIM_SHORT 5 +#define _CFFI_PRIM_USHORT 6 +#define _CFFI_PRIM_INT 7 +#define _CFFI_PRIM_UINT 8 +#define _CFFI_PRIM_LONG 9 +#define _CFFI_PRIM_ULONG 10 +#define _CFFI_PRIM_LONGLONG 11 +#define _CFFI_PRIM_ULONGLONG 12 +#define _CFFI_PRIM_FLOAT 13 +#define _CFFI_PRIM_DOUBLE 14 +#define _CFFI_PRIM_LONGDOUBLE 15 + +#define _CFFI_PRIM_WCHAR 16 +#define _CFFI_PRIM_INT8 17 +#define _CFFI_PRIM_UINT8 18 +#define _CFFI_PRIM_INT16 19 +#define _CFFI_PRIM_UINT16 20 +#define _CFFI_PRIM_INT32 21 +#define _CFFI_PRIM_UINT32 22 +#define _CFFI_PRIM_INT64 23 +#define _CFFI_PRIM_UINT64 24 +#define _CFFI_PRIM_INTPTR 25 +#define _CFFI_PRIM_UINTPTR 26 +#define _CFFI_PRIM_PTRDIFF 27 +#define _CFFI_PRIM_SIZE 28 +#define _CFFI_PRIM_SSIZE 29 +#define _CFFI_PRIM_INT_LEAST8 30 +#define _CFFI_PRIM_UINT_LEAST8 31 +#define _CFFI_PRIM_INT_LEAST16 32 +#define _CFFI_PRIM_UINT_LEAST16 33 +#define _CFFI_PRIM_INT_LEAST32 34 +#define _CFFI_PRIM_UINT_LEAST32 35 +#define _CFFI_PRIM_INT_LEAST64 36 +#define _CFFI_PRIM_UINT_LEAST64 37 +#define _CFFI_PRIM_INT_FAST8 38 +#define _CFFI_PRIM_UINT_FAST8 39 +#define _CFFI_PRIM_INT_FAST16 40 +#define _CFFI_PRIM_UINT_FAST16 41 +#define _CFFI_PRIM_INT_FAST32 42 +#define _CFFI_PRIM_UINT_FAST32 43 +#define _CFFI_PRIM_INT_FAST64 44 +#define _CFFI_PRIM_UINT_FAST64 45 +#define _CFFI_PRIM_INTMAX 46 +#define _CFFI_PRIM_UINTMAX 47 +#define _CFFI_PRIM_FLOATCOMPLEX 48 +#define _CFFI_PRIM_DOUBLECOMPLEX 49 +#define _CFFI_PRIM_CHAR16 50 +#define _CFFI_PRIM_CHAR32 51 + +#define _CFFI__NUM_PRIM 52 +#define _CFFI__UNKNOWN_PRIM (-1) +#define _CFFI__UNKNOWN_FLOAT_PRIM (-2) +#define _CFFI__UNKNOWN_LONG_DOUBLE (-3) + +#define _CFFI__IO_FILE_STRUCT (-1) + + +struct _cffi_global_s { + const char *name; + void *address; + _cffi_opcode_t type_op; + void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown + // OP_CPYTHON_BLTN_*: addr of direct function +}; + +struct _cffi_getconst_s { + unsigned long long value; + const struct _cffi_type_context_s *ctx; + int gindex; +}; + +struct _cffi_struct_union_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_STRUCT_UNION + int flags; // _CFFI_F_* flags below + size_t size; + int alignment; + int first_field_index; // -> _cffi_fields array + int num_fields; +}; +#define _CFFI_F_UNION 0x01 // is a union, not a struct +#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the + // "standard layout" or if some are missing +#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct +#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include() +#define _CFFI_F_OPAQUE 0x10 // opaque + +struct _cffi_field_s { + const char *name; + size_t field_offset; + size_t field_size; + _cffi_opcode_t field_type_op; +}; + +struct _cffi_enum_s { + const char *name; + int type_index; // -> _cffi_types, on a OP_ENUM + int type_prim; // _CFFI_PRIM_xxx + const char *enumerators; // comma-delimited string +}; + +struct _cffi_typename_s { + const char *name; + int type_index; /* if opaque, points to a possibly artificial + OP_STRUCT which is itself opaque */ +}; + +struct _cffi_type_context_s { + _cffi_opcode_t *types; + const struct _cffi_global_s *globals; + const struct _cffi_field_s *fields; + const struct _cffi_struct_union_s *struct_unions; + const struct _cffi_enum_s *enums; + const struct _cffi_typename_s *typenames; + int num_globals; + int num_struct_unions; + int num_enums; + int num_typenames; + const char *const *includes; + int num_types; + int flags; /* future extension */ +}; + +struct _cffi_parse_info_s { + const struct _cffi_type_context_s *ctx; + _cffi_opcode_t *output; + unsigned int output_size; + size_t error_location; + const char *error_message; +}; + +struct _cffi_externpy_s { + const char *name; + size_t size_of_result; + void *reserved1, *reserved2; +}; + +#ifdef _CFFI_INTERNAL +static int parse_c_type(struct _cffi_parse_info_s *info, const char *input); +static int search_in_globals(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +static int search_in_struct_unions(const struct _cffi_type_context_s *ctx, + const char *search, size_t search_len); +#endif diff --git a/venv/lib/python3.7/site-packages/cffi/pkgconfig.py b/venv/lib/python3.7/site-packages/cffi/pkgconfig.py new file mode 100644 index 0000000..5c93f15 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/pkgconfig.py @@ -0,0 +1,121 @@ +# pkg-config, https://www.freedesktop.org/wiki/Software/pkg-config/ integration for cffi +import sys, os, subprocess + +from .error import PkgConfigError + + +def merge_flags(cfg1, cfg2): + """Merge values from cffi config flags cfg2 to cf1 + + Example: + merge_flags({"libraries": ["one"]}, {"libraries": ["two"]}) + {"libraries": ["one", "two"]} + """ + for key, value in cfg2.items(): + if key not in cfg1: + cfg1[key] = value + else: + if not isinstance(cfg1[key], list): + raise TypeError("cfg1[%r] should be a list of strings" % (key,)) + if not isinstance(value, list): + raise TypeError("cfg2[%r] should be a list of strings" % (key,)) + cfg1[key].extend(value) + return cfg1 + + +def call(libname, flag, encoding=sys.getfilesystemencoding()): + """Calls pkg-config and returns the output if found + """ + a = ["pkg-config", "--print-errors"] + a.append(flag) + a.append(libname) + try: + pc = subprocess.Popen(a, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except EnvironmentError as e: + raise PkgConfigError("cannot run pkg-config: %s" % (str(e).strip(),)) + + bout, berr = pc.communicate() + if pc.returncode != 0: + try: + berr = berr.decode(encoding) + except Exception: + pass + raise PkgConfigError(berr.strip()) + + if sys.version_info >= (3,) and not isinstance(bout, str): # Python 3.x + try: + bout = bout.decode(encoding) + except UnicodeDecodeError: + raise PkgConfigError("pkg-config %s %s returned bytes that cannot " + "be decoded with encoding %r:\n%r" % + (flag, libname, encoding, bout)) + + if os.altsep != '\\' and '\\' in bout: + raise PkgConfigError("pkg-config %s %s returned an unsupported " + "backslash-escaped output:\n%r" % + (flag, libname, bout)) + return bout + + +def flags_from_pkgconfig(libs): + r"""Return compiler line flags for FFI.set_source based on pkg-config output + + Usage + ... + ffibuilder.set_source("_foo", pkgconfig = ["libfoo", "libbar >= 1.8.3"]) + + If pkg-config is installed on build machine, then arguments include_dirs, + library_dirs, libraries, define_macros, extra_compile_args and + extra_link_args are extended with an output of pkg-config for libfoo and + libbar. + + Raises PkgConfigError in case the pkg-config call fails. + """ + + def get_include_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-I")] + + def get_library_dirs(string): + return [x[2:] for x in string.split() if x.startswith("-L")] + + def get_libraries(string): + return [x[2:] for x in string.split() if x.startswith("-l")] + + # convert -Dfoo=bar to list of tuples [("foo", "bar")] expected by distutils + def get_macros(string): + def _macro(x): + x = x[2:] # drop "-D" + if '=' in x: + return tuple(x.split("=", 1)) # "-Dfoo=bar" => ("foo", "bar") + else: + return (x, None) # "-Dfoo" => ("foo", None) + return [_macro(x) for x in string.split() if x.startswith("-D")] + + def get_other_cflags(string): + return [x for x in string.split() if not x.startswith("-I") and + not x.startswith("-D")] + + def get_other_libs(string): + return [x for x in string.split() if not x.startswith("-L") and + not x.startswith("-l")] + + # return kwargs for given libname + def kwargs(libname): + fse = sys.getfilesystemencoding() + all_cflags = call(libname, "--cflags") + all_libs = call(libname, "--libs") + return { + "include_dirs": get_include_dirs(all_cflags), + "library_dirs": get_library_dirs(all_libs), + "libraries": get_libraries(all_libs), + "define_macros": get_macros(all_cflags), + "extra_compile_args": get_other_cflags(all_cflags), + "extra_link_args": get_other_libs(all_libs), + } + + # merge all arguments together + ret = {} + for libname in libs: + lib_flags = kwargs(libname) + merge_flags(ret, lib_flags) + return ret diff --git a/venv/lib/python3.7/site-packages/cffi/vengine_cpy.py b/venv/lib/python3.7/site-packages/cffi/vengine_cpy.py new file mode 100644 index 0000000..536f11f --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/vengine_cpy.py @@ -0,0 +1,1015 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, imp +from . import model +from .error import VerificationError + + +class VCPythonEngine(object): + _class_key = 'x' + _gen_python_module = True + + def __init__(self, verifier): + self.verifier = verifier + self.ffi = verifier.ffi + self._struct_pending_verification = {} + self._types_of_builtin_functions = {} + + def patch_extension_kwds(self, kwds): + pass + + def find_module(self, module_name, path, so_suffixes): + try: + f, filename, descr = imp.find_module(module_name, path) + except ImportError: + return None + if f is not None: + f.close() + # Note that after a setuptools installation, there are both .py + # and .so files with the same basename. The code here relies on + # imp.find_module() locating the .so in priority. + if descr[0] not in so_suffixes: + return None + return filename + + def collect_types(self): + self._typesdict = {} + self._generate("collecttype") + + def _prnt(self, what=''): + self._f.write(what + '\n') + + def _gettypenum(self, type): + # a KeyError here is a bug. please report it! :-) + return self._typesdict[type] + + def _do_collect_type(self, tp): + if ((not isinstance(tp, model.PrimitiveType) + or tp.name == 'long double') + and tp not in self._typesdict): + num = len(self._typesdict) + self._typesdict[tp] = num + + def write_source_to_f(self): + self.collect_types() + # + # The new module will have a _cffi_setup() function that receives + # objects from the ffi world, and that calls some setup code in + # the module. This setup code is split in several independent + # functions, e.g. one per constant. The functions are "chained" + # by ending in a tail call to each other. + # + # This is further split in two chained lists, depending on if we + # can do it at import-time or if we must wait for _cffi_setup() to + # provide us with the objects. This is needed because we + # need the values of the enum constants in order to build the + # that we may have to pass to _cffi_setup(). + # + # The following two 'chained_list_constants' items contains + # the head of these two chained lists, as a string that gives the + # call to do, if any. + self._chained_list_constants = ['((void)lib,0)', '((void)lib,0)'] + # + prnt = self._prnt + # first paste some standard set of lines that are mostly '#define' + prnt(cffimod_header) + prnt() + # then paste the C source given by the user, verbatim. + prnt(self.verifier.preamble) + prnt() + # + # call generate_cpy_xxx_decl(), for every xxx found from + # ffi._parser._declarations. This generates all the functions. + self._generate("decl") + # + # implement the function _cffi_setup_custom() as calling the + # head of the chained list. + self._generate_setup_custom() + prnt() + # + # produce the method table, including the entries for the + # generated Python->C function wrappers, which are done + # by generate_cpy_function_method(). + prnt('static PyMethodDef _cffi_methods[] = {') + self._generate("method") + prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},') + prnt(' {NULL, NULL, 0, NULL} /* Sentinel */') + prnt('};') + prnt() + # + # standard init. + modname = self.verifier.get_module_name() + constants = self._chained_list_constants[False] + prnt('#if PY_MAJOR_VERSION >= 3') + prnt() + prnt('static struct PyModuleDef _cffi_module_def = {') + prnt(' PyModuleDef_HEAD_INIT,') + prnt(' "%s",' % modname) + prnt(' NULL,') + prnt(' -1,') + prnt(' _cffi_methods,') + prnt(' NULL, NULL, NULL, NULL') + prnt('};') + prnt() + prnt('PyMODINIT_FUNC') + prnt('PyInit_%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = PyModule_Create(&_cffi_module_def);') + prnt(' if (lib == NULL)') + prnt(' return NULL;') + prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,)) + prnt(' Py_DECREF(lib);') + prnt(' return NULL;') + prnt(' }') + prnt(' return lib;') + prnt('}') + prnt() + prnt('#else') + prnt() + prnt('PyMODINIT_FUNC') + prnt('init%s(void)' % modname) + prnt('{') + prnt(' PyObject *lib;') + prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname) + prnt(' if (lib == NULL)') + prnt(' return;') + prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,)) + prnt(' return;') + prnt(' return;') + prnt('}') + prnt() + prnt('#endif') + + def load_library(self, flags=None): + # XXX review all usages of 'self' here! + # import it as a new extension module + imp.acquire_lock() + try: + if hasattr(sys, "getdlopenflags"): + previous_flags = sys.getdlopenflags() + try: + if hasattr(sys, "setdlopenflags") and flags is not None: + sys.setdlopenflags(flags) + module = imp.load_dynamic(self.verifier.get_module_name(), + self.verifier.modulefilename) + except ImportError as e: + error = "importing %r: %s" % (self.verifier.modulefilename, e) + raise VerificationError(error) + finally: + if hasattr(sys, "setdlopenflags"): + sys.setdlopenflags(previous_flags) + finally: + imp.release_lock() + # + # call loading_cpy_struct() to get the struct layout inferred by + # the C compiler + self._load(module, 'loading') + # + # the C code will need the objects. Collect them in + # order in a list. + revmapping = dict([(value, key) + for (key, value) in self._typesdict.items()]) + lst = [revmapping[i] for i in range(len(revmapping))] + lst = list(map(self.ffi._get_cached_btype, lst)) + # + # build the FFILibrary class and instance and call _cffi_setup(). + # this will set up some fields like '_cffi_types', and only then + # it will invoke the chained list of functions that will really + # build (notably) the constant objects, as if they are + # pointers, and store them as attributes on the 'library' object. + class FFILibrary(object): + _cffi_python_module = module + _cffi_ffi = self.ffi + _cffi_dir = [] + def __dir__(self): + return FFILibrary._cffi_dir + list(self.__dict__) + library = FFILibrary() + if module._cffi_setup(lst, VerificationError, library): + import warnings + warnings.warn("reimporting %r might overwrite older definitions" + % (self.verifier.get_module_name())) + # + # finally, call the loaded_cpy_xxx() functions. This will perform + # the final adjustments, like copying the Python->C wrapper + # functions from the module to the 'library' object, and setting + # up the FFILibrary class with properties for the global C variables. + self._load(module, 'loaded', library=library) + module._cffi_original_ffi = self.ffi + module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions + return library + + def _get_declarations(self): + lst = [(key, tp) for (key, (tp, qual)) in + self.ffi._parser._declarations.items()] + lst.sort() + return lst + + def _generate(self, step_name): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + try: + method = getattr(self, '_generate_cpy_%s_%s' % (kind, + step_name)) + except AttributeError: + raise VerificationError( + "not implemented in verify(): %r" % name) + try: + method(tp, realname) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _load(self, module, step_name, **kwds): + for name, tp in self._get_declarations(): + kind, realname = name.split(' ', 1) + method = getattr(self, '_%s_cpy_%s' % (step_name, kind)) + try: + method(tp, realname, module, **kwds) + except Exception as e: + model.attach_exception_info(e, name) + raise + + def _generate_nothing(self, tp, name): + pass + + def _loaded_noop(self, tp, name, module, **kwds): + pass + + # ---------- + + def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): + extraarg = '' + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + converter = '_cffi_to_c_int' + extraarg = ', %s' % tp.name + else: + converter = '(%s)_cffi_to_c_%s' % (tp.get_c_name(''), + tp.name.replace(' ', '_')) + errvalue = '-1' + # + elif isinstance(tp, model.PointerType): + self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, + tovar, errcode) + return + # + elif isinstance(tp, (model.StructOrUnion, model.EnumType)): + # a struct (not a struct pointer) as a function argument + self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' + % (tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + return + # + elif isinstance(tp, model.FunctionPtrType): + converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') + extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) + errvalue = 'NULL' + # + else: + raise NotImplementedError(tp) + # + self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) + self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( + tovar, tp.get_c_name(''), errvalue)) + self._prnt(' %s;' % errcode) + + def _extra_local_variables(self, tp, localvars): + if isinstance(tp, model.PointerType): + localvars.add('Py_ssize_t datasize') + + def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): + self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') + self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( + self._gettypenum(tp), fromvar, tovar)) + self._prnt(' if (datasize != 0) {') + self._prnt(' if (datasize < 0)') + self._prnt(' %s;' % errcode) + self._prnt(' %s = alloca((size_t)datasize);' % (tovar,)) + self._prnt(' memset((void *)%s, 0, (size_t)datasize);' % (tovar,)) + self._prnt(' if (_cffi_convert_array_from_object(' + '(char *)%s, _cffi_type(%d), %s) < 0)' % ( + tovar, self._gettypenum(tp), fromvar)) + self._prnt(' %s;' % errcode) + self._prnt(' }') + + def _convert_expr_from_c(self, tp, var, context): + if isinstance(tp, model.PrimitiveType): + if tp.is_integer_type() and tp.name != '_Bool': + return '_cffi_from_c_int(%s, %s)' % (var, tp.name) + elif tp.name != 'long double': + return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var) + else: + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.ArrayType): + return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( + var, self._gettypenum(model.PointerType(tp.item))) + elif isinstance(tp, model.StructOrUnion): + if tp.fldnames is None: + raise TypeError("'%s' is used as %s, but is opaque" % ( + tp._get_c_name(), context)) + return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + elif isinstance(tp, model.EnumType): + return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( + var, self._gettypenum(tp)) + else: + raise NotImplementedError(tp) + + # ---------- + # typedefs: generates no code so far + + _generate_cpy_typedef_collecttype = _generate_nothing + _generate_cpy_typedef_decl = _generate_nothing + _generate_cpy_typedef_method = _generate_nothing + _loading_cpy_typedef = _loaded_noop + _loaded_cpy_typedef = _loaded_noop + + # ---------- + # function declarations + + def _generate_cpy_function_collecttype(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + self._do_collect_type(tp) + else: + # don't call _do_collect_type(tp) in this common case, + # otherwise test_autofilled_struct_as_argument fails + for type in tp.args: + self._do_collect_type(type) + self._do_collect_type(tp.result) + + def _generate_cpy_function_decl(self, tp, name): + assert isinstance(tp, model.FunctionPtrType) + if tp.ellipsis: + # cannot support vararg functions better than this: check for its + # exact type (including the fixed arguments), and build it as a + # constant function pointer (no CPython wrapper) + self._generate_cpy_const(False, name, tp) + return + prnt = self._prnt + numargs = len(tp.args) + if numargs == 0: + argname = 'noarg' + elif numargs == 1: + argname = 'arg0' + else: + argname = 'args' + prnt('static PyObject *') + prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) + prnt('{') + # + context = 'argument of %s' % name + for i, type in enumerate(tp.args): + prnt(' %s;' % type.get_c_name(' x%d' % i, context)) + # + localvars = set() + for type in tp.args: + self._extra_local_variables(type, localvars) + for decl in localvars: + prnt(' %s;' % (decl,)) + # + if not isinstance(tp.result, model.VoidType): + result_code = 'result = ' + context = 'result of %s' % name + prnt(' %s;' % tp.result.get_c_name(' result', context)) + else: + result_code = '' + # + if len(tp.args) > 1: + rng = range(len(tp.args)) + for i in rng: + prnt(' PyObject *arg%d;' % i) + prnt() + prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % ( + 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng]))) + prnt(' return NULL;') + prnt() + # + for i, type in enumerate(tp.args): + self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, + 'return NULL') + prnt() + # + prnt(' Py_BEGIN_ALLOW_THREADS') + prnt(' _cffi_restore_errno();') + prnt(' { %s%s(%s); }' % ( + result_code, name, + ', '.join(['x%d' % i for i in range(len(tp.args))]))) + prnt(' _cffi_save_errno();') + prnt(' Py_END_ALLOW_THREADS') + prnt() + # + prnt(' (void)self; /* unused */') + if numargs == 0: + prnt(' (void)noarg; /* unused */') + if result_code: + prnt(' return %s;' % + self._convert_expr_from_c(tp.result, 'result', 'result type')) + else: + prnt(' Py_INCREF(Py_None);') + prnt(' return Py_None;') + prnt('}') + prnt() + + def _generate_cpy_function_method(self, tp, name): + if tp.ellipsis: + return + numargs = len(tp.args) + if numargs == 0: + meth = 'METH_NOARGS' + elif numargs == 1: + meth = 'METH_O' + else: + meth = 'METH_VARARGS' + self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth)) + + _loading_cpy_function = _loaded_noop + + def _loaded_cpy_function(self, tp, name, module, library): + if tp.ellipsis: + return + func = getattr(module, name) + setattr(library, name, func) + self._types_of_builtin_functions[func] = tp + + # ---------- + # named structs + + _generate_cpy_struct_collecttype = _generate_nothing + def _generate_cpy_struct_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'struct', name) + def _generate_cpy_struct_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'struct', name) + def _loading_cpy_struct(self, tp, name, module): + self._loading_struct_or_union(tp, 'struct', name, module) + def _loaded_cpy_struct(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + _generate_cpy_union_collecttype = _generate_nothing + def _generate_cpy_union_decl(self, tp, name): + assert name == tp.name + self._generate_struct_or_union_decl(tp, 'union', name) + def _generate_cpy_union_method(self, tp, name): + self._generate_struct_or_union_method(tp, 'union', name) + def _loading_cpy_union(self, tp, name, module): + self._loading_struct_or_union(tp, 'union', name, module) + def _loaded_cpy_union(self, tp, name, module, **kwds): + self._loaded_struct_or_union(tp) + + def _generate_struct_or_union_decl(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + checkfuncname = '_cffi_check_%s_%s' % (prefix, name) + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + cname = ('%s %s' % (prefix, name)).strip() + # + prnt = self._prnt + prnt('static void %s(%s *p)' % (checkfuncname, cname)) + prnt('{') + prnt(' /* only to generate compile-time warnings or errors */') + prnt(' (void)p;') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if (isinstance(ftype, model.PrimitiveType) + and ftype.is_integer_type()) or fbitsize >= 0: + # accept all integers, but complain on float or double + prnt(' (void)((p->%s) << 1);' % fname) + else: + # only accept exactly the type declared. + try: + prnt(' { %s = &p->%s; (void)tmp; }' % ( + ftype.get_c_name('*tmp', 'field %r'%fname, quals=fqual), + fname)) + except VerificationError as e: + prnt(' /* %s */' % str(e)) # cannot verify it, ignore + prnt('}') + prnt('static PyObject *') + prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,)) + prnt('{') + prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) + prnt(' static Py_ssize_t nums[] = {') + prnt(' sizeof(%s),' % cname) + prnt(' offsetof(struct _cffi_aligncheck, y),') + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + prnt(' offsetof(%s, %s),' % (cname, fname)) + if isinstance(ftype, model.ArrayType) and ftype.length is None: + prnt(' 0, /* %s */' % ftype._get_c_name()) + else: + prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) + prnt(' -1') + prnt(' };') + prnt(' (void)self; /* unused */') + prnt(' (void)noarg; /* unused */') + prnt(' return _cffi_get_struct_layout(nums);') + prnt(' /* the next line is not executed, but compiled */') + prnt(' %s(0);' % (checkfuncname,)) + prnt('}') + prnt() + + def _generate_struct_or_union_method(self, tp, prefix, name): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname, + layoutfuncname)) + + def _loading_struct_or_union(self, tp, prefix, name, module): + if tp.fldnames is None: + return # nothing to do with opaque structs + layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) + # + function = getattr(module, layoutfuncname) + layout = function() + if isinstance(tp, model.StructOrUnion) and tp.partial: + # use the function()'s sizes and offsets to guide the + # layout of the struct + totalsize = layout[0] + totalalignment = layout[1] + fieldofs = layout[2::2] + fieldsize = layout[3::2] + tp.force_flatten() + assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) + tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment + else: + cname = ('%s %s' % (prefix, name)).strip() + self._struct_pending_verification[tp] = layout, cname + + def _loaded_struct_or_union(self, tp): + if tp.fldnames is None: + return # nothing to do with opaque structs + self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered + + if tp in self._struct_pending_verification: + # check that the layout sizes and offsets match the real ones + def check(realvalue, expectedvalue, msg): + if realvalue != expectedvalue: + raise VerificationError( + "%s (we have %d, but C compiler says %d)" + % (msg, expectedvalue, realvalue)) + ffi = self.ffi + BStruct = ffi._get_cached_btype(tp) + layout, cname = self._struct_pending_verification.pop(tp) + check(layout[0], ffi.sizeof(BStruct), "wrong total size") + check(layout[1], ffi.alignof(BStruct), "wrong total alignment") + i = 2 + for fname, ftype, fbitsize, fqual in tp.enumfields(): + if fbitsize >= 0: + continue # xxx ignore fbitsize for now + check(layout[i], ffi.offsetof(BStruct, fname), + "wrong offset for field %r" % (fname,)) + if layout[i+1] != 0: + BField = ffi._get_cached_btype(ftype) + check(layout[i+1], ffi.sizeof(BField), + "wrong size for field %r" % (fname,)) + i += 2 + assert i == len(layout) + + # ---------- + # 'anonymous' declarations. These are produced for anonymous structs + # or unions; the 'name' is obtained by a typedef. + + _generate_cpy_anonymous_collecttype = _generate_nothing + + def _generate_cpy_anonymous_decl(self, tp, name): + if isinstance(tp, model.EnumType): + self._generate_cpy_enum_decl(tp, name, '') + else: + self._generate_struct_or_union_decl(tp, '', name) + + def _generate_cpy_anonymous_method(self, tp, name): + if not isinstance(tp, model.EnumType): + self._generate_struct_or_union_method(tp, '', name) + + def _loading_cpy_anonymous(self, tp, name, module): + if isinstance(tp, model.EnumType): + self._loading_cpy_enum(tp, name, module) + else: + self._loading_struct_or_union(tp, '', name, module) + + def _loaded_cpy_anonymous(self, tp, name, module, **kwds): + if isinstance(tp, model.EnumType): + self._loaded_cpy_enum(tp, name, module, **kwds) + else: + self._loaded_struct_or_union(tp) + + # ---------- + # constants, likely declared with '#define' + + def _generate_cpy_const(self, is_int, name, tp=None, category='const', + vartp=None, delayed=True, size_too=False, + check_value=None): + prnt = self._prnt + funcname = '_cffi_%s_%s' % (category, name) + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + prnt(' PyObject *o;') + prnt(' int res;') + if not is_int: + prnt(' %s;' % (vartp or tp).get_c_name(' i', name)) + else: + assert category == 'const' + # + if check_value is not None: + self._check_int_constant_value(name, check_value) + # + if not is_int: + if category == 'var': + realexpr = '&' + name + else: + realexpr = name + prnt(' i = (%s);' % (realexpr,)) + prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i', + 'variable type'),)) + assert delayed + else: + prnt(' o = _cffi_from_c_int_const(%s);' % name) + prnt(' if (o == NULL)') + prnt(' return -1;') + if size_too: + prnt(' {') + prnt(' PyObject *o1 = o;') + prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));' + % (name,)) + prnt(' Py_DECREF(o1);') + prnt(' if (o == NULL)') + prnt(' return -1;') + prnt(' }') + prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name) + prnt(' Py_DECREF(o);') + prnt(' if (res < 0)') + prnt(' return -1;') + prnt(' return %s;' % self._chained_list_constants[delayed]) + self._chained_list_constants[delayed] = funcname + '(lib)' + prnt('}') + prnt() + + def _generate_cpy_constant_collecttype(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + if not is_int: + self._do_collect_type(tp) + + def _generate_cpy_constant_decl(self, tp, name): + is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() + self._generate_cpy_const(is_int, name, tp) + + _generate_cpy_constant_method = _generate_nothing + _loading_cpy_constant = _loaded_noop + _loaded_cpy_constant = _loaded_noop + + # ---------- + # enums + + def _check_int_constant_value(self, name, value, err_prefix=''): + prnt = self._prnt + if value <= 0: + prnt(' if ((%s) > 0 || (long)(%s) != %dL) {' % ( + name, name, value)) + else: + prnt(' if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {' % ( + name, name, value)) + prnt(' char buf[64];') + prnt(' if ((%s) <= 0)' % name) + prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % name) + prnt(' else') + prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' % + name) + prnt(' PyErr_Format(_cffi_VerificationError,') + prnt(' "%s%s has the real value %s, not %s",') + prnt(' "%s", "%s", buf, "%d");' % ( + err_prefix, name, value)) + prnt(' return -1;') + prnt(' }') + + def _enum_funcname(self, prefix, name): + # "$enum_$1" => "___D_enum____D_1" + name = name.replace('$', '___D_') + return '_cffi_e_%s_%s' % (prefix, name) + + def _generate_cpy_enum_decl(self, tp, name, prefix='enum'): + if tp.partial: + for enumerator in tp.enumerators: + self._generate_cpy_const(True, enumerator, delayed=False) + return + # + funcname = self._enum_funcname(prefix, name) + prnt = self._prnt + prnt('static int %s(PyObject *lib)' % funcname) + prnt('{') + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + self._check_int_constant_value(enumerator, enumvalue, + "enum %s: " % name) + prnt(' return %s;' % self._chained_list_constants[True]) + self._chained_list_constants[True] = funcname + '(lib)' + prnt('}') + prnt() + + _generate_cpy_enum_collecttype = _generate_nothing + _generate_cpy_enum_method = _generate_nothing + + def _loading_cpy_enum(self, tp, name, module): + if tp.partial: + enumvalues = [getattr(module, enumerator) + for enumerator in tp.enumerators] + tp.enumvalues = tuple(enumvalues) + tp.partial_resolved = True + + def _loaded_cpy_enum(self, tp, name, module, library): + for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): + setattr(library, enumerator, enumvalue) + + # ---------- + # macros: for now only for integers + + def _generate_cpy_macro_decl(self, tp, name): + if tp == '...': + check_value = None + else: + check_value = tp # an integer + self._generate_cpy_const(True, name, check_value=check_value) + + _generate_cpy_macro_collecttype = _generate_nothing + _generate_cpy_macro_method = _generate_nothing + _loading_cpy_macro = _loaded_noop + _loaded_cpy_macro = _loaded_noop + + # ---------- + # global variables + + def _generate_cpy_variable_collecttype(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + else: + tp_ptr = model.PointerType(tp) + self._do_collect_type(tp_ptr) + + def _generate_cpy_variable_decl(self, tp, name): + if isinstance(tp, model.ArrayType): + tp_ptr = model.PointerType(tp.item) + self._generate_cpy_const(False, name, tp, vartp=tp_ptr, + size_too = (tp.length == '...')) + else: + tp_ptr = model.PointerType(tp) + self._generate_cpy_const(False, name, tp_ptr, category='var') + + _generate_cpy_variable_method = _generate_nothing + _loading_cpy_variable = _loaded_noop + + def _loaded_cpy_variable(self, tp, name, module, library): + value = getattr(library, name) + if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the + # sense that "a=..." is forbidden + if tp.length == '...': + assert isinstance(value, tuple) + (value, size) = value + BItemType = self.ffi._get_cached_btype(tp.item) + length, rest = divmod(size, self.ffi.sizeof(BItemType)) + if rest != 0: + raise VerificationError( + "bad size: %r does not seem to be an array of %s" % + (name, tp.item)) + tp = tp.resolve_length(length) + # 'value' is a which we have to replace with + # a if the N is actually known + if tp.length is not None: + BArray = self.ffi._get_cached_btype(tp) + value = self.ffi.cast(BArray, value) + setattr(library, name, value) + return + # remove ptr= from the library instance, and replace + # it by a property on the class, which reads/writes into ptr[0]. + ptr = value + delattr(library, name) + def getter(library): + return ptr[0] + def setter(library, value): + ptr[0] = value + setattr(type(library), name, property(getter, setter)) + type(library)._cffi_dir.append(name) + + # ---------- + + def _generate_setup_custom(self): + prnt = self._prnt + prnt('static int _cffi_setup_custom(PyObject *lib)') + prnt('{') + prnt(' return %s;' % self._chained_list_constants[True]) + prnt('}') + +cffimod_header = r''' +#include +#include + +/* this block of #ifs should be kept exactly identical between + c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py + and cffi/_cffi_include.h */ +#if defined(_MSC_VER) +# include /* for alloca() */ +# if _MSC_VER < 1600 /* MSVC < 2010 */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + typedef __int8 int_least8_t; + typedef __int16 int_least16_t; + typedef __int32 int_least32_t; + typedef __int64 int_least64_t; + typedef unsigned __int8 uint_least8_t; + typedef unsigned __int16 uint_least16_t; + typedef unsigned __int32 uint_least32_t; + typedef unsigned __int64 uint_least64_t; + typedef __int8 int_fast8_t; + typedef __int16 int_fast16_t; + typedef __int32 int_fast32_t; + typedef __int64 int_fast64_t; + typedef unsigned __int8 uint_fast8_t; + typedef unsigned __int16 uint_fast16_t; + typedef unsigned __int32 uint_fast32_t; + typedef unsigned __int64 uint_fast64_t; + typedef __int64 intmax_t; + typedef unsigned __int64 uintmax_t; +# else +# include +# endif +# if _MSC_VER < 1800 /* MSVC < 2013 */ +# ifndef __cplusplus + typedef unsigned char _Bool; +# endif +# endif +#else +# include +# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) +# include +# endif +#endif + +#if PY_MAJOR_VERSION < 3 +# undef PyCapsule_CheckExact +# undef PyCapsule_GetPointer +# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +# define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) +#endif + +#if PY_MAJOR_VERSION >= 3 +# define PyInt_FromLong PyLong_FromLong +#endif + +#define _cffi_from_c_double PyFloat_FromDouble +#define _cffi_from_c_float PyFloat_FromDouble +#define _cffi_from_c_long PyInt_FromLong +#define _cffi_from_c_ulong PyLong_FromUnsignedLong +#define _cffi_from_c_longlong PyLong_FromLongLong +#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong +#define _cffi_from_c__Bool PyBool_FromLong + +#define _cffi_to_c_double PyFloat_AsDouble +#define _cffi_to_c_float PyFloat_AsDouble + +#define _cffi_from_c_int_const(x) \ + (((x) > 0) ? \ + ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \ + ((long long)(x) >= (long long)LONG_MIN) ? \ + PyInt_FromLong((long)(x)) : \ + PyLong_FromLongLong((long long)(x))) + +#define _cffi_from_c_int(x, type) \ + (((type)-1) > 0 ? /* unsigned */ \ + (sizeof(type) < sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + sizeof(type) == sizeof(long) ? \ + PyLong_FromUnsignedLong((unsigned long)x) : \ + PyLong_FromUnsignedLongLong((unsigned long long)x)) : \ + (sizeof(type) <= sizeof(long) ? \ + PyInt_FromLong((long)x) : \ + PyLong_FromLongLong((long long)x))) + +#define _cffi_to_c_int(o, type) \ + ((type)( \ + sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ + : (type)_cffi_to_c_i8(o)) : \ + sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ + : (type)_cffi_to_c_i16(o)) : \ + sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ + : (type)_cffi_to_c_i32(o)) : \ + sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ + : (type)_cffi_to_c_i64(o)) : \ + (Py_FatalError("unsupported size for type " #type), (type)0))) + +#define _cffi_to_c_i8 \ + ((int(*)(PyObject *))_cffi_exports[1]) +#define _cffi_to_c_u8 \ + ((int(*)(PyObject *))_cffi_exports[2]) +#define _cffi_to_c_i16 \ + ((int(*)(PyObject *))_cffi_exports[3]) +#define _cffi_to_c_u16 \ + ((int(*)(PyObject *))_cffi_exports[4]) +#define _cffi_to_c_i32 \ + ((int(*)(PyObject *))_cffi_exports[5]) +#define _cffi_to_c_u32 \ + ((unsigned int(*)(PyObject *))_cffi_exports[6]) +#define _cffi_to_c_i64 \ + ((long long(*)(PyObject *))_cffi_exports[7]) +#define _cffi_to_c_u64 \ + ((unsigned long long(*)(PyObject *))_cffi_exports[8]) +#define _cffi_to_c_char \ + ((int(*)(PyObject *))_cffi_exports[9]) +#define _cffi_from_c_pointer \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10]) +#define _cffi_to_c_pointer \ + ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11]) +#define _cffi_get_struct_layout \ + ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12]) +#define _cffi_restore_errno \ + ((void(*)(void))_cffi_exports[13]) +#define _cffi_save_errno \ + ((void(*)(void))_cffi_exports[14]) +#define _cffi_from_c_char \ + ((PyObject *(*)(char))_cffi_exports[15]) +#define _cffi_from_c_deref \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16]) +#define _cffi_to_c \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17]) +#define _cffi_from_c_struct \ + ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18]) +#define _cffi_to_c_wchar_t \ + ((wchar_t(*)(PyObject *))_cffi_exports[19]) +#define _cffi_from_c_wchar_t \ + ((PyObject *(*)(wchar_t))_cffi_exports[20]) +#define _cffi_to_c_long_double \ + ((long double(*)(PyObject *))_cffi_exports[21]) +#define _cffi_to_c__Bool \ + ((_Bool(*)(PyObject *))_cffi_exports[22]) +#define _cffi_prepare_pointer_call_argument \ + ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23]) +#define _cffi_convert_array_from_object \ + ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24]) +#define _CFFI_NUM_EXPORTS 25 + +typedef struct _ctypedescr CTypeDescrObject; + +static void *_cffi_exports[_CFFI_NUM_EXPORTS]; +static PyObject *_cffi_types, *_cffi_VerificationError; + +static int _cffi_setup_custom(PyObject *lib); /* forward */ + +static PyObject *_cffi_setup(PyObject *self, PyObject *args) +{ + PyObject *library; + int was_alive = (_cffi_types != NULL); + (void)self; /* unused */ + if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError, + &library)) + return NULL; + Py_INCREF(_cffi_types); + Py_INCREF(_cffi_VerificationError); + if (_cffi_setup_custom(library) < 0) + return NULL; + return PyBool_FromLong(was_alive); +} + +static int _cffi_init(void) +{ + PyObject *module, *c_api_object = NULL; + + module = PyImport_ImportModule("_cffi_backend"); + if (module == NULL) + goto failure; + + c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) + goto failure; + if (!PyCapsule_CheckExact(c_api_object)) { + PyErr_SetNone(PyExc_ImportError); + goto failure; + } + memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"), + _CFFI_NUM_EXPORTS * sizeof(void *)); + + Py_DECREF(module); + Py_DECREF(c_api_object); + return 0; + + failure: + Py_XDECREF(module); + Py_XDECREF(c_api_object); + return -1; +} + +#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num)) + +/**********/ +''' diff --git a/venv/lib/python3.7/site-packages/cffi/verifier.py b/venv/lib/python3.7/site-packages/cffi/verifier.py new file mode 100644 index 0000000..59b78c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cffi/verifier.py @@ -0,0 +1,306 @@ +# +# DEPRECATED: implementation for ffi.verify() +# +import sys, os, binascii, shutil, io +from . import __version_verifier_modules__ +from . import ffiplatform +from .error import VerificationError + +if sys.version_info >= (3, 3): + import importlib.machinery + def _extension_suffixes(): + return importlib.machinery.EXTENSION_SUFFIXES[:] +else: + import imp + def _extension_suffixes(): + return [suffix for suffix, _, type in imp.get_suffixes() + if type == imp.C_EXTENSION] + + +if sys.version_info >= (3,): + NativeIO = io.StringIO +else: + class NativeIO(io.BytesIO): + def write(self, s): + if isinstance(s, unicode): + s = s.encode('ascii') + super(NativeIO, self).write(s) + + +class Verifier(object): + + def __init__(self, ffi, preamble, tmpdir=None, modulename=None, + ext_package=None, tag='', force_generic_engine=False, + source_extension='.c', flags=None, relative_to=None, **kwds): + if ffi._parser._uses_new_feature: + raise VerificationError( + "feature not supported with ffi.verify(), but only " + "with ffi.set_source(): %s" % (ffi._parser._uses_new_feature,)) + self.ffi = ffi + self.preamble = preamble + if not modulename: + flattened_kwds = ffiplatform.flatten(kwds) + vengine_class = _locate_engine_class(ffi, force_generic_engine) + self._vengine = vengine_class(self) + self._vengine.patch_extension_kwds(kwds) + self.flags = flags + self.kwds = self.make_relative_to(kwds, relative_to) + # + if modulename: + if tag: + raise TypeError("can't specify both 'modulename' and 'tag'") + else: + key = '\x00'.join([sys.version[:3], __version_verifier_modules__, + preamble, flattened_kwds] + + ffi._cdefsources) + if sys.version_info >= (3,): + key = key.encode('utf-8') + k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) + k1 = k1.lstrip('0x').rstrip('L') + k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) + k2 = k2.lstrip('0').rstrip('L') + modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key, + k1, k2) + suffix = _get_so_suffixes()[0] + self.tmpdir = tmpdir or _caller_dir_pycache() + self.sourcefilename = os.path.join(self.tmpdir, modulename + source_extension) + self.modulefilename = os.path.join(self.tmpdir, modulename + suffix) + self.ext_package = ext_package + self._has_source = False + self._has_module = False + + def write_source(self, file=None): + """Write the C source code. It is produced in 'self.sourcefilename', + which can be tweaked beforehand.""" + with self.ffi._lock: + if self._has_source and file is None: + raise VerificationError( + "source code already written") + self._write_source(file) + + def compile_module(self): + """Write the C source code (if not done already) and compile it. + This produces a dynamic link library in 'self.modulefilename'.""" + with self.ffi._lock: + if self._has_module: + raise VerificationError("module already compiled") + if not self._has_source: + self._write_source() + self._compile_module() + + def load_library(self): + """Get a C module from this Verifier instance. + Returns an instance of a FFILibrary class that behaves like the + objects returned by ffi.dlopen(), but that delegates all + operations to the C module. If necessary, the C code is written + and compiled first. + """ + with self.ffi._lock: + if not self._has_module: + self._locate_module() + if not self._has_module: + if not self._has_source: + self._write_source() + self._compile_module() + return self._load_library() + + def get_module_name(self): + basename = os.path.basename(self.modulefilename) + # kill both the .so extension and the other .'s, as introduced + # by Python 3: 'basename.cpython-33m.so' + basename = basename.split('.', 1)[0] + # and the _d added in Python 2 debug builds --- but try to be + # conservative and not kill a legitimate _d + if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'): + basename = basename[:-2] + return basename + + def get_extension(self): + ffiplatform._hack_at_distutils() # backward compatibility hack + if not self._has_source: + with self.ffi._lock: + if not self._has_source: + self._write_source() + sourcename = ffiplatform.maybe_relative_path(self.sourcefilename) + modname = self.get_module_name() + return ffiplatform.get_extension(sourcename, modname, **self.kwds) + + def generates_python_module(self): + return self._vengine._gen_python_module + + def make_relative_to(self, kwds, relative_to): + if relative_to and os.path.dirname(relative_to): + dirname = os.path.dirname(relative_to) + kwds = kwds.copy() + for key in ffiplatform.LIST_OF_FILE_NAMES: + if key in kwds: + lst = kwds[key] + if not isinstance(lst, (list, tuple)): + raise TypeError("keyword '%s' should be a list or tuple" + % (key,)) + lst = [os.path.join(dirname, fn) for fn in lst] + kwds[key] = lst + return kwds + + # ---------- + + def _locate_module(self): + if not os.path.isfile(self.modulefilename): + if self.ext_package: + try: + pkg = __import__(self.ext_package, None, None, ['__doc__']) + except ImportError: + return # cannot import the package itself, give up + # (e.g. it might be called differently before installation) + path = pkg.__path__ + else: + path = None + filename = self._vengine.find_module(self.get_module_name(), path, + _get_so_suffixes()) + if filename is None: + return + self.modulefilename = filename + self._vengine.collect_types() + self._has_module = True + + def _write_source_to(self, file): + self._vengine._f = file + try: + self._vengine.write_source_to_f() + finally: + del self._vengine._f + + def _write_source(self, file=None): + if file is not None: + self._write_source_to(file) + else: + # Write our source file to an in memory file. + f = NativeIO() + self._write_source_to(f) + source_data = f.getvalue() + + # Determine if this matches the current file + if os.path.exists(self.sourcefilename): + with open(self.sourcefilename, "r") as fp: + needs_written = not (fp.read() == source_data) + else: + needs_written = True + + # Actually write the file out if it doesn't match + if needs_written: + _ensure_dir(self.sourcefilename) + with open(self.sourcefilename, "w") as fp: + fp.write(source_data) + + # Set this flag + self._has_source = True + + def _compile_module(self): + # compile this C source + tmpdir = os.path.dirname(self.sourcefilename) + outputfilename = ffiplatform.compile(tmpdir, self.get_extension()) + try: + same = ffiplatform.samefile(outputfilename, self.modulefilename) + except OSError: + same = False + if not same: + _ensure_dir(self.modulefilename) + shutil.move(outputfilename, self.modulefilename) + self._has_module = True + + def _load_library(self): + assert self._has_module + if self.flags is not None: + return self._vengine.load_library(self.flags) + else: + return self._vengine.load_library() + +# ____________________________________________________________ + +_FORCE_GENERIC_ENGINE = False # for tests + +def _locate_engine_class(ffi, force_generic_engine): + if _FORCE_GENERIC_ENGINE: + force_generic_engine = True + if not force_generic_engine: + if '__pypy__' in sys.builtin_module_names: + force_generic_engine = True + else: + try: + import _cffi_backend + except ImportError: + _cffi_backend = '?' + if ffi._backend is not _cffi_backend: + force_generic_engine = True + if force_generic_engine: + from . import vengine_gen + return vengine_gen.VGenericEngine + else: + from . import vengine_cpy + return vengine_cpy.VCPythonEngine + +# ____________________________________________________________ + +_TMPDIR = None + +def _caller_dir_pycache(): + if _TMPDIR: + return _TMPDIR + result = os.environ.get('CFFI_TMPDIR') + if result: + return result + filename = sys._getframe(2).f_code.co_filename + return os.path.abspath(os.path.join(os.path.dirname(filename), + '__pycache__')) + +def set_tmpdir(dirname): + """Set the temporary directory to use instead of __pycache__.""" + global _TMPDIR + _TMPDIR = dirname + +def cleanup_tmpdir(tmpdir=None, keep_so=False): + """Clean up the temporary directory by removing all files in it + called `_cffi_*.{c,so}` as well as the `build` subdirectory.""" + tmpdir = tmpdir or _caller_dir_pycache() + try: + filelist = os.listdir(tmpdir) + except OSError: + return + if keep_so: + suffix = '.c' # only remove .c files + else: + suffix = _get_so_suffixes()[0].lower() + for fn in filelist: + if fn.lower().startswith('_cffi_') and ( + fn.lower().endswith(suffix) or fn.lower().endswith('.c')): + try: + os.unlink(os.path.join(tmpdir, fn)) + except OSError: + pass + clean_dir = [os.path.join(tmpdir, 'build')] + for dir in clean_dir: + try: + for fn in os.listdir(dir): + fn = os.path.join(dir, fn) + if os.path.isdir(fn): + clean_dir.append(fn) + else: + os.unlink(fn) + except OSError: + pass + +def _get_so_suffixes(): + suffixes = _extension_suffixes() + if not suffixes: + # bah, no C_EXTENSION available. Occurs on pypy without cpyext + if sys.platform == 'win32': + suffixes = [".pyd"] + else: + suffixes = [".so"] + + return suffixes + +def _ensure_dir(filename): + dirname = os.path.dirname(filename) + if dirname and not os.path.isdir(dirname): + os.makedirs(dirname) diff --git a/venv/lib/python3.7/site-packages/channels-2.3.1.dist-info/RECORD b/venv/lib/python3.7/site-packages/channels-2.3.1.dist-info/RECORD new file mode 100644 index 0000000..b68ec96 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels-2.3.1.dist-info/RECORD @@ -0,0 +1,64 @@ +channels/__init__.py,sha256=g1v_9G0wEY66XuTmoRIN7zLl9mSxiXwD_bW-JMtXPcA,109 +channels/apps.py,sha256=Y_JZ0GiWrr6GSkinzRMIyqkYlHR0Dr8f93B25_EJqFE,501 +channels/auth.py,sha256=zUL2LFBIP8ZPXa0nDfIuanCpbXa0vPogBxzp2ol7sqU,6090 +channels/consumer.py,sha256=Yg9QmzQy12oOHICH34zb8M65o41Uc03qxVOTl0RkTSk,3679 +channels/db.py,sha256=hfXljAYAMaRPM_pXyEOzAebnkFfv2LVDG9R61LPGNwA,563 +channels/exceptions.py,sha256=-AJy2YuE4geaucjGDo59ZA78a-m5ZMJNOUS_QVzSASo,1119 +channels/hacks.py,sha256=is-0JEUYllpMt7gG_Tzxc1-bcAi5XHseUajFtKzO7UE,467 +channels/http.py,sha256=YVu7L9ne_DAx4JnYSj6szLk5jBBU5qLlnu3_9HlR8g0,14442 +channels/layers.py,sha256=YoZe4ddMMpwsHEjzPFBTAL1dONBcuVgt-SV13hNZxhI,12150 +channels/middleware.py,sha256=W_8pU8nNuSB6zp3zzPWa27h0ZAu3aVlnDQnJ7L85lT0,1380 +channels/routing.py,sha256=mCiPXw1TKcRiZciVEliBJgJyEfqQp0zRH4gNbktOFic,6414 +channels/sessions.py,sha256=J7rxL7oaCk5c0jEbeC_aWvxDb_eQP2M_SFQUBvQ7dAI,9742 +channels/signals.py,sha256=wj1M2JVhW5rKhKfJf2LK2fxIl9sGWYtQC9oPJ5-OSTE,270 +channels/staticfiles.py,sha256=3SsXAMWhSm4FqapLduE0sPvkzYiDZ3AaKv-rJ3dfVgg,2311 +channels/utils.py,sha256=_bT5fyzEMNMW080FjgUA9t-EkQUlg174kCo88JiTvAE,2176 +channels/worker.py,sha256=6z_R8hUqlD9bz2vNHi1NCgZyxLMNzU_0t6tF-APk7yI,1687 +channels/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +channels/generic/http.py,sha256=Mkyh_sa-Qi-1jmNXsVF3OjORfbROsskqSjyJConFe3I,3131 +channels/generic/websocket.py,sha256=l9q-JWna1GSEvG5NyX_myScAPAlB0El3JrjxNIl1KD8,8647 +channels/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +channels/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +channels/management/commands/runserver.py,sha256=m1YySjmC_lYgs2VBhrsLKdd8NwvM_ARD7ZZLjwMmlDo,7037 +channels/management/commands/runworker.py,sha256=jxrR0_x0mdG7rlRV4cNtuWB6ZylzSeBkyiEGZt72lV4,1594 +channels/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +channels/security/websocket.py,sha256=27byUdUY0-jjoMTjideyuL8XMLKe-TAayrKGjwquyt8,5764 +channels/testing/__init__.py,sha256=4Gv--eDMF5__J4ESnf4JLPxeYn_1I9tPV1x0GJUL_98,343 +channels/testing/http.py,sha256=9XR-hXcWvx_BmXFwetEp7jez9yf7daS1LbWWtSP_r5s,2043 +channels/testing/live.py,sha256=dE2EoOFhpMljLElUQ894IYAbjNlKGGP1NQCayoUinNc,2316 +channels/testing/websocket.py,sha256=d6YAJhLCwEL6n-u_LEEFzwjZl_xA5PaQd8G0tydCTfk,3901 +channels-2.3.1.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552 +channels-2.3.1.dist-info/METADATA,sha256=xJJcWC8kMPST08-gXmIgbfiD2a6XrtecOWuWQ6gZMaM,1374 +channels-2.3.1.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +channels-2.3.1.dist-info/top_level.txt,sha256=5-YaD2ZIFwhfgn0xikDTCwaofGY9Tg_HVyZkw2ocUnA,9 +channels-2.3.1.dist-info/RECORD,, +channels-2.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +channels/security/__pycache__/websocket.cpython-37.pyc,, +channels/security/__pycache__/__init__.cpython-37.pyc,, +channels/management/__pycache__/__init__.cpython-37.pyc,, +channels/management/commands/__pycache__/runworker.cpython-37.pyc,, +channels/management/commands/__pycache__/runserver.cpython-37.pyc,, +channels/management/commands/__pycache__/__init__.cpython-37.pyc,, +channels/__pycache__/exceptions.cpython-37.pyc,, +channels/__pycache__/sessions.cpython-37.pyc,, +channels/__pycache__/signals.cpython-37.pyc,, +channels/__pycache__/staticfiles.cpython-37.pyc,, +channels/__pycache__/db.cpython-37.pyc,, +channels/__pycache__/middleware.cpython-37.pyc,, +channels/__pycache__/auth.cpython-37.pyc,, +channels/__pycache__/apps.cpython-37.pyc,, +channels/__pycache__/routing.cpython-37.pyc,, +channels/__pycache__/consumer.cpython-37.pyc,, +channels/__pycache__/layers.cpython-37.pyc,, +channels/__pycache__/utils.cpython-37.pyc,, +channels/__pycache__/http.cpython-37.pyc,, +channels/__pycache__/worker.cpython-37.pyc,, +channels/__pycache__/__init__.cpython-37.pyc,, +channels/__pycache__/hacks.cpython-37.pyc,, +channels/testing/__pycache__/live.cpython-37.pyc,, +channels/testing/__pycache__/websocket.cpython-37.pyc,, +channels/testing/__pycache__/http.cpython-37.pyc,, +channels/testing/__pycache__/__init__.cpython-37.pyc,, +channels/generic/__pycache__/websocket.cpython-37.pyc,, +channels/generic/__pycache__/http.cpython-37.pyc,, +channels/generic/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/channels/auth.py b/venv/lib/python3.7/site-packages/channels/auth.py new file mode 100644 index 0000000..041316a --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/auth.py @@ -0,0 +1,172 @@ +from django.conf import settings +from django.contrib.auth import ( + BACKEND_SESSION_KEY, + HASH_SESSION_KEY, + SESSION_KEY, + _get_backends, + get_user_model, + load_backend, + user_logged_in, + user_logged_out, +) +from django.contrib.auth.models import AnonymousUser +from django.utils.crypto import constant_time_compare +from django.utils.functional import LazyObject +from django.utils.translation import LANGUAGE_SESSION_KEY + +from channels.db import database_sync_to_async +from channels.middleware import BaseMiddleware +from channels.sessions import CookieMiddleware, SessionMiddleware + + +@database_sync_to_async +def get_user(scope): + """ + Return the user model instance associated with the given scope. + If no user is retrieved, return an instance of `AnonymousUser`. + """ + if "session" not in scope: + raise ValueError( + "Cannot find session in scope. You should wrap your consumer in SessionMiddleware." + ) + session = scope["session"] + user = None + try: + user_id = _get_user_session_key(session) + backend_path = session[BACKEND_SESSION_KEY] + except KeyError: + pass + else: + if backend_path in settings.AUTHENTICATION_BACKENDS: + backend = load_backend(backend_path) + user = backend.get_user(user_id) + # Verify the session + if hasattr(user, "get_session_auth_hash"): + session_hash = session.get(HASH_SESSION_KEY) + session_hash_verified = session_hash and constant_time_compare( + session_hash, user.get_session_auth_hash() + ) + if not session_hash_verified: + session.flush() + user = None + return user or AnonymousUser() + + +@database_sync_to_async +def login(scope, user, backend=None): + """ + Persist a user id and a backend in the request. + This way a user doesn't have to re-authenticate on every request. + Note that data set during the anonymous session is retained when the user logs in. + """ + if "session" not in scope: + raise ValueError( + "Cannot find session in scope. You should wrap your consumer in SessionMiddleware." + ) + session = scope["session"] + session_auth_hash = "" + if user is None: + user = scope.get("user", None) + if user is None: + raise ValueError( + "User must be passed as an argument or must be present in the scope." + ) + if hasattr(user, "get_session_auth_hash"): + session_auth_hash = user.get_session_auth_hash() + if SESSION_KEY in session: + if _get_user_session_key(session) != user.pk or ( + session_auth_hash + and not constant_time_compare( + session.get(HASH_SESSION_KEY, ""), session_auth_hash + ) + ): + # To avoid reusing another user's session, create a new, empty + # session if the existing session corresponds to a different + # authenticated user. + session.flush() + else: + session.cycle_key() + try: + backend = backend or user.backend + except AttributeError: + backends = _get_backends(return_tuples=True) + if len(backends) == 1: + _, backend = backends[0] + else: + raise ValueError( + "You have multiple authentication backends configured and therefore must provide the `backend` " + "argument or set the `backend` attribute on the user." + ) + session[SESSION_KEY] = user._meta.pk.value_to_string(user) + session[BACKEND_SESSION_KEY] = backend + session[HASH_SESSION_KEY] = session_auth_hash + scope["user"] = user + # note this does not reset the CSRF_COOKIE/Token + user_logged_in.send(sender=user.__class__, request=None, user=user) + + +@database_sync_to_async +def logout(scope): + """ + Remove the authenticated user's ID from the request and flush their session data. + """ + if "session" not in scope: + raise ValueError( + "Login cannot find session in scope. You should wrap your consumer in SessionMiddleware." + ) + session = scope["session"] + # Dispatch the signal before the user is logged out so the receivers have a + # chance to find out *who* logged out. + user = scope.get("user", None) + if hasattr(user, "is_authenticated") and not user.is_authenticated: + user = None + if user is not None: + user_logged_out.send(sender=user.__class__, request=None, user=user) + # remember language choice saved to session + language = session.get(LANGUAGE_SESSION_KEY) + session.flush() + if language is not None: + session[LANGUAGE_SESSION_KEY] = language + if "user" in scope: + scope["user"] = AnonymousUser() + + +def _get_user_session_key(session): + # This value in the session is always serialized to a string, so we need + # to convert it back to Python whenever we access it. + return get_user_model()._meta.pk.to_python(session[SESSION_KEY]) + + +class UserLazyObject(LazyObject): + """ + Throw a more useful error message when scope['user'] is accessed before it's resolved + """ + + def _setup(self): + raise ValueError("Accessing scope user before it is ready.") + + +class AuthMiddleware(BaseMiddleware): + """ + Middleware which populates scope["user"] from a Django session. + Requires SessionMiddleware to function. + """ + + def populate_scope(self, scope): + # Make sure we have a session + if "session" not in scope: + raise ValueError( + "AuthMiddleware cannot find session in scope. SessionMiddleware must be above it." + ) + # Add it to the scope if it's not there already + if "user" not in scope: + scope["user"] = UserLazyObject() + + async def resolve_scope(self, scope): + scope["user"]._wrapped = await get_user(scope) + + +# Handy shortcut for applying all three layers at once +AuthMiddlewareStack = lambda inner: CookieMiddleware( + SessionMiddleware(AuthMiddleware(inner)) +) diff --git a/venv/lib/python3.7/site-packages/channels/consumer.py b/venv/lib/python3.7/site-packages/channels/consumer.py new file mode 100644 index 0000000..704c038 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/consumer.py @@ -0,0 +1,113 @@ +import functools + +from asgiref.sync import async_to_sync + +from . import DEFAULT_CHANNEL_LAYER +from .db import database_sync_to_async +from .exceptions import StopConsumer +from .layers import get_channel_layer +from .utils import await_many_dispatch + + +def get_handler_name(message): + """ + Looks at a message, checks it has a sensible type, and returns the + handler name for that type. + """ + # Check message looks OK + if "type" not in message: + raise ValueError("Incoming message has no 'type' attribute") + if message["type"].startswith("_"): + raise ValueError("Malformed type in message (leading underscore)") + # Extract type and replace . with _ + return message["type"].replace(".", "_") + + +class AsyncConsumer: + """ + Base consumer class. Implements the ASGI application spec, and adds on + channel layer management and routing of events to named methods based + on their type. + """ + + _sync = False + channel_layer_alias = DEFAULT_CHANNEL_LAYER + + def __init__(self, scope): + self.scope = scope + + async def __call__(self, receive, send): + """ + Dispatches incoming messages to type-based handlers asynchronously. + """ + # Initialize channel layer + self.channel_layer = get_channel_layer(self.channel_layer_alias) + if self.channel_layer is not None: + self.channel_name = await self.channel_layer.new_channel() + self.channel_receive = functools.partial( + self.channel_layer.receive, self.channel_name + ) + # Store send function + if self._sync: + self.base_send = async_to_sync(send) + else: + self.base_send = send + # Pass messages in from channel layer or client to dispatch method + try: + if self.channel_layer is not None: + await await_many_dispatch( + [receive, self.channel_receive], self.dispatch + ) + else: + await await_many_dispatch([receive], self.dispatch) + except StopConsumer: + # Exit cleanly + pass + + async def dispatch(self, message): + """ + Works out what to do with a message. + """ + handler = getattr(self, get_handler_name(message), None) + if handler: + await handler(message) + else: + raise ValueError("No handler for message type %s" % message["type"]) + + async def send(self, message): + """ + Overrideable/callable-by-subclasses send method. + """ + await self.base_send(message) + + +class SyncConsumer(AsyncConsumer): + """ + Synchronous version of the consumer, which is what we write most of the + generic consumers against (for now). Calls handlers in a threadpool and + uses CallBouncer to get the send method out to the main event loop. + + It would have been possible to have "mixed" consumers and auto-detect + if a handler was awaitable or not, but that would have made the API + for user-called methods very confusing as there'd be two types of each. + """ + + _sync = True + + @database_sync_to_async + def dispatch(self, message): + """ + Dispatches incoming messages to type-based handlers asynchronously. + """ + # Get and execute the handler + handler = getattr(self, get_handler_name(message), None) + if handler: + handler(message) + else: + raise ValueError("No handler for message type %s" % message["type"]) + + def send(self, message): + """ + Overrideable/callable-by-subclasses send method. + """ + self.base_send(message) diff --git a/venv/lib/python3.7/site-packages/channels/hacks.py b/venv/lib/python3.7/site-packages/channels/hacks.py new file mode 100644 index 0000000..ef9ee06 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/hacks.py @@ -0,0 +1,12 @@ +def monkeypatch_django(): + """ + Monkeypatches support for us into parts of Django. + """ + # Ensure that the staticfiles version of runserver bows down to us + # This one is particularly horrible + from django.contrib.staticfiles.management.commands.runserver import ( + Command as StaticRunserverCommand, + ) + from .management.commands.runserver import Command as RunserverCommand + + StaticRunserverCommand.__bases__ = (RunserverCommand,) diff --git a/venv/lib/python3.7/site-packages/channels/http.py b/venv/lib/python3.7/site-packages/channels/http.py new file mode 100644 index 0000000..5ea1ead --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/http.py @@ -0,0 +1,371 @@ +import cgi +import codecs +import logging +import sys +import tempfile +import traceback + +from django import http +from django.conf import settings +from django.core import signals +from django.core.exceptions import RequestDataTooBig +from django.core.handlers import base +from django.http import FileResponse, HttpResponse, HttpResponseServerError +from django.urls import set_script_prefix +from django.utils.functional import cached_property + +from asgiref.sync import async_to_sync, sync_to_async +from channels.exceptions import RequestAborted, RequestTimeout + +logger = logging.getLogger("django.request") + + +class AsgiRequest(http.HttpRequest): + """ + Custom request subclass that decodes from an ASGI-standard request + dict, and wraps request body handling. + """ + + # Number of seconds until a Request gives up on trying to read a request + # body and aborts. + body_receive_timeout = 60 + + def __init__(self, scope, stream): + self.scope = scope + self._content_length = 0 + self._post_parse_error = False + self._read_started = False + self.resolver_match = None + self.script_name = self.scope.get("root_path", "") + if self.script_name and scope["path"].startswith(self.script_name): + # TODO: Better is-prefix checking, slash handling? + self.path_info = scope["path"][len(self.script_name) :] + else: + self.path_info = scope["path"] + + # django path is different from asgi scope path args, it should combine with script name + if self.script_name: + self.path = "%s/%s" % ( + self.script_name.rstrip("/"), + self.path_info.replace("/", "", 1), + ) + else: + self.path = scope["path"] + + # HTTP basics + self.method = self.scope["method"].upper() + # fix https://github.com/django/channels/issues/622 + query_string = self.scope.get("query_string", "") + if isinstance(query_string, bytes): + query_string = query_string.decode("utf-8") + self.META = { + "REQUEST_METHOD": self.method, + "QUERY_STRING": query_string, + "SCRIPT_NAME": self.script_name, + "PATH_INFO": self.path_info, + # Old code will need these for a while + "wsgi.multithread": True, + "wsgi.multiprocess": True, + } + if self.scope.get("client", None): + self.META["REMOTE_ADDR"] = self.scope["client"][0] + self.META["REMOTE_HOST"] = self.META["REMOTE_ADDR"] + self.META["REMOTE_PORT"] = self.scope["client"][1] + if self.scope.get("server", None): + self.META["SERVER_NAME"] = self.scope["server"][0] + self.META["SERVER_PORT"] = str(self.scope["server"][1]) + else: + self.META["SERVER_NAME"] = "unknown" + self.META["SERVER_PORT"] = "0" + # Handle old style-headers for a transition period + if "headers" in self.scope and isinstance(self.scope["headers"], dict): + self.scope["headers"] = [ + (x.encode("latin1"), y) for x, y in self.scope["headers"].items() + ] + # Headers go into META + for name, value in self.scope.get("headers", []): + name = name.decode("latin1") + if name == "content-length": + corrected_name = "CONTENT_LENGTH" + elif name == "content-type": + corrected_name = "CONTENT_TYPE" + else: + corrected_name = "HTTP_%s" % name.upper().replace("-", "_") + # HTTPbis say only ASCII chars are allowed in headers, but we latin1 just in case + value = value.decode("latin1") + if corrected_name in self.META: + value = self.META[corrected_name] + "," + value + self.META[corrected_name] = value + # Pull out request encoding if we find it + if "CONTENT_TYPE" in self.META: + self.content_type, self.content_params = cgi.parse_header( + self.META["CONTENT_TYPE"] + ) + if "charset" in self.content_params: + try: + codecs.lookup(self.content_params["charset"]) + except LookupError: + pass + else: + self.encoding = self.content_params["charset"] + else: + self.content_type, self.content_params = "", {} + # Pull out content length info + if self.META.get("CONTENT_LENGTH", None): + try: + self._content_length = int(self.META["CONTENT_LENGTH"]) + except (ValueError, TypeError): + pass + # Body handling + self._stream = stream + # Other bits + self.resolver_match = None + + @cached_property + def GET(self): + return http.QueryDict(self.scope.get("query_string", "")) + + def _get_scheme(self): + return self.scope.get("scheme", "http") + + def _get_post(self): + if not hasattr(self, "_post"): + self._load_post_and_files() + return self._post + + def _set_post(self, post): + self._post = post + + def _get_files(self): + if not hasattr(self, "_files"): + self._load_post_and_files() + return self._files + + POST = property(_get_post, _set_post) + FILES = property(_get_files) + + @cached_property + def COOKIES(self): + return http.parse_cookie(self.META.get("HTTP_COOKIE", "")) + + +class AsgiHandler(base.BaseHandler): + """ + Handler for ASGI requests for the view system only (it will have got here + after traversing the dispatch-by-channel-name system, which decides it's + a HTTP request) + + You can also manually construct it with a get_response callback if you + want to run a single Django view yourself. If you do this, though, it will + not do any URL routing or middleware (Channels uses it for staticfiles' + serving code) + """ + + request_class = AsgiRequest + + # Size to chunk response bodies into for multiple response messages + chunk_size = 512 * 1024 + + def __init__(self, scope): + if scope["type"] != "http": + raise ValueError( + "The AsgiHandler can only handle HTTP connections, not %s" + % scope["type"] + ) + super(AsgiHandler, self).__init__() + self.scope = scope + self.load_middleware() + + async def __call__(self, receive, send): + """ + Async entrypoint - uses the sync_to_async wrapper to run things in a + threadpool. + """ + self.send = async_to_sync(send) + + # Receive the HTTP request body as a stream object. + try: + body_stream = await self.read_body(receive) + except RequestAborted: + return + # Launch into body handling (and a synchronous subthread). + await self.handle(body_stream) + + async def read_body(self, receive): + """Reads a HTTP body from an ASGI connection.""" + # Use the tempfile that auto rolls-over to a disk file as it fills up. + body_file = tempfile.SpooledTemporaryFile( + max_size=settings.FILE_UPLOAD_MAX_MEMORY_SIZE, mode="w+b" + ) + while True: + message = await receive() + if message["type"] == "http.disconnect": + # Early client disconnect. + raise RequestAborted() + # Add a body chunk from the message, if provided. + if "body" in message: + body_file.write(message["body"]) + # Quit out if that's the end. + if not message.get("more_body", False): + break + body_file.seek(0) + return body_file + + @sync_to_async + def handle(self, body): + """ + Synchronous message processing. + """ + # Set script prefix from message root_path, turning None into empty string + script_prefix = self.scope.get("root_path", "") or "" + if settings.FORCE_SCRIPT_NAME: + script_prefix = settings.FORCE_SCRIPT_NAME + set_script_prefix(script_prefix) + signals.request_started.send(sender=self.__class__, scope=self.scope) + # Run request through view system + try: + request = self.request_class(self.scope, body) + except UnicodeDecodeError: + logger.warning( + "Bad Request (UnicodeDecodeError)", + exc_info=sys.exc_info(), + extra={"status_code": 400}, + ) + response = http.HttpResponseBadRequest() + except RequestTimeout: + # Parsing the request failed, so the response is a Request Timeout error + response = HttpResponse("408 Request Timeout (upload too slow)", status=408) + except RequestAborted: + # Client closed connection on us mid request. Abort! + return + except RequestDataTooBig: + response = HttpResponse("413 Payload too large", status=413) + else: + response = self.get_response(request) + # Fix chunk size on file responses + if isinstance(response, FileResponse): + response.block_size = 1024 * 512 + # Transform response into messages, which we yield back to caller + for response_message in self.encode_response(response): + self.send(response_message) + # Close the response now we're done with it + response.close() + + def handle_uncaught_exception(self, request, resolver, exc_info): + """ + Last-chance handler for exceptions. + """ + # There's no WSGI server to catch the exception further up if this fails, + # so translate it into a plain text response. + try: + return super(AsgiHandler, self).handle_uncaught_exception( + request, resolver, exc_info + ) + except Exception: + return HttpResponseServerError( + traceback.format_exc() if settings.DEBUG else "Internal Server Error", + content_type="text/plain", + ) + + def load_middleware(self): + """ + Loads the Django middleware chain and caches it on the class. + """ + # Because we create an AsgiHandler on every HTTP request + # we need to preserve the Django middleware chain once we load it. + if ( + hasattr(self.__class__, "_middleware_chain") + and self.__class__._middleware_chain + ): + self._middleware_chain = self.__class__._middleware_chain + self._view_middleware = self.__class__._view_middleware + self._template_response_middleware = ( + self.__class__._template_response_middleware + ) + self._exception_middleware = self.__class__._exception_middleware + + # Support additional arguments for Django 1.11 and 2.0. + if hasattr(self.__class__, "_request_middleware"): + self._request_middleware = self.__class__._request_middleware + self._response_middleware = self.__class__._response_middleware + + else: + super(AsgiHandler, self).load_middleware() + self.__class__._middleware_chain = self._middleware_chain + self.__class__._view_middleware = self._view_middleware + self.__class__._template_response_middleware = ( + self._template_response_middleware + ) + self.__class__._exception_middleware = self._exception_middleware + + # Support additional arguments for Django 1.11 and 2.0. + if hasattr(self, "_request_middleware"): + self.__class__._request_middleware = self._request_middleware + self.__class__._response_middleware = self._response_middleware + + @classmethod + def encode_response(cls, response): + """ + Encodes a Django HTTP response into ASGI http.response message(s). + """ + # Collect cookies into headers. + # Note that we have to preserve header case as there are some non-RFC + # compliant clients that want things like Content-Type correct. Ugh. + response_headers = [] + for header, value in response.items(): + if isinstance(header, str): + header = header.encode("ascii") + if isinstance(value, str): + value = value.encode("latin1") + response_headers.append((bytes(header), bytes(value))) + for c in response.cookies.values(): + response_headers.append( + (b"Set-Cookie", c.output(header="").encode("ascii").strip()) + ) + # Make initial response message + yield { + "type": "http.response.start", + "status": response.status_code, + "headers": response_headers, + } + # Streaming responses need to be pinned to their iterator + if response.streaming: + # Access `__iter__` and not `streaming_content` directly in case + # it has been overridden in a subclass. + for part in response: + for chunk, _ in cls.chunk_bytes(part): + yield { + "type": "http.response.body", + "body": chunk, + # We ignore "more" as there may be more parts; instead, + # we use an empty final closing message with False. + "more_body": True, + } + # Final closing message + yield {"type": "http.response.body"} + # Other responses just need chunking + else: + # Yield chunks of response + for chunk, last in cls.chunk_bytes(response.content): + yield { + "type": "http.response.body", + "body": chunk, + "more_body": not last, + } + + @classmethod + def chunk_bytes(cls, data): + """ + Chunks some data up so it can be sent in reasonable size messages. + Yields (chunk, last_chunk) tuples. + """ + position = 0 + if not data: + yield data, True + return + while position < len(data): + yield ( + data[position : position + cls.chunk_size], + (position + cls.chunk_size) >= len(data), + ) + position += cls.chunk_size diff --git a/venv/lib/python3.7/site-packages/channels/middleware.py b/venv/lib/python3.7/site-packages/channels/middleware.py new file mode 100644 index 0000000..996f7cb --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/middleware.py @@ -0,0 +1,41 @@ +from functools import partial + + +class BaseMiddleware: + """ + Base class for implementing ASGI middleware. Inherit from this and + override the setup() method if you want to do things before you + get to. + + Note that subclasses of this are not self-safe; don't store state on + the instance, as it serves multiple application instances. Instead, use + scope. + """ + + def __init__(self, inner): + """ + Middleware constructor - just takes inner application. + """ + self.inner = inner + + def __call__(self, scope): + """ + ASGI constructor; can insert things into the scope, but not + run asynchronous code. + """ + # Copy scope to stop changes going upstream + scope = dict(scope) + # Allow subclasses to change the scope + self.populate_scope(scope) + # Call the inner application's init + inner_instance = self.inner(scope) + # Partially bind it to our coroutine entrypoint along with the scope + return partial(self.coroutine_call, inner_instance, scope) + + async def coroutine_call(self, inner_instance, scope, receive, send): + """ + ASGI coroutine; where we can resolve items in the scope + (but you can't modify it at the top level here!) + """ + await self.resolve_scope(scope) + await inner_instance(receive, send) diff --git a/venv/lib/python3.7/site-packages/channels/sessions.py b/venv/lib/python3.7/site-packages/channels/sessions.py new file mode 100644 index 0000000..bf52e96 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/sessions.py @@ -0,0 +1,253 @@ +import datetime +import time +from importlib import import_module + +from django.conf import settings +from django.contrib.sessions.backends.base import UpdateError +from django.core.exceptions import SuspiciousOperation +from django.http import parse_cookie +from django.http.cookie import SimpleCookie +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.functional import LazyObject + +from channels.db import database_sync_to_async + +try: + from django.utils.http import http_date +except ImportError: + from django.utils.http import cookie_date as http_date + + +class CookieMiddleware: + """ + Extracts cookies from HTTP or WebSocket-style scopes and adds them as a + scope["cookies"] entry with the same format as Django's request.COOKIES. + """ + + def __init__(self, inner): + self.inner = inner + + def __call__(self, scope): + # Check this actually has headers. They're a required scope key for HTTP and WS. + if "headers" not in scope: + raise ValueError( + "CookieMiddleware was passed a scope that did not have a headers key " + + "(make sure it is only passed HTTP or WebSocket connections)" + ) + # Go through headers to find the cookie one + for name, value in scope.get("headers", []): + if name == b"cookie": + cookies = parse_cookie(value.decode("ascii")) + break + else: + # No cookie header found - add an empty default. + cookies = {} + # Return inner application + return self.inner(dict(scope, cookies=cookies)) + + @classmethod + def set_cookie( + cls, + message, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + ): + """ + Sets a cookie in the passed HTTP response message. + + ``expires`` can be: + - a string in the correct format, + - a naive ``datetime.datetime`` object in UTC, + - an aware ``datetime.datetime`` object in any time zone. + If it is a ``datetime.datetime`` object then ``max_age`` will be calculated. + """ + value = force_str(value) + cookies = SimpleCookie() + cookies[key] = value + if expires is not None: + if isinstance(expires, datetime.datetime): + if timezone.is_aware(expires): + expires = timezone.make_naive(expires, timezone.utc) + delta = expires - expires.utcnow() + # Add one second so the date matches exactly (a fraction of + # time gets lost between converting to a timedelta and + # then the date string). + delta = delta + datetime.timedelta(seconds=1) + # Just set max_age - the max_age logic will set expires. + expires = None + max_age = max(0, delta.days * 86400 + delta.seconds) + else: + cookies[key]["expires"] = expires + else: + cookies[key]["expires"] = "" + if max_age is not None: + cookies[key]["max-age"] = max_age + # IE requires expires, so set it if hasn't been already. + if not expires: + cookies[key]["expires"] = http_date(time.time() + max_age) + if path is not None: + cookies[key]["path"] = path + if domain is not None: + cookies[key]["domain"] = domain + if secure: + cookies[key]["secure"] = True + if httponly: + cookies[key]["httponly"] = True + # Write out the cookies to the response + for c in cookies.values(): + message.setdefault("headers", []).append( + (b"Set-Cookie", bytes(c.output(header=""), encoding="utf-8")) + ) + + @classmethod + def delete_cookie(cls, message, key, path="/", domain=None): + """ + Deletes a cookie in a response. + """ + return cls.set_cookie( + message, + key, + max_age=0, + path=path, + domain=domain, + expires="Thu, 01-Jan-1970 00:00:00 GMT", + ) + + +class SessionMiddleware: + """ + Class that adds Django sessions (from HTTP cookies) to the + scope. Works with HTTP or WebSocket protocol types (or anything that + provides a "headers" entry in the scope). + + Requires the CookieMiddleware to be higher up in the stack. + """ + + # Message types that trigger a session save if it's modified + save_message_types = ["http.response.start"] + + # Message types that can carry session cookies back + cookie_response_message_types = ["http.response.start"] + + def __init__(self, inner): + self.inner = inner + self.cookie_name = settings.SESSION_COOKIE_NAME + self.session_store = import_module(settings.SESSION_ENGINE).SessionStore + + def __call__(self, scope): + return SessionMiddlewareInstance(scope, self) + + +class SessionMiddlewareInstance: + """ + Inner class that is instantiated once per scope. + """ + + def __init__(self, scope, middleware): + self.middleware = middleware + self.scope = dict(scope) + if "session" in self.scope: + # There's already session middleware of some kind above us, pass that through + self.activated = False + else: + # Make sure there are cookies in the scope + if "cookies" not in self.scope: + raise ValueError( + "No cookies in scope - SessionMiddleware needs to run inside of CookieMiddleware." + ) + # Parse the headers in the scope into cookies + self.scope["session"] = LazyObject() + self.activated = True + # Instantiate our inner application + self.inner = self.middleware.inner(self.scope) + + async def __call__(self, receive, send): + """ + We intercept the send() callable so we can do session saves and + add session cookie overrides to send back. + """ + # Resolve the session now we can do it in a blocking way + session_key = self.scope["cookies"].get(self.middleware.cookie_name) + self.scope["session"]._wrapped = await database_sync_to_async( + self.middleware.session_store + )(session_key) + # Override send + self.real_send = send + return await self.inner(receive, self.send) + + async def send(self, message): + """ + Overridden send that also does session saves/cookies. + """ + # Only save session if we're the outermost session middleware + if self.activated: + modified = self.scope["session"].modified + empty = self.scope["session"].is_empty() + # If this is a message type that we want to save on, and there's + # changed data, save it. We also save if it's empty as we might + # not be able to send a cookie-delete along with this message. + if ( + message["type"] in self.middleware.save_message_types + and message.get("status", 200) != 500 + and (modified or settings.SESSION_SAVE_EVERY_REQUEST) + ): + self.save_session() + # If this is a message type that can transport cookies back to the + # client, then do so. + if message["type"] in self.middleware.cookie_response_message_types: + if empty: + # Delete cookie if it's set + if settings.SESSION_COOKIE_NAME in self.scope["cookies"]: + CookieMiddleware.delete_cookie( + message, + settings.SESSION_COOKIE_NAME, + path=settings.SESSION_COOKIE_PATH, + domain=settings.SESSION_COOKIE_DOMAIN, + ) + else: + # Get the expiry data + if self.scope["session"].get_expire_at_browser_close(): + max_age = None + expires = None + else: + max_age = self.scope["session"].get_expiry_age() + expires_time = time.time() + max_age + expires = http_date(expires_time) + # Set the cookie + CookieMiddleware.set_cookie( + message, + self.middleware.cookie_name, + self.scope["session"].session_key, + max_age=max_age, + expires=expires, + domain=settings.SESSION_COOKIE_DOMAIN, + path=settings.SESSION_COOKIE_PATH, + secure=settings.SESSION_COOKIE_SECURE or None, + httponly=settings.SESSION_COOKIE_HTTPONLY or None, + ) + # Pass up the send + return await self.real_send(message) + + def save_session(self): + """ + Saves the current session. + """ + try: + self.scope["session"].save() + except UpdateError: + raise SuspiciousOperation( + "The request's session was deleted before the " + "request completed. The user may have logged " + "out in a concurrent request, for example." + ) + + +# Shortcut to include cookie middleware +SessionMiddlewareStack = lambda inner: CookieMiddleware(SessionMiddleware(inner)) diff --git a/venv/lib/python3.7/site-packages/channels/testing/http.py b/venv/lib/python3.7/site-packages/channels/testing/http.py new file mode 100644 index 0000000..6b1514c --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/testing/http.py @@ -0,0 +1,56 @@ +from urllib.parse import unquote, urlparse + +from asgiref.testing import ApplicationCommunicator + + +class HttpCommunicator(ApplicationCommunicator): + """ + ApplicationCommunicator subclass that has HTTP shortcut methods. + + It will construct the scope for you, so you need to pass the application + (uninstantiated) along with HTTP parameters. + + This does not support full chunking - for that, just use ApplicationCommunicator + directly. + """ + + def __init__(self, application, method, path, body=b"", headers=None): + parsed = urlparse(path) + self.scope = { + "type": "http", + "http_version": "1.1", + "method": method.upper(), + "path": unquote(parsed.path), + "query_string": parsed.query.encode("utf-8"), + "headers": headers or [], + } + assert isinstance(body, bytes) + self.body = body + self.sent_request = False + super().__init__(application, self.scope) + + async def get_response(self, timeout=1): + """ + Get the application's response. Returns a dict with keys of + "body", "headers" and "status". + """ + # If we've not sent the request yet, do so + if not self.sent_request: + self.sent_request = True + await self.send_input({"type": "http.request", "body": self.body}) + # Get the response start + response_start = await self.receive_output(timeout) + assert response_start["type"] == "http.response.start" + # Get all body parts + response_start["body"] = b"" + while True: + chunk = await self.receive_output(timeout) + assert chunk["type"] == "http.response.body" + assert isinstance(chunk["body"], bytes) + response_start["body"] += chunk["body"] + if not chunk.get("more_body", False): + break + # Return structured info + del response_start["type"] + response_start.setdefault("headers", []) + return response_start diff --git a/venv/lib/python3.7/site-packages/channels/testing/live.py b/venv/lib/python3.7/site-packages/channels/testing/live.py new file mode 100644 index 0000000..42d9a46 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/testing/live.py @@ -0,0 +1,67 @@ +from django.core.exceptions import ImproperlyConfigured +from django.db import connections +from django.test.testcases import TransactionTestCase +from django.test.utils import modify_settings + +from channels.routing import get_default_application +from channels.staticfiles import StaticFilesWrapper +from daphne.testing import DaphneProcess + + +class ChannelsLiveServerTestCase(TransactionTestCase): + """ + Does basically the same as TransactionTestCase but also launches a + live Daphne server in a separate process, so + that the tests may use another test framework, such as Selenium, + instead of the built-in dummy client. + """ + + host = "localhost" + ProtocolServerProcess = DaphneProcess + static_wrapper = StaticFilesWrapper + serve_static = True + + @property + def live_server_url(self): + return "http://%s:%s" % (self.host, self._port) + + @property + def live_server_ws_url(self): + return "ws://%s:%s" % (self.host, self._port) + + def _pre_setup(self): + for connection in connections.all(): + if self._is_in_memory_db(connection): + raise ImproperlyConfigured( + "ChannelLiveServerTestCase can not be used with in memory databases" + ) + + super(ChannelsLiveServerTestCase, self)._pre_setup() + + self._live_server_modified_settings = modify_settings( + ALLOWED_HOSTS={"append": self.host} + ) + self._live_server_modified_settings.enable() + + if self.serve_static: + application = self.static_wrapper(get_default_application()) + else: + application = get_default_application() + + self._server_process = self.ProtocolServerProcess(self.host, application) + self._server_process.start() + self._server_process.ready.wait() + self._port = self._server_process.port.value + + def _post_teardown(self): + self._server_process.terminate() + self._server_process.join() + self._live_server_modified_settings.disable() + super(ChannelsLiveServerTestCase, self)._post_teardown() + + def _is_in_memory_db(self, connection): + """ + Check if DatabaseWrapper holds in memory database. + """ + if connection.vendor == "sqlite": + return connection.is_in_memory_db() diff --git a/venv/lib/python3.7/site-packages/channels/testing/websocket.py b/venv/lib/python3.7/site-packages/channels/testing/websocket.py new file mode 100644 index 0000000..e176321 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/testing/websocket.py @@ -0,0 +1,102 @@ +import json +from urllib.parse import unquote, urlparse + +from asgiref.testing import ApplicationCommunicator + + +class WebsocketCommunicator(ApplicationCommunicator): + """ + ApplicationCommunicator subclass that has WebSocket shortcut methods. + + It will construct the scope for you, so you need to pass the application + (uninstantiated) along with the initial connection parameters. + """ + + def __init__(self, application, path, headers=None, subprotocols=None): + if not isinstance(path, str): + raise TypeError("Expected str, got {}".format(type(path))) + parsed = urlparse(path) + self.scope = { + "type": "websocket", + "path": unquote(parsed.path), + "query_string": parsed.query.encode("utf-8"), + "headers": headers or [], + "subprotocols": subprotocols or [], + } + super().__init__(application, self.scope) + + async def connect(self, timeout=1): + """ + Trigger the connection code. + + On an accepted connection, returns (True, ) + On a rejected connection, returns (False, ) + """ + await self.send_input({"type": "websocket.connect"}) + response = await self.receive_output(timeout) + if response["type"] == "websocket.close": + return (False, response.get("code", 1000)) + else: + return (True, response.get("subprotocol", None)) + + async def send_to(self, text_data=None, bytes_data=None): + """ + Sends a WebSocket frame to the application. + """ + # Make sure we have exactly one of the arguments + assert bool(text_data) != bool( + bytes_data + ), "You must supply exactly one of text_data or bytes_data" + # Send the right kind of event + if text_data: + assert isinstance(text_data, str), "The text_data argument must be a str" + await self.send_input({"type": "websocket.receive", "text": text_data}) + else: + assert isinstance( + bytes_data, bytes + ), "The bytes_data argument must be bytes" + await self.send_input({"type": "websocket.receive", "bytes": bytes_data}) + + async def send_json_to(self, data): + """ + Sends JSON data as a text frame + """ + await self.send_to(text_data=json.dumps(data)) + + async def receive_from(self, timeout=1): + """ + Receives a data frame from the view. Will fail if the connection + closes instead. Returns either a bytestring or a unicode string + depending on what sort of frame you got. + """ + response = await self.receive_output(timeout) + # Make sure this is a send message + assert response["type"] == "websocket.send" + # Make sure there's exactly one key in the response + assert ("text" in response) != ( + "bytes" in response + ), "The response needs exactly one of 'text' or 'bytes'" + # Pull out the right key and typecheck it for our users + if "text" in response: + assert isinstance(response["text"], str), "Text frame payload is not str" + return response["text"] + else: + assert isinstance( + response["bytes"], bytes + ), "Binary frame payload is not bytes" + return response["bytes"] + + async def receive_json_from(self, timeout=1): + """ + Receives a JSON text frame payload and decodes it + """ + payload = await self.receive_from(timeout) + assert isinstance(payload, str), "JSON data is not a text frame" + return json.loads(payload) + + async def disconnect(self, code=1000, timeout=1): + """ + Closes the socket + """ + await self.send_input({"type": "websocket.disconnect", "code": code}) + await self.wait(timeout) diff --git a/venv/lib/python3.7/site-packages/channels/worker.py b/venv/lib/python3.7/site-packages/channels/worker.py new file mode 100644 index 0000000..7ea23a7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/channels/worker.py @@ -0,0 +1,44 @@ +import asyncio + +from asgiref.server import StatelessServer + + +class Worker(StatelessServer): + """ + ASGI protocol server that surfaces events sent to specific channels + on the channel layer into a single application instance. + """ + + def __init__(self, application, channels, channel_layer, max_applications=1000): + super().__init__(application, max_applications) + self.channels = channels + self.channel_layer = channel_layer + if self.channel_layer is None: + raise ValueError("Channel layer is not valid") + + async def handle(self): + """ + Listens on all the provided channels and handles the messages. + """ + # For each channel, launch its own listening coroutine + listeners = [] + for channel in self.channels: + listeners.append(asyncio.ensure_future(self.listener(channel))) + # Wait for them all to exit + await asyncio.wait(listeners) + # See if any of the listeners had an error (e.g. channel layer error) + [listener.result() for listener in listeners] + + async def listener(self, channel): + """ + Single-channel listener + """ + while True: + message = await self.channel_layer.receive(channel) + if not message.get("type", None): + raise ValueError("Worker received message with no type.") + # Make a scope and get an application instance for it + scope = {"type": "channel", "channel": channel} + instance_queue = self.get_or_create_application_instance(channel, scope) + # Run the message into the app + await instance_queue.put(message) diff --git a/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/metadata.json b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/metadata.json new file mode 100644 index 0000000..8cdf025 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet-3.0.4.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Linguistic"], "extensions": {"python.commands": {"wrap_console": {"chardetect": "chardet.cli.chardetect:main"}}, "python.details": {"contacts": [{"email": "dan.blanchard@gmail.com", "name": "Daniel Blanchard", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/chardet/chardet"}}, "python.exports": {"console_scripts": {"chardetect": "chardet.cli.chardetect:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["encoding", "i18n", "xml"], "license": "LGPL", "metadata_version": "2.0", "name": "chardet", "summary": "Universal encoding detector for Python 2 and 3", "test_requires": [{"requires": ["hypothesis", "pytest"]}], "version": "3.0.4"} \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/chardet/big5freq.py b/venv/lib/python3.7/site-packages/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/venv/lib/python3.7/site-packages/chardet/cli/__init__.py b/venv/lib/python3.7/site-packages/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/chardet/codingstatemachine.py b/venv/lib/python3.7/site-packages/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/venv/lib/python3.7/site-packages/chardet/escprober.py b/venv/lib/python3.7/site-packages/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/venv/lib/python3.7/site-packages/chardet/escsm.py b/venv/lib/python3.7/site-packages/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/venv/lib/python3.7/site-packages/chardet/euckrfreq.py b/venv/lib/python3.7/site-packages/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/venv/lib/python3.7/site-packages/chardet/euctwprober.py b/venv/lib/python3.7/site-packages/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/venv/lib/python3.7/site-packages/chardet/jisfreq.py b/venv/lib/python3.7/site-packages/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/venv/lib/python3.7/site-packages/chardet/jpcntx.py b/venv/lib/python3.7/site-packages/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/METADATA new file mode 100644 index 0000000..dd2e58d --- /dev/null +++ b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/METADATA @@ -0,0 +1,39 @@ +Metadata-Version: 2.0 +Name: constantly +Version: 15.1.0 +Summary: Symbolic constants in Python +Home-page: https://github.com/twisted/constantly +Author: Twisted Matrix Labs Developers +Author-email: UNKNOWN +License: MIT +Keywords: constants,enum,twisted +Platform: UNKNOWN +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +Constantly +========== + +A library that provides symbolic constant support. +It includes collections and constants with text, numeric, and bit flag values. +Originally ``twisted.python.constants`` from the `Twisted `_ project. + + +Tests +----- + +To run tests:: + + $ tox + +This will run tests on Python 2.7, 3.3, 3.4, and PyPy, as well as doing coverage and pyflakes checks. + + diff --git a/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/RECORD b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/RECORD new file mode 100644 index 0000000..5c733ea --- /dev/null +++ b/venv/lib/python3.7/site-packages/constantly-15.1.0.dist-info/RECORD @@ -0,0 +1,14 @@ +constantly/__init__.py,sha256=K2EFx89mIF8TkuE4F2ZhqeiE9UuB9S0DpFy0SNhu6uc,517 +constantly/_constants.py,sha256=n-QpkK73fCIyebkqp6hvUMuEe3uYeIptBtl4KahxpcI,16090 +constantly/_version.py,sha256=kp8Hoj2tpH_Xpb4CONVFfYjTpEOr3EGzNRaT_IFZ3Ao,472 +constantly-15.1.0.dist-info/DESCRIPTION.rst,sha256=sx7cfQa9trLrI06ORsPDOgA4UkW9KdPxYfygiqt50R4,397 +constantly-15.1.0.dist-info/METADATA,sha256=4Rt-WjQ0S-JhhzVk__zpXfYLaC7KaVjQzW9SVaBhwoY,1214 +constantly-15.1.0.dist-info/metadata.json,sha256=y1-W-VJW79doSoMail8qNDduY5oHC2JGG1-tBZ_dA0k,923 +constantly-15.1.0.dist-info/pbr.json,sha256=of4UIk4TOAoS3Gxf7oE2PwaRBcQW2ij9ZLRX1LMhy1A,47 +constantly-15.1.0.dist-info/RECORD,, +constantly-15.1.0.dist-info/top_level.txt,sha256=Z3LZxRT3sV7OIcLddygWy8rRaguc4a1hlGotDs-vFIM,11 +constantly-15.1.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +constantly-15.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +constantly/__pycache__/_version.cpython-37.pyc,, +constantly/__pycache__/_constants.cpython-37.pyc,, +constantly/__pycache__/__init__.cpython-37.pyc,, diff --git a/venv/lib/python3.7/site-packages/constantly/_version.py b/venv/lib/python3.7/site-packages/constantly/_version.py new file mode 100644 index 0000000..2b1beb5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/constantly/_version.py @@ -0,0 +1,21 @@ + +# This file was generated by 'versioneer.py' (0.15) from +# revision-control system data, or from the parent directory name of an +# unpacked source archive. Distribution tarballs contain a pre-generated copy +# of this file. + +import json +import sys + +version_json = ''' +{ + "dirty": false, + "error": null, + "full-revisionid": "c8375a7e3431792ea1b1b44678f3f6878d5e8c9a", + "version": "15.1.0" +} +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) diff --git a/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/AUTHORS.rst b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/AUTHORS.rst new file mode 100644 index 0000000..8ba7e0e --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/AUTHORS.rst @@ -0,0 +1,44 @@ +AUTHORS +======= + +PGP key fingerprints are enclosed in parentheses. + +* Alex Gaynor (E27D 4AA0 1651 72CB C5D2 AF2B 125F 5C67 DFE9 4084) +* Hynek Schlawack (C2A0 4F86 ACE2 8ADC F817 DBB7 AE25 3622 7F69 F181) +* Donald Stufft +* Laurens Van Houtven <_@lvh.io> (D9DC 4315 772F 8E91 DD22 B153 DFD1 3DF7 A8DD 569B) +* Christian Heimes +* Paul Kehrer (05FD 9FA1 6CF7 5735 0D91 A560 235A E5F1 29F9 ED98) +* Jarret Raim +* Alex Stapleton (A1C7 E50B 66DE 39ED C847 9665 8E3C 20D1 9BD9 5C4C) +* David Reid (0F83 CC87 B32F 482B C726 B58A 9FBF D8F4 DA89 6D74) +* Matthew Lefkowitz (06AB F638 E878 CD29 1264 18AB 7EC2 8125 0FBC 4A07) +* Konstantinos Koukopoulos (D6BD 52B6 8C99 A91C E2C8 934D 3300 566B 3A46 726E) +* Stephen Holsapple +* Terry Chia +* Matthew Iversen (2F04 3DCC D6E6 D5AC D262 2E0B C046 E8A8 7452 2973) +* Mohammed Attia +* Michael Hart +* Mark Adams (A18A 7DD3 283C CF2A B0CE FE0E C7A0 5E3F C972 098C) +* Gregory Haynes (6FB6 44BF 9FD0 EBA2 1CE9 471F B08F 42F9 0DC6 599F) +* Chelsea Winfree +* Steven Buss (1FB9 2EC1 CF93 DFD6 B47F F583 B1A5 6C22 290D A4C3) +* Andre Caron +* Jiangge Zhang (BBEC 782B 015F 71B1 5FF7 EACA 1A8C AA98 255F 5000) +* Major Hayden (1BF9 9264 9596 0033 698C 252B 7370 51E0 C101 1FB1) +* Phoebe Queen (10D4 7741 AB65 50F4 B264 3888 DA40 201A 072B C1FA) +* Google Inc. +* Amaury Forgeot d'Arc +* Dirkjan Ochtman (25BB BAC1 13C1 BFD5 AA59 4A4C 9F96 B929 3038 0381) +* Maximilian Hils +* Simo Sorce +* Thomas Sileo +* Fraser Tweedale +* Ofek Lev (FFB6 B92B 30B1 7848 546E 9912 972F E913 DAD5 A46E) +* Erik Daguerre +* Aviv Palivoda +* Chris Wolfe +* Jeremy Lainé +* Denis Gladkikh +* John Pacific (2CF6 0381 B5EF 29B7 D48C 2020 7BB9 71A0 E891 44D9) +* Marti Raudsepp diff --git a/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/WHEEL b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/WHEEL new file mode 100644 index 0000000..dd598b5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography-2.8.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: false +Tag: cp34-abi3-macosx_10_6_intel + diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/_der.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/_der.py new file mode 100644 index 0000000..51518d6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/_der.py @@ -0,0 +1,156 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import six + +from cryptography.utils import int_from_bytes, int_to_bytes + + +# This module contains a lightweight DER encoder and decoder. See X.690 for the +# specification. This module intentionally does not implement the more complex +# BER encoding, only DER. +# +# Note this implementation treats an element's constructed bit as part of the +# tag. This is fine for DER, where the bit is always computable from the type. + + +CONSTRUCTED = 0x20 +CONTEXT_SPECIFIC = 0x80 + +INTEGER = 0x02 +BIT_STRING = 0x03 +OCTET_STRING = 0x04 +NULL = 0x05 +OBJECT_IDENTIFIER = 0x06 +SEQUENCE = 0x10 | CONSTRUCTED +SET = 0x11 | CONSTRUCTED +PRINTABLE_STRING = 0x13 +UTC_TIME = 0x17 +GENERALIZED_TIME = 0x18 + + +class DERReader(object): + def __init__(self, data): + self.data = memoryview(data) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_value is None: + self.check_empty() + + def is_empty(self): + return len(self.data) == 0 + + def check_empty(self): + if not self.is_empty(): + raise ValueError("Invalid DER input: trailing data") + + def read_byte(self): + if len(self.data) < 1: + raise ValueError("Invalid DER input: insufficient data") + ret = six.indexbytes(self.data, 0) + self.data = self.data[1:] + return ret + + def read_bytes(self, n): + if len(self.data) < n: + raise ValueError("Invalid DER input: insufficient data") + ret = self.data[:n] + self.data = self.data[n:] + return ret + + def read_any_element(self): + tag = self.read_byte() + # Tag numbers 31 or higher are stored in multiple bytes. No supported + # ASN.1 types use such tags, so reject these. + if tag & 0x1f == 0x1f: + raise ValueError("Invalid DER input: unexpected high tag number") + length_byte = self.read_byte() + if length_byte & 0x80 == 0: + # If the high bit is clear, the first length byte is the length. + length = length_byte + else: + # If the high bit is set, the first length byte encodes the length + # of the length. + length_byte &= 0x7f + if length_byte == 0: + raise ValueError( + "Invalid DER input: indefinite length form is not allowed " + "in DER" + ) + length = 0 + for i in range(length_byte): + length <<= 8 + length |= self.read_byte() + if length == 0: + raise ValueError( + "Invalid DER input: length was not minimally-encoded" + ) + if length < 0x80: + # If the length could have been encoded in short form, it must + # not use long form. + raise ValueError( + "Invalid DER input: length was not minimally-encoded" + ) + body = self.read_bytes(length) + return tag, DERReader(body) + + def read_element(self, expected_tag): + tag, body = self.read_any_element() + if tag != expected_tag: + raise ValueError("Invalid DER input: unexpected tag") + return body + + def read_single_element(self, expected_tag): + with self: + return self.read_element(expected_tag) + + def read_optional_element(self, expected_tag): + if len(self.data) > 0 and six.indexbytes(self.data, 0) == expected_tag: + return self.read_element(expected_tag) + return None + + def as_integer(self): + if len(self.data) == 0: + raise ValueError("Invalid DER input: empty integer contents") + first = six.indexbytes(self.data, 0) + if first & 0x80 == 0x80: + raise ValueError("Negative DER integers are not supported") + # The first 9 bits must not all be zero or all be ones. Otherwise, the + # encoding should have been one byte shorter. + if len(self.data) > 1: + second = six.indexbytes(self.data, 1) + if first == 0 and second & 0x80 == 0: + raise ValueError( + "Invalid DER input: integer not minimally-encoded" + ) + return int_from_bytes(self.data, "big") + + +def encode_der_integer(x): + if not isinstance(x, six.integer_types): + raise ValueError("Value must be an integer") + if x < 0: + raise ValueError("Negative integers are not supported") + n = x.bit_length() // 8 + 1 + return int_to_bytes(x, n) + + +def encode_der(tag, *children): + length = 0 + for child in children: + length += len(child) + chunks = [six.int2byte(tag)] + if length < 0x80: + chunks.append(six.int2byte(length)) + else: + length_bytes = int_to_bytes(length) + chunks.append(six.int2byte(0x80 | len(length_bytes))) + chunks.append(length_bytes) + chunks.extend(children) + return b"".join(chunks) diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/aead.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/aead.py new file mode 100644 index 0000000..0cad15c --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/aead.py @@ -0,0 +1,162 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.exceptions import InvalidTag + + +_ENCRYPT = 1 +_DECRYPT = 0 + + +def _aead_cipher_name(cipher): + from cryptography.hazmat.primitives.ciphers.aead import ( + AESCCM, AESGCM, ChaCha20Poly1305 + ) + if isinstance(cipher, ChaCha20Poly1305): + return b"chacha20-poly1305" + elif isinstance(cipher, AESCCM): + return "aes-{}-ccm".format(len(cipher._key) * 8).encode("ascii") + else: + assert isinstance(cipher, AESGCM) + return "aes-{}-gcm".format(len(cipher._key) * 8).encode("ascii") + + +def _aead_setup(backend, cipher_name, key, nonce, tag, tag_len, operation): + evp_cipher = backend._lib.EVP_get_cipherbyname(cipher_name) + backend.openssl_assert(evp_cipher != backend._ffi.NULL) + ctx = backend._lib.EVP_CIPHER_CTX_new() + ctx = backend._ffi.gc(ctx, backend._lib.EVP_CIPHER_CTX_free) + res = backend._lib.EVP_CipherInit_ex( + ctx, evp_cipher, + backend._ffi.NULL, + backend._ffi.NULL, + backend._ffi.NULL, + int(operation == _ENCRYPT) + ) + backend.openssl_assert(res != 0) + res = backend._lib.EVP_CIPHER_CTX_set_key_length(ctx, len(key)) + backend.openssl_assert(res != 0) + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_IVLEN, len(nonce), + backend._ffi.NULL + ) + backend.openssl_assert(res != 0) + if operation == _DECRYPT: + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_TAG, len(tag), tag + ) + backend.openssl_assert(res != 0) + elif cipher_name.endswith(b"-ccm"): + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_SET_TAG, tag_len, backend._ffi.NULL + ) + backend.openssl_assert(res != 0) + + nonce_ptr = backend._ffi.from_buffer(nonce) + key_ptr = backend._ffi.from_buffer(key) + res = backend._lib.EVP_CipherInit_ex( + ctx, + backend._ffi.NULL, + backend._ffi.NULL, + key_ptr, + nonce_ptr, + int(operation == _ENCRYPT) + ) + backend.openssl_assert(res != 0) + return ctx + + +def _set_length(backend, ctx, data_len): + intptr = backend._ffi.new("int *") + res = backend._lib.EVP_CipherUpdate( + ctx, + backend._ffi.NULL, + intptr, + backend._ffi.NULL, + data_len + ) + backend.openssl_assert(res != 0) + + +def _process_aad(backend, ctx, associated_data): + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherUpdate( + ctx, backend._ffi.NULL, outlen, associated_data, len(associated_data) + ) + backend.openssl_assert(res != 0) + + +def _process_data(backend, ctx, data): + outlen = backend._ffi.new("int *") + buf = backend._ffi.new("unsigned char[]", len(data)) + res = backend._lib.EVP_CipherUpdate(ctx, buf, outlen, data, len(data)) + backend.openssl_assert(res != 0) + return backend._ffi.buffer(buf, outlen[0])[:] + + +def _encrypt(backend, cipher, nonce, data, associated_data, tag_length): + from cryptography.hazmat.primitives.ciphers.aead import AESCCM + cipher_name = _aead_cipher_name(cipher) + ctx = _aead_setup( + backend, cipher_name, cipher._key, nonce, None, tag_length, _ENCRYPT + ) + # CCM requires us to pass the length of the data before processing anything + # However calling this with any other AEAD results in an error + if isinstance(cipher, AESCCM): + _set_length(backend, ctx, len(data)) + + _process_aad(backend, ctx, associated_data) + processed_data = _process_data(backend, ctx, data) + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherFinal_ex(ctx, backend._ffi.NULL, outlen) + backend.openssl_assert(res != 0) + backend.openssl_assert(outlen[0] == 0) + tag_buf = backend._ffi.new("unsigned char[]", tag_length) + res = backend._lib.EVP_CIPHER_CTX_ctrl( + ctx, backend._lib.EVP_CTRL_AEAD_GET_TAG, tag_length, tag_buf + ) + backend.openssl_assert(res != 0) + tag = backend._ffi.buffer(tag_buf)[:] + + return processed_data + tag + + +def _decrypt(backend, cipher, nonce, data, associated_data, tag_length): + from cryptography.hazmat.primitives.ciphers.aead import AESCCM + if len(data) < tag_length: + raise InvalidTag + tag = data[-tag_length:] + data = data[:-tag_length] + cipher_name = _aead_cipher_name(cipher) + ctx = _aead_setup( + backend, cipher_name, cipher._key, nonce, tag, tag_length, _DECRYPT + ) + # CCM requires us to pass the length of the data before processing anything + # However calling this with any other AEAD results in an error + if isinstance(cipher, AESCCM): + _set_length(backend, ctx, len(data)) + + _process_aad(backend, ctx, associated_data) + # CCM has a different error path if the tag doesn't match. Errors are + # raised in Update and Final is irrelevant. + if isinstance(cipher, AESCCM): + outlen = backend._ffi.new("int *") + buf = backend._ffi.new("unsigned char[]", len(data)) + res = backend._lib.EVP_CipherUpdate(ctx, buf, outlen, data, len(data)) + if res != 1: + backend._consume_errors() + raise InvalidTag + + processed_data = backend._ffi.buffer(buf, outlen[0])[:] + else: + processed_data = _process_data(backend, ctx, data) + outlen = backend._ffi.new("int *") + res = backend._lib.EVP_CipherFinal_ex(ctx, backend._ffi.NULL, outlen) + if res == 0: + backend._consume_errors() + raise InvalidTag + + return processed_data diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/decode_asn1.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/decode_asn1.py new file mode 100644 index 0000000..47c6c65 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/decode_asn1.py @@ -0,0 +1,900 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import datetime +import ipaddress + +import six + +from cryptography import x509 +from cryptography.hazmat._der import DERReader, INTEGER, NULL, SEQUENCE +from cryptography.x509.extensions import _TLS_FEATURE_TYPE_TO_ENUM +from cryptography.x509.name import _ASN1_TYPE_TO_ENUM +from cryptography.x509.oid import ( + CRLEntryExtensionOID, CertificatePoliciesOID, ExtensionOID, + OCSPExtensionOID, +) + + +def _obj2txt(backend, obj): + # Set to 80 on the recommendation of + # https://www.openssl.org/docs/crypto/OBJ_nid2ln.html#return_values + # + # But OIDs longer than this occur in real life (e.g. Active + # Directory makes some very long OIDs). So we need to detect + # and properly handle the case where the default buffer is not + # big enough. + # + buf_len = 80 + buf = backend._ffi.new("char[]", buf_len) + + # 'res' is the number of bytes that *would* be written if the + # buffer is large enough. If 'res' > buf_len - 1, we need to + # alloc a big-enough buffer and go again. + res = backend._lib.OBJ_obj2txt(buf, buf_len, obj, 1) + if res > buf_len - 1: # account for terminating null byte + buf_len = res + 1 + buf = backend._ffi.new("char[]", buf_len) + res = backend._lib.OBJ_obj2txt(buf, buf_len, obj, 1) + backend.openssl_assert(res > 0) + return backend._ffi.buffer(buf, res)[:].decode() + + +def _decode_x509_name_entry(backend, x509_name_entry): + obj = backend._lib.X509_NAME_ENTRY_get_object(x509_name_entry) + backend.openssl_assert(obj != backend._ffi.NULL) + data = backend._lib.X509_NAME_ENTRY_get_data(x509_name_entry) + backend.openssl_assert(data != backend._ffi.NULL) + value = _asn1_string_to_utf8(backend, data) + oid = _obj2txt(backend, obj) + type = _ASN1_TYPE_TO_ENUM[data.type] + + return x509.NameAttribute(x509.ObjectIdentifier(oid), value, type) + + +def _decode_x509_name(backend, x509_name): + count = backend._lib.X509_NAME_entry_count(x509_name) + attributes = [] + prev_set_id = -1 + for x in range(count): + entry = backend._lib.X509_NAME_get_entry(x509_name, x) + attribute = _decode_x509_name_entry(backend, entry) + set_id = backend._lib.Cryptography_X509_NAME_ENTRY_set(entry) + if set_id != prev_set_id: + attributes.append(set([attribute])) + else: + # is in the same RDN a previous entry + attributes[-1].add(attribute) + prev_set_id = set_id + + return x509.Name(x509.RelativeDistinguishedName(rdn) for rdn in attributes) + + +def _decode_general_names(backend, gns): + num = backend._lib.sk_GENERAL_NAME_num(gns) + names = [] + for i in range(num): + gn = backend._lib.sk_GENERAL_NAME_value(gns, i) + backend.openssl_assert(gn != backend._ffi.NULL) + names.append(_decode_general_name(backend, gn)) + + return names + + +def _decode_general_name(backend, gn): + if gn.type == backend._lib.GEN_DNS: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes(backend, gn.d.dNSName).decode("utf8") + # We don't use the constructor for DNSName so we can bypass validation + # This allows us to create DNSName objects that have unicode chars + # when a certificate (against the RFC) contains them. + return x509.DNSName._init_without_validation(data) + elif gn.type == backend._lib.GEN_URI: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes( + backend, gn.d.uniformResourceIdentifier + ).decode("utf8") + # We don't use the constructor for URI so we can bypass validation + # This allows us to create URI objects that have unicode chars + # when a certificate (against the RFC) contains them. + return x509.UniformResourceIdentifier._init_without_validation(data) + elif gn.type == backend._lib.GEN_RID: + oid = _obj2txt(backend, gn.d.registeredID) + return x509.RegisteredID(x509.ObjectIdentifier(oid)) + elif gn.type == backend._lib.GEN_IPADD: + data = _asn1_string_to_bytes(backend, gn.d.iPAddress) + data_len = len(data) + if data_len == 8 or data_len == 32: + # This is an IPv4 or IPv6 Network and not a single IP. This + # type of data appears in Name Constraints. Unfortunately, + # ipaddress doesn't support packed bytes + netmask. Additionally, + # IPv6Network can only handle CIDR rather than the full 16 byte + # netmask. To handle this we convert the netmask to integer, then + # find the first 0 bit, which will be the prefix. If another 1 + # bit is present after that the netmask is invalid. + base = ipaddress.ip_address(data[:data_len // 2]) + netmask = ipaddress.ip_address(data[data_len // 2:]) + bits = bin(int(netmask))[2:] + prefix = bits.find('0') + # If no 0 bits are found it is a /32 or /128 + if prefix == -1: + prefix = len(bits) + + if "1" in bits[prefix:]: + raise ValueError("Invalid netmask") + + ip = ipaddress.ip_network(base.exploded + u"/{}".format(prefix)) + else: + ip = ipaddress.ip_address(data) + + return x509.IPAddress(ip) + elif gn.type == backend._lib.GEN_DIRNAME: + return x509.DirectoryName( + _decode_x509_name(backend, gn.d.directoryName) + ) + elif gn.type == backend._lib.GEN_EMAIL: + # Convert to bytes and then decode to utf8. We don't use + # asn1_string_to_utf8 here because it doesn't properly convert + # utf8 from ia5strings. + data = _asn1_string_to_bytes(backend, gn.d.rfc822Name).decode("utf8") + # We don't use the constructor for RFC822Name so we can bypass + # validation. This allows us to create RFC822Name objects that have + # unicode chars when a certificate (against the RFC) contains them. + return x509.RFC822Name._init_without_validation(data) + elif gn.type == backend._lib.GEN_OTHERNAME: + type_id = _obj2txt(backend, gn.d.otherName.type_id) + value = _asn1_to_der(backend, gn.d.otherName.value) + return x509.OtherName(x509.ObjectIdentifier(type_id), value) + else: + # x400Address or ediPartyName + raise x509.UnsupportedGeneralNameType( + "{} is not a supported type".format( + x509._GENERAL_NAMES.get(gn.type, gn.type) + ), + gn.type + ) + + +def _decode_ocsp_no_check(backend, ext): + return x509.OCSPNoCheck() + + +def _decode_crl_number(backend, ext): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", ext) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + return x509.CRLNumber(_asn1_integer_to_int(backend, asn1_int)) + + +def _decode_delta_crl_indicator(backend, ext): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", ext) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + return x509.DeltaCRLIndicator(_asn1_integer_to_int(backend, asn1_int)) + + +class _X509ExtensionParser(object): + def __init__(self, ext_count, get_ext, handlers): + self.ext_count = ext_count + self.get_ext = get_ext + self.handlers = handlers + + def parse(self, backend, x509_obj): + extensions = [] + seen_oids = set() + for i in range(self.ext_count(backend, x509_obj)): + ext = self.get_ext(backend, x509_obj, i) + backend.openssl_assert(ext != backend._ffi.NULL) + crit = backend._lib.X509_EXTENSION_get_critical(ext) + critical = crit == 1 + oid = x509.ObjectIdentifier( + _obj2txt(backend, backend._lib.X509_EXTENSION_get_object(ext)) + ) + if oid in seen_oids: + raise x509.DuplicateExtension( + "Duplicate {} extension found".format(oid), oid + ) + + # These OIDs are only supported in OpenSSL 1.1.0+ but we want + # to support them in all versions of OpenSSL so we decode them + # ourselves. + if oid == ExtensionOID.TLS_FEATURE: + # The extension contents are a SEQUENCE OF INTEGERs. + data = backend._lib.X509_EXTENSION_get_data(ext) + data_bytes = _asn1_string_to_bytes(backend, data) + features = DERReader(data_bytes).read_single_element(SEQUENCE) + parsed = [] + while not features.is_empty(): + parsed.append(features.read_element(INTEGER).as_integer()) + # Map the features to their enum value. + value = x509.TLSFeature( + [_TLS_FEATURE_TYPE_TO_ENUM[x] for x in parsed] + ) + extensions.append(x509.Extension(oid, critical, value)) + seen_oids.add(oid) + continue + elif oid == ExtensionOID.PRECERT_POISON: + data = backend._lib.X509_EXTENSION_get_data(ext) + # The contents of the extension must be an ASN.1 NULL. + reader = DERReader(_asn1_string_to_bytes(backend, data)) + reader.read_single_element(NULL).check_empty() + extensions.append(x509.Extension( + oid, critical, x509.PrecertPoison() + )) + seen_oids.add(oid) + continue + + try: + handler = self.handlers[oid] + except KeyError: + # Dump the DER payload into an UnrecognizedExtension object + data = backend._lib.X509_EXTENSION_get_data(ext) + backend.openssl_assert(data != backend._ffi.NULL) + der = backend._ffi.buffer(data.data, data.length)[:] + unrecognized = x509.UnrecognizedExtension(oid, der) + extensions.append( + x509.Extension(oid, critical, unrecognized) + ) + else: + ext_data = backend._lib.X509V3_EXT_d2i(ext) + if ext_data == backend._ffi.NULL: + backend._consume_errors() + raise ValueError( + "The {} extension is invalid and can't be " + "parsed".format(oid) + ) + + value = handler(backend, ext_data) + extensions.append(x509.Extension(oid, critical, value)) + + seen_oids.add(oid) + + return x509.Extensions(extensions) + + +def _decode_certificate_policies(backend, cp): + cp = backend._ffi.cast("Cryptography_STACK_OF_POLICYINFO *", cp) + cp = backend._ffi.gc(cp, backend._lib.CERTIFICATEPOLICIES_free) + + num = backend._lib.sk_POLICYINFO_num(cp) + certificate_policies = [] + for i in range(num): + qualifiers = None + pi = backend._lib.sk_POLICYINFO_value(cp, i) + oid = x509.ObjectIdentifier(_obj2txt(backend, pi.policyid)) + if pi.qualifiers != backend._ffi.NULL: + qnum = backend._lib.sk_POLICYQUALINFO_num(pi.qualifiers) + qualifiers = [] + for j in range(qnum): + pqi = backend._lib.sk_POLICYQUALINFO_value( + pi.qualifiers, j + ) + pqualid = x509.ObjectIdentifier( + _obj2txt(backend, pqi.pqualid) + ) + if pqualid == CertificatePoliciesOID.CPS_QUALIFIER: + cpsuri = backend._ffi.buffer( + pqi.d.cpsuri.data, pqi.d.cpsuri.length + )[:].decode('ascii') + qualifiers.append(cpsuri) + else: + assert pqualid == CertificatePoliciesOID.CPS_USER_NOTICE + user_notice = _decode_user_notice( + backend, pqi.d.usernotice + ) + qualifiers.append(user_notice) + + certificate_policies.append( + x509.PolicyInformation(oid, qualifiers) + ) + + return x509.CertificatePolicies(certificate_policies) + + +def _decode_user_notice(backend, un): + explicit_text = None + notice_reference = None + + if un.exptext != backend._ffi.NULL: + explicit_text = _asn1_string_to_utf8(backend, un.exptext) + + if un.noticeref != backend._ffi.NULL: + organization = _asn1_string_to_utf8( + backend, un.noticeref.organization + ) + + num = backend._lib.sk_ASN1_INTEGER_num( + un.noticeref.noticenos + ) + notice_numbers = [] + for i in range(num): + asn1_int = backend._lib.sk_ASN1_INTEGER_value( + un.noticeref.noticenos, i + ) + notice_num = _asn1_integer_to_int(backend, asn1_int) + notice_numbers.append(notice_num) + + notice_reference = x509.NoticeReference( + organization, notice_numbers + ) + + return x509.UserNotice(notice_reference, explicit_text) + + +def _decode_basic_constraints(backend, bc_st): + basic_constraints = backend._ffi.cast("BASIC_CONSTRAINTS *", bc_st) + basic_constraints = backend._ffi.gc( + basic_constraints, backend._lib.BASIC_CONSTRAINTS_free + ) + # The byte representation of an ASN.1 boolean true is \xff. OpenSSL + # chooses to just map this to its ordinal value, so true is 255 and + # false is 0. + ca = basic_constraints.ca == 255 + path_length = _asn1_integer_to_int_or_none( + backend, basic_constraints.pathlen + ) + + return x509.BasicConstraints(ca, path_length) + + +def _decode_subject_key_identifier(backend, asn1_string): + asn1_string = backend._ffi.cast("ASN1_OCTET_STRING *", asn1_string) + asn1_string = backend._ffi.gc( + asn1_string, backend._lib.ASN1_OCTET_STRING_free + ) + return x509.SubjectKeyIdentifier( + backend._ffi.buffer(asn1_string.data, asn1_string.length)[:] + ) + + +def _decode_authority_key_identifier(backend, akid): + akid = backend._ffi.cast("AUTHORITY_KEYID *", akid) + akid = backend._ffi.gc(akid, backend._lib.AUTHORITY_KEYID_free) + key_identifier = None + authority_cert_issuer = None + + if akid.keyid != backend._ffi.NULL: + key_identifier = backend._ffi.buffer( + akid.keyid.data, akid.keyid.length + )[:] + + if akid.issuer != backend._ffi.NULL: + authority_cert_issuer = _decode_general_names( + backend, akid.issuer + ) + + authority_cert_serial_number = _asn1_integer_to_int_or_none( + backend, akid.serial + ) + + return x509.AuthorityKeyIdentifier( + key_identifier, authority_cert_issuer, authority_cert_serial_number + ) + + +def _decode_authority_information_access(backend, aia): + aia = backend._ffi.cast("Cryptography_STACK_OF_ACCESS_DESCRIPTION *", aia) + aia = backend._ffi.gc( + aia, + lambda x: backend._lib.sk_ACCESS_DESCRIPTION_pop_free( + x, backend._ffi.addressof( + backend._lib._original_lib, "ACCESS_DESCRIPTION_free" + ) + ) + ) + num = backend._lib.sk_ACCESS_DESCRIPTION_num(aia) + access_descriptions = [] + for i in range(num): + ad = backend._lib.sk_ACCESS_DESCRIPTION_value(aia, i) + backend.openssl_assert(ad.method != backend._ffi.NULL) + oid = x509.ObjectIdentifier(_obj2txt(backend, ad.method)) + backend.openssl_assert(ad.location != backend._ffi.NULL) + gn = _decode_general_name(backend, ad.location) + access_descriptions.append(x509.AccessDescription(oid, gn)) + + return x509.AuthorityInformationAccess(access_descriptions) + + +def _decode_key_usage(backend, bit_string): + bit_string = backend._ffi.cast("ASN1_BIT_STRING *", bit_string) + bit_string = backend._ffi.gc(bit_string, backend._lib.ASN1_BIT_STRING_free) + get_bit = backend._lib.ASN1_BIT_STRING_get_bit + digital_signature = get_bit(bit_string, 0) == 1 + content_commitment = get_bit(bit_string, 1) == 1 + key_encipherment = get_bit(bit_string, 2) == 1 + data_encipherment = get_bit(bit_string, 3) == 1 + key_agreement = get_bit(bit_string, 4) == 1 + key_cert_sign = get_bit(bit_string, 5) == 1 + crl_sign = get_bit(bit_string, 6) == 1 + encipher_only = get_bit(bit_string, 7) == 1 + decipher_only = get_bit(bit_string, 8) == 1 + return x509.KeyUsage( + digital_signature, + content_commitment, + key_encipherment, + data_encipherment, + key_agreement, + key_cert_sign, + crl_sign, + encipher_only, + decipher_only + ) + + +def _decode_general_names_extension(backend, gns): + gns = backend._ffi.cast("GENERAL_NAMES *", gns) + gns = backend._ffi.gc(gns, backend._lib.GENERAL_NAMES_free) + general_names = _decode_general_names(backend, gns) + return general_names + + +def _decode_subject_alt_name(backend, ext): + return x509.SubjectAlternativeName( + _decode_general_names_extension(backend, ext) + ) + + +def _decode_issuer_alt_name(backend, ext): + return x509.IssuerAlternativeName( + _decode_general_names_extension(backend, ext) + ) + + +def _decode_name_constraints(backend, nc): + nc = backend._ffi.cast("NAME_CONSTRAINTS *", nc) + nc = backend._ffi.gc(nc, backend._lib.NAME_CONSTRAINTS_free) + permitted = _decode_general_subtrees(backend, nc.permittedSubtrees) + excluded = _decode_general_subtrees(backend, nc.excludedSubtrees) + return x509.NameConstraints( + permitted_subtrees=permitted, excluded_subtrees=excluded + ) + + +def _decode_general_subtrees(backend, stack_subtrees): + if stack_subtrees == backend._ffi.NULL: + return None + + num = backend._lib.sk_GENERAL_SUBTREE_num(stack_subtrees) + subtrees = [] + + for i in range(num): + obj = backend._lib.sk_GENERAL_SUBTREE_value(stack_subtrees, i) + backend.openssl_assert(obj != backend._ffi.NULL) + name = _decode_general_name(backend, obj.base) + subtrees.append(name) + + return subtrees + + +def _decode_issuing_dist_point(backend, idp): + idp = backend._ffi.cast("ISSUING_DIST_POINT *", idp) + idp = backend._ffi.gc(idp, backend._lib.ISSUING_DIST_POINT_free) + if idp.distpoint != backend._ffi.NULL: + full_name, relative_name = _decode_distpoint(backend, idp.distpoint) + else: + full_name = None + relative_name = None + + only_user = idp.onlyuser == 255 + only_ca = idp.onlyCA == 255 + indirect_crl = idp.indirectCRL == 255 + only_attr = idp.onlyattr == 255 + if idp.onlysomereasons != backend._ffi.NULL: + only_some_reasons = _decode_reasons(backend, idp.onlysomereasons) + else: + only_some_reasons = None + + return x509.IssuingDistributionPoint( + full_name, relative_name, only_user, only_ca, only_some_reasons, + indirect_crl, only_attr + ) + + +def _decode_policy_constraints(backend, pc): + pc = backend._ffi.cast("POLICY_CONSTRAINTS *", pc) + pc = backend._ffi.gc(pc, backend._lib.POLICY_CONSTRAINTS_free) + + require_explicit_policy = _asn1_integer_to_int_or_none( + backend, pc.requireExplicitPolicy + ) + inhibit_policy_mapping = _asn1_integer_to_int_or_none( + backend, pc.inhibitPolicyMapping + ) + + return x509.PolicyConstraints( + require_explicit_policy, inhibit_policy_mapping + ) + + +def _decode_extended_key_usage(backend, sk): + sk = backend._ffi.cast("Cryptography_STACK_OF_ASN1_OBJECT *", sk) + sk = backend._ffi.gc(sk, backend._lib.sk_ASN1_OBJECT_free) + num = backend._lib.sk_ASN1_OBJECT_num(sk) + ekus = [] + + for i in range(num): + obj = backend._lib.sk_ASN1_OBJECT_value(sk, i) + backend.openssl_assert(obj != backend._ffi.NULL) + oid = x509.ObjectIdentifier(_obj2txt(backend, obj)) + ekus.append(oid) + + return x509.ExtendedKeyUsage(ekus) + + +_DISTPOINT_TYPE_FULLNAME = 0 +_DISTPOINT_TYPE_RELATIVENAME = 1 + + +def _decode_dist_points(backend, cdps): + cdps = backend._ffi.cast("Cryptography_STACK_OF_DIST_POINT *", cdps) + cdps = backend._ffi.gc(cdps, backend._lib.CRL_DIST_POINTS_free) + + num = backend._lib.sk_DIST_POINT_num(cdps) + dist_points = [] + for i in range(num): + full_name = None + relative_name = None + crl_issuer = None + reasons = None + cdp = backend._lib.sk_DIST_POINT_value(cdps, i) + if cdp.reasons != backend._ffi.NULL: + reasons = _decode_reasons(backend, cdp.reasons) + + if cdp.CRLissuer != backend._ffi.NULL: + crl_issuer = _decode_general_names(backend, cdp.CRLissuer) + + # Certificates may have a crl_issuer/reasons and no distribution + # point so make sure it's not null. + if cdp.distpoint != backend._ffi.NULL: + full_name, relative_name = _decode_distpoint( + backend, cdp.distpoint + ) + + dist_points.append( + x509.DistributionPoint( + full_name, relative_name, reasons, crl_issuer + ) + ) + + return dist_points + + +# ReasonFlags ::= BIT STRING { +# unused (0), +# keyCompromise (1), +# cACompromise (2), +# affiliationChanged (3), +# superseded (4), +# cessationOfOperation (5), +# certificateHold (6), +# privilegeWithdrawn (7), +# aACompromise (8) } +_REASON_BIT_MAPPING = { + 1: x509.ReasonFlags.key_compromise, + 2: x509.ReasonFlags.ca_compromise, + 3: x509.ReasonFlags.affiliation_changed, + 4: x509.ReasonFlags.superseded, + 5: x509.ReasonFlags.cessation_of_operation, + 6: x509.ReasonFlags.certificate_hold, + 7: x509.ReasonFlags.privilege_withdrawn, + 8: x509.ReasonFlags.aa_compromise, +} + + +def _decode_reasons(backend, reasons): + # We will check each bit from RFC 5280 + enum_reasons = [] + for bit_position, reason in six.iteritems(_REASON_BIT_MAPPING): + if backend._lib.ASN1_BIT_STRING_get_bit(reasons, bit_position): + enum_reasons.append(reason) + + return frozenset(enum_reasons) + + +def _decode_distpoint(backend, distpoint): + if distpoint.type == _DISTPOINT_TYPE_FULLNAME: + full_name = _decode_general_names(backend, distpoint.name.fullname) + return full_name, None + + # OpenSSL code doesn't test for a specific type for + # relativename, everything that isn't fullname is considered + # relativename. Per RFC 5280: + # + # DistributionPointName ::= CHOICE { + # fullName [0] GeneralNames, + # nameRelativeToCRLIssuer [1] RelativeDistinguishedName } + rns = distpoint.name.relativename + rnum = backend._lib.sk_X509_NAME_ENTRY_num(rns) + attributes = set() + for i in range(rnum): + rn = backend._lib.sk_X509_NAME_ENTRY_value( + rns, i + ) + backend.openssl_assert(rn != backend._ffi.NULL) + attributes.add( + _decode_x509_name_entry(backend, rn) + ) + + relative_name = x509.RelativeDistinguishedName(attributes) + + return None, relative_name + + +def _decode_crl_distribution_points(backend, cdps): + dist_points = _decode_dist_points(backend, cdps) + return x509.CRLDistributionPoints(dist_points) + + +def _decode_freshest_crl(backend, cdps): + dist_points = _decode_dist_points(backend, cdps) + return x509.FreshestCRL(dist_points) + + +def _decode_inhibit_any_policy(backend, asn1_int): + asn1_int = backend._ffi.cast("ASN1_INTEGER *", asn1_int) + asn1_int = backend._ffi.gc(asn1_int, backend._lib.ASN1_INTEGER_free) + skip_certs = _asn1_integer_to_int(backend, asn1_int) + return x509.InhibitAnyPolicy(skip_certs) + + +def _decode_precert_signed_certificate_timestamps(backend, asn1_scts): + from cryptography.hazmat.backends.openssl.x509 import ( + _SignedCertificateTimestamp + ) + asn1_scts = backend._ffi.cast("Cryptography_STACK_OF_SCT *", asn1_scts) + asn1_scts = backend._ffi.gc(asn1_scts, backend._lib.SCT_LIST_free) + + scts = [] + for i in range(backend._lib.sk_SCT_num(asn1_scts)): + sct = backend._lib.sk_SCT_value(asn1_scts, i) + + scts.append(_SignedCertificateTimestamp(backend, asn1_scts, sct)) + return x509.PrecertificateSignedCertificateTimestamps(scts) + + +# CRLReason ::= ENUMERATED { +# unspecified (0), +# keyCompromise (1), +# cACompromise (2), +# affiliationChanged (3), +# superseded (4), +# cessationOfOperation (5), +# certificateHold (6), +# -- value 7 is not used +# removeFromCRL (8), +# privilegeWithdrawn (9), +# aACompromise (10) } +_CRL_ENTRY_REASON_CODE_TO_ENUM = { + 0: x509.ReasonFlags.unspecified, + 1: x509.ReasonFlags.key_compromise, + 2: x509.ReasonFlags.ca_compromise, + 3: x509.ReasonFlags.affiliation_changed, + 4: x509.ReasonFlags.superseded, + 5: x509.ReasonFlags.cessation_of_operation, + 6: x509.ReasonFlags.certificate_hold, + 8: x509.ReasonFlags.remove_from_crl, + 9: x509.ReasonFlags.privilege_withdrawn, + 10: x509.ReasonFlags.aa_compromise, +} + + +_CRL_ENTRY_REASON_ENUM_TO_CODE = { + x509.ReasonFlags.unspecified: 0, + x509.ReasonFlags.key_compromise: 1, + x509.ReasonFlags.ca_compromise: 2, + x509.ReasonFlags.affiliation_changed: 3, + x509.ReasonFlags.superseded: 4, + x509.ReasonFlags.cessation_of_operation: 5, + x509.ReasonFlags.certificate_hold: 6, + x509.ReasonFlags.remove_from_crl: 8, + x509.ReasonFlags.privilege_withdrawn: 9, + x509.ReasonFlags.aa_compromise: 10 +} + + +def _decode_crl_reason(backend, enum): + enum = backend._ffi.cast("ASN1_ENUMERATED *", enum) + enum = backend._ffi.gc(enum, backend._lib.ASN1_ENUMERATED_free) + code = backend._lib.ASN1_ENUMERATED_get(enum) + + try: + return x509.CRLReason(_CRL_ENTRY_REASON_CODE_TO_ENUM[code]) + except KeyError: + raise ValueError("Unsupported reason code: {}".format(code)) + + +def _decode_invalidity_date(backend, inv_date): + generalized_time = backend._ffi.cast( + "ASN1_GENERALIZEDTIME *", inv_date + ) + generalized_time = backend._ffi.gc( + generalized_time, backend._lib.ASN1_GENERALIZEDTIME_free + ) + return x509.InvalidityDate( + _parse_asn1_generalized_time(backend, generalized_time) + ) + + +def _decode_cert_issuer(backend, gns): + gns = backend._ffi.cast("GENERAL_NAMES *", gns) + gns = backend._ffi.gc(gns, backend._lib.GENERAL_NAMES_free) + general_names = _decode_general_names(backend, gns) + return x509.CertificateIssuer(general_names) + + +def _asn1_to_der(backend, asn1_type): + buf = backend._ffi.new("unsigned char **") + res = backend._lib.i2d_ASN1_TYPE(asn1_type, buf) + backend.openssl_assert(res >= 0) + backend.openssl_assert(buf[0] != backend._ffi.NULL) + buf = backend._ffi.gc( + buf, lambda buffer: backend._lib.OPENSSL_free(buffer[0]) + ) + return backend._ffi.buffer(buf[0], res)[:] + + +def _asn1_integer_to_int(backend, asn1_int): + bn = backend._lib.ASN1_INTEGER_to_BN(asn1_int, backend._ffi.NULL) + backend.openssl_assert(bn != backend._ffi.NULL) + bn = backend._ffi.gc(bn, backend._lib.BN_free) + return backend._bn_to_int(bn) + + +def _asn1_integer_to_int_or_none(backend, asn1_int): + if asn1_int == backend._ffi.NULL: + return None + else: + return _asn1_integer_to_int(backend, asn1_int) + + +def _asn1_string_to_bytes(backend, asn1_string): + return backend._ffi.buffer(asn1_string.data, asn1_string.length)[:] + + +def _asn1_string_to_ascii(backend, asn1_string): + return _asn1_string_to_bytes(backend, asn1_string).decode("ascii") + + +def _asn1_string_to_utf8(backend, asn1_string): + buf = backend._ffi.new("unsigned char **") + res = backend._lib.ASN1_STRING_to_UTF8(buf, asn1_string) + if res == -1: + raise ValueError( + "Unsupported ASN1 string type. Type: {}".format(asn1_string.type) + ) + + backend.openssl_assert(buf[0] != backend._ffi.NULL) + buf = backend._ffi.gc( + buf, lambda buffer: backend._lib.OPENSSL_free(buffer[0]) + ) + return backend._ffi.buffer(buf[0], res)[:].decode('utf8') + + +def _parse_asn1_time(backend, asn1_time): + backend.openssl_assert(asn1_time != backend._ffi.NULL) + generalized_time = backend._lib.ASN1_TIME_to_generalizedtime( + asn1_time, backend._ffi.NULL + ) + if generalized_time == backend._ffi.NULL: + raise ValueError( + "Couldn't parse ASN.1 time as generalizedtime {!r}".format( + _asn1_string_to_bytes(backend, asn1_time) + ) + ) + + generalized_time = backend._ffi.gc( + generalized_time, backend._lib.ASN1_GENERALIZEDTIME_free + ) + return _parse_asn1_generalized_time(backend, generalized_time) + + +def _parse_asn1_generalized_time(backend, generalized_time): + time = _asn1_string_to_ascii( + backend, backend._ffi.cast("ASN1_STRING *", generalized_time) + ) + return datetime.datetime.strptime(time, "%Y%m%d%H%M%SZ") + + +def _decode_nonce(backend, nonce): + nonce = backend._ffi.cast("ASN1_OCTET_STRING *", nonce) + nonce = backend._ffi.gc(nonce, backend._lib.ASN1_OCTET_STRING_free) + return x509.OCSPNonce(_asn1_string_to_bytes(backend, nonce)) + + +_EXTENSION_HANDLERS_NO_SCT = { + ExtensionOID.BASIC_CONSTRAINTS: _decode_basic_constraints, + ExtensionOID.SUBJECT_KEY_IDENTIFIER: _decode_subject_key_identifier, + ExtensionOID.KEY_USAGE: _decode_key_usage, + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: _decode_subject_alt_name, + ExtensionOID.EXTENDED_KEY_USAGE: _decode_extended_key_usage, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _decode_authority_key_identifier, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _decode_authority_information_access + ), + ExtensionOID.CERTIFICATE_POLICIES: _decode_certificate_policies, + ExtensionOID.CRL_DISTRIBUTION_POINTS: _decode_crl_distribution_points, + ExtensionOID.FRESHEST_CRL: _decode_freshest_crl, + ExtensionOID.OCSP_NO_CHECK: _decode_ocsp_no_check, + ExtensionOID.INHIBIT_ANY_POLICY: _decode_inhibit_any_policy, + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _decode_issuer_alt_name, + ExtensionOID.NAME_CONSTRAINTS: _decode_name_constraints, + ExtensionOID.POLICY_CONSTRAINTS: _decode_policy_constraints, +} +_EXTENSION_HANDLERS = _EXTENSION_HANDLERS_NO_SCT.copy() +_EXTENSION_HANDLERS[ + ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS +] = _decode_precert_signed_certificate_timestamps + + +_REVOKED_EXTENSION_HANDLERS = { + CRLEntryExtensionOID.CRL_REASON: _decode_crl_reason, + CRLEntryExtensionOID.INVALIDITY_DATE: _decode_invalidity_date, + CRLEntryExtensionOID.CERTIFICATE_ISSUER: _decode_cert_issuer, +} + +_CRL_EXTENSION_HANDLERS = { + ExtensionOID.CRL_NUMBER: _decode_crl_number, + ExtensionOID.DELTA_CRL_INDICATOR: _decode_delta_crl_indicator, + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: _decode_authority_key_identifier, + ExtensionOID.ISSUER_ALTERNATIVE_NAME: _decode_issuer_alt_name, + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: ( + _decode_authority_information_access + ), + ExtensionOID.ISSUING_DISTRIBUTION_POINT: _decode_issuing_dist_point, + ExtensionOID.FRESHEST_CRL: _decode_freshest_crl, +} + +_OCSP_REQ_EXTENSION_HANDLERS = { + OCSPExtensionOID.NONCE: _decode_nonce, +} + +_OCSP_BASICRESP_EXTENSION_HANDLERS = { + OCSPExtensionOID.NONCE: _decode_nonce, +} + +_CERTIFICATE_EXTENSION_PARSER_NO_SCT = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_get_ext(x, i), + handlers=_EXTENSION_HANDLERS_NO_SCT +) + +_CERTIFICATE_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_get_ext(x, i), + handlers=_EXTENSION_HANDLERS +) + +_CSR_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.sk_X509_EXTENSION_num(x), + get_ext=lambda backend, x, i: backend._lib.sk_X509_EXTENSION_value(x, i), + handlers=_EXTENSION_HANDLERS +) + +_REVOKED_CERTIFICATE_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_REVOKED_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_REVOKED_get_ext(x, i), + handlers=_REVOKED_EXTENSION_HANDLERS, +) + +_CRL_EXTENSION_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.X509_CRL_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.X509_CRL_get_ext(x, i), + handlers=_CRL_EXTENSION_HANDLERS, +) + +_OCSP_REQ_EXT_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.OCSP_REQUEST_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.OCSP_REQUEST_get_ext(x, i), + handlers=_OCSP_REQ_EXTENSION_HANDLERS, +) + +_OCSP_BASICRESP_EXT_PARSER = _X509ExtensionParser( + ext_count=lambda backend, x: backend._lib.OCSP_BASICRESP_get_ext_count(x), + get_ext=lambda backend, x, i: backend._lib.OCSP_BASICRESP_get_ext(x, i), + handlers=_OCSP_BASICRESP_EXTENSION_HANDLERS, +) diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/dsa.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/dsa.py new file mode 100644 index 0000000..de61f08 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/dsa.py @@ -0,0 +1,268 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.backends.openssl.utils import ( + _calculate_digest_and_algorithm, _check_not_prehashed, + _warn_sign_verify_deprecated +) +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import ( + AsymmetricSignatureContext, AsymmetricVerificationContext, dsa +) + + +def _dsa_sig_sign(backend, private_key, data): + sig_buf_len = backend._lib.DSA_size(private_key._dsa_cdata) + sig_buf = backend._ffi.new("unsigned char[]", sig_buf_len) + buflen = backend._ffi.new("unsigned int *") + + # The first parameter passed to DSA_sign is unused by OpenSSL but + # must be an integer. + res = backend._lib.DSA_sign( + 0, data, len(data), sig_buf, buflen, private_key._dsa_cdata + ) + backend.openssl_assert(res == 1) + backend.openssl_assert(buflen[0]) + + return backend._ffi.buffer(sig_buf)[:buflen[0]] + + +def _dsa_sig_verify(backend, public_key, signature, data): + # The first parameter passed to DSA_verify is unused by OpenSSL but + # must be an integer. + res = backend._lib.DSA_verify( + 0, data, len(data), signature, len(signature), public_key._dsa_cdata + ) + + if res != 1: + backend._consume_errors() + raise InvalidSignature + + +@utils.register_interface(AsymmetricVerificationContext) +class _DSAVerificationContext(object): + def __init__(self, backend, public_key, signature, algorithm): + self._backend = backend + self._public_key = public_key + self._signature = signature + self._algorithm = algorithm + + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def verify(self): + data_to_verify = self._hash_ctx.finalize() + + _dsa_sig_verify( + self._backend, self._public_key, self._signature, data_to_verify + ) + + +@utils.register_interface(AsymmetricSignatureContext) +class _DSASignatureContext(object): + def __init__(self, backend, private_key, algorithm): + self._backend = backend + self._private_key = private_key + self._algorithm = algorithm + self._hash_ctx = hashes.Hash(self._algorithm, self._backend) + + def update(self, data): + self._hash_ctx.update(data) + + def finalize(self): + data_to_sign = self._hash_ctx.finalize() + return _dsa_sig_sign(self._backend, self._private_key, data_to_sign) + + +@utils.register_interface(dsa.DSAParametersWithNumbers) +class _DSAParameters(object): + def __init__(self, backend, dsa_cdata): + self._backend = backend + self._dsa_cdata = dsa_cdata + + def parameter_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + return dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ) + + def generate_private_key(self): + return self._backend.generate_dsa_private_key(self) + + +@utils.register_interface(dsa.DSAPrivateKeyWithSerialization) +class _DSAPrivateKey(object): + def __init__(self, backend, dsa_cdata, evp_pkey): + self._backend = backend + self._dsa_cdata = dsa_cdata + self._evp_pkey = evp_pkey + + p = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg( + dsa_cdata, p, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(p[0] != backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(p[0]) + + key_size = utils.read_only_property("_key_size") + + def signer(self, signature_algorithm): + _warn_sign_verify_deprecated() + _check_not_prehashed(signature_algorithm) + return _DSASignatureContext(self._backend, self, signature_algorithm) + + def private_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + pub_key = self._backend._ffi.new("BIGNUM **") + priv_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + self._backend._lib.DSA_get0_key(self._dsa_cdata, pub_key, priv_key) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(priv_key[0] != self._backend._ffi.NULL) + return dsa.DSAPrivateNumbers( + public_numbers=dsa.DSAPublicNumbers( + parameter_numbers=dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ), + y=self._backend._bn_to_int(pub_key[0]) + ), + x=self._backend._bn_to_int(priv_key[0]) + ) + + def public_key(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + self._backend.openssl_assert(dsa_cdata != self._backend._ffi.NULL) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_key( + self._dsa_cdata, pub_key, self._backend._ffi.NULL + ) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + pub_key_dup = self._backend._lib.BN_dup(pub_key[0]) + res = self._backend._lib.DSA_set0_key( + dsa_cdata, pub_key_dup, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._dsa_cdata_to_evp_pkey(dsa_cdata) + return _DSAPublicKey(self._backend, dsa_cdata, evp_pkey) + + def parameters(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + self._backend.openssl_assert(dsa_cdata != self._backend._ffi.NULL) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + return _DSAParameters(self._backend, dsa_cdata) + + def private_bytes(self, encoding, format, encryption_algorithm): + return self._backend._private_key_bytes( + encoding, + format, + encryption_algorithm, + self._evp_pkey, + self._dsa_cdata + ) + + def sign(self, data, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _dsa_sig_sign(self._backend, self, data) + + +@utils.register_interface(dsa.DSAPublicKeyWithSerialization) +class _DSAPublicKey(object): + def __init__(self, backend, dsa_cdata, evp_pkey): + self._backend = backend + self._dsa_cdata = dsa_cdata + self._evp_pkey = evp_pkey + p = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg( + dsa_cdata, p, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(p[0] != backend._ffi.NULL) + self._key_size = self._backend._lib.BN_num_bits(p[0]) + + key_size = utils.read_only_property("_key_size") + + def verifier(self, signature, signature_algorithm): + _warn_sign_verify_deprecated() + utils._check_bytes("signature", signature) + + _check_not_prehashed(signature_algorithm) + return _DSAVerificationContext( + self._backend, self, signature, signature_algorithm + ) + + def public_numbers(self): + p = self._backend._ffi.new("BIGNUM **") + q = self._backend._ffi.new("BIGNUM **") + g = self._backend._ffi.new("BIGNUM **") + pub_key = self._backend._ffi.new("BIGNUM **") + self._backend._lib.DSA_get0_pqg(self._dsa_cdata, p, q, g) + self._backend.openssl_assert(p[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(q[0] != self._backend._ffi.NULL) + self._backend.openssl_assert(g[0] != self._backend._ffi.NULL) + self._backend._lib.DSA_get0_key( + self._dsa_cdata, pub_key, self._backend._ffi.NULL + ) + self._backend.openssl_assert(pub_key[0] != self._backend._ffi.NULL) + return dsa.DSAPublicNumbers( + parameter_numbers=dsa.DSAParameterNumbers( + p=self._backend._bn_to_int(p[0]), + q=self._backend._bn_to_int(q[0]), + g=self._backend._bn_to_int(g[0]) + ), + y=self._backend._bn_to_int(pub_key[0]) + ) + + def parameters(self): + dsa_cdata = self._backend._lib.DSAparams_dup(self._dsa_cdata) + dsa_cdata = self._backend._ffi.gc( + dsa_cdata, self._backend._lib.DSA_free + ) + return _DSAParameters(self._backend, dsa_cdata) + + def public_bytes(self, encoding, format): + if format is serialization.PublicFormat.PKCS1: + raise ValueError( + "DSA public keys do not support PKCS1 serialization" + ) + + return self._backend._public_key_bytes( + encoding, + format, + self, + self._evp_pkey, + None + ) + + def verify(self, signature, data, algorithm): + data, algorithm = _calculate_digest_and_algorithm( + self._backend, data, algorithm + ) + return _dsa_sig_verify(self._backend, self, signature, data) diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/x25519.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/x25519.py new file mode 100644 index 0000000..9aab25b --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/x25519.py @@ -0,0 +1,149 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import warnings + +from cryptography import utils +from cryptography.hazmat.backends.openssl.utils import _evp_pkey_derive +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric.x25519 import ( + X25519PrivateKey, X25519PublicKey +) + + +_X25519_KEY_SIZE = 32 + + +@utils.register_interface(X25519PublicKey) +class _X25519PublicKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_bytes(self, encoding=None, format=None): + if encoding is None or format is None: + if encoding is not None or format is not None: + raise ValueError("Both encoding and format are required") + else: + warnings.warn( + "public_bytes now requires encoding and format arguments. " + "Support for calling without arguments will be removed in " + "cryptography 2.7", + utils.DeprecatedIn25, + ) + encoding = serialization.Encoding.Raw + format = serialization.PublicFormat.Raw + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + encoding is not serialization.Encoding.Raw or + format is not serialization.PublicFormat.Raw + ): + raise ValueError( + "When using Raw both encoding and format must be Raw" + ) + + return self._raw_public_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PublicFormat.SubjectPublicKeyInfo + ): + raise ValueError( + "format must be SubjectPublicKeyInfo when encoding is PEM or " + "DER" + ) + + return self._backend._public_key_bytes( + encoding, format, self, self._evp_pkey, None + ) + + def _raw_public_bytes(self): + ucharpp = self._backend._ffi.new("unsigned char **") + res = self._backend._lib.EVP_PKEY_get1_tls_encodedpoint( + self._evp_pkey, ucharpp + ) + self._backend.openssl_assert(res == 32) + self._backend.openssl_assert(ucharpp[0] != self._backend._ffi.NULL) + data = self._backend._ffi.gc( + ucharpp[0], self._backend._lib.OPENSSL_free + ) + return self._backend._ffi.buffer(data, res)[:] + + +@utils.register_interface(X25519PrivateKey) +class _X25519PrivateKey(object): + def __init__(self, backend, evp_pkey): + self._backend = backend + self._evp_pkey = evp_pkey + + def public_key(self): + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_PUBKEY_bio(bio, self._evp_pkey) + self._backend.openssl_assert(res == 1) + evp_pkey = self._backend._lib.d2i_PUBKEY_bio( + bio, self._backend._ffi.NULL + ) + self._backend.openssl_assert(evp_pkey != self._backend._ffi.NULL) + evp_pkey = self._backend._ffi.gc( + evp_pkey, self._backend._lib.EVP_PKEY_free + ) + return _X25519PublicKey(self._backend, evp_pkey) + + def exchange(self, peer_public_key): + if not isinstance(peer_public_key, X25519PublicKey): + raise TypeError("peer_public_key must be X25519PublicKey.") + + return _evp_pkey_derive( + self._backend, self._evp_pkey, peer_public_key + ) + + def private_bytes(self, encoding, format, encryption_algorithm): + if ( + encoding is serialization.Encoding.Raw or + format is serialization.PublicFormat.Raw + ): + if ( + format is not serialization.PrivateFormat.Raw or + encoding is not serialization.Encoding.Raw or not + isinstance(encryption_algorithm, serialization.NoEncryption) + ): + raise ValueError( + "When using Raw both encoding and format must be Raw " + "and encryption_algorithm must be NoEncryption()" + ) + + return self._raw_private_bytes() + + if ( + encoding in serialization._PEM_DER and + format is not serialization.PrivateFormat.PKCS8 + ): + raise ValueError( + "format must be PKCS8 when encoding is PEM or DER" + ) + + return self._backend._private_key_bytes( + encoding, format, encryption_algorithm, self._evp_pkey, None + ) + + def _raw_private_bytes(self): + # When we drop support for CRYPTOGRAPHY_OPENSSL_LESS_THAN_111 we can + # switch this to EVP_PKEY_new_raw_private_key + # The trick we use here is serializing to a PKCS8 key and just + # using the last 32 bytes, which is the key itself. + bio = self._backend._create_mem_bio_gc() + res = self._backend._lib.i2d_PKCS8PrivateKey_bio( + bio, self._evp_pkey, + self._backend._ffi.NULL, self._backend._ffi.NULL, + 0, self._backend._ffi.NULL, self._backend._ffi.NULL + ) + self._backend.openssl_assert(res == 1) + pkcs8 = self._backend._read_mem_bio(bio) + self._backend.openssl_assert(len(pkcs8) == 48) + return pkcs8[-_X25519_KEY_SIZE:] diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/_constant_time.abi3.so b/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/_constant_time.abi3.so new file mode 100755 index 0000000..7c5e80c Binary files /dev/null and b/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/_constant_time.abi3.so differ diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/openssl/binding.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/openssl/binding.py new file mode 100644 index 0000000..9740516 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/bindings/openssl/binding.py @@ -0,0 +1,197 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import collections +import threading +import types +import warnings + +import cryptography +from cryptography import utils +from cryptography.exceptions import InternalError +from cryptography.hazmat.bindings._openssl import ffi, lib +from cryptography.hazmat.bindings.openssl._conditional import CONDITIONAL_NAMES + +_OpenSSLErrorWithText = collections.namedtuple( + "_OpenSSLErrorWithText", ["code", "lib", "func", "reason", "reason_text"] +) + + +class _OpenSSLError(object): + def __init__(self, code, lib, func, reason): + self._code = code + self._lib = lib + self._func = func + self._reason = reason + + def _lib_reason_match(self, lib, reason): + return lib == self.lib and reason == self.reason + + code = utils.read_only_property("_code") + lib = utils.read_only_property("_lib") + func = utils.read_only_property("_func") + reason = utils.read_only_property("_reason") + + +def _consume_errors(lib): + errors = [] + while True: + code = lib.ERR_get_error() + if code == 0: + break + + err_lib = lib.ERR_GET_LIB(code) + err_func = lib.ERR_GET_FUNC(code) + err_reason = lib.ERR_GET_REASON(code) + + errors.append(_OpenSSLError(code, err_lib, err_func, err_reason)) + + return errors + + +def _openssl_assert(lib, ok): + if not ok: + errors = _consume_errors(lib) + errors_with_text = [] + for err in errors: + buf = ffi.new("char[]", 256) + lib.ERR_error_string_n(err.code, buf, len(buf)) + err_text_reason = ffi.string(buf) + + errors_with_text.append( + _OpenSSLErrorWithText( + err.code, err.lib, err.func, err.reason, err_text_reason + ) + ) + + raise InternalError( + "Unknown OpenSSL error. This error is commonly encountered when " + "another library is not cleaning up the OpenSSL error stack. If " + "you are using cryptography with another library that uses " + "OpenSSL try disabling it before reporting a bug. Otherwise " + "please file an issue at https://github.com/pyca/cryptography/" + "issues with information on how to reproduce " + "this. ({0!r})".format(errors_with_text), + errors_with_text + ) + + +def build_conditional_library(lib, conditional_names): + conditional_lib = types.ModuleType("lib") + conditional_lib._original_lib = lib + excluded_names = set() + for condition, names_cb in conditional_names.items(): + if not getattr(lib, condition): + excluded_names.update(names_cb()) + + for attr in dir(lib): + if attr not in excluded_names: + setattr(conditional_lib, attr, getattr(lib, attr)) + + return conditional_lib + + +class Binding(object): + """ + OpenSSL API wrapper. + """ + lib = None + ffi = ffi + _lib_loaded = False + _init_lock = threading.Lock() + _lock_init_lock = threading.Lock() + + def __init__(self): + self._ensure_ffi_initialized() + + @classmethod + def _register_osrandom_engine(cls): + # Clear any errors extant in the queue before we start. In many + # scenarios other things may be interacting with OpenSSL in the same + # process space and it has proven untenable to assume that they will + # reliably clear the error queue. Once we clear it here we will + # error on any subsequent unexpected item in the stack. + cls.lib.ERR_clear_error() + if cls.lib.Cryptography_HAS_ENGINE: + result = cls.lib.Cryptography_add_osrandom_engine() + _openssl_assert(cls.lib, result in (1, 2)) + + @classmethod + def _ensure_ffi_initialized(cls): + with cls._init_lock: + if not cls._lib_loaded: + cls.lib = build_conditional_library(lib, CONDITIONAL_NAMES) + cls._lib_loaded = True + # initialize the SSL library + cls.lib.SSL_library_init() + # adds all ciphers/digests for EVP + cls.lib.OpenSSL_add_all_algorithms() + # loads error strings for libcrypto and libssl functions + cls.lib.SSL_load_error_strings() + cls._register_osrandom_engine() + + @classmethod + def init_static_locks(cls): + with cls._lock_init_lock: + cls._ensure_ffi_initialized() + # Use Python's implementation if available, importing _ssl triggers + # the setup for this. + __import__("_ssl") + + if (not cls.lib.Cryptography_HAS_LOCKING_CALLBACKS or + cls.lib.CRYPTO_get_locking_callback() != cls.ffi.NULL): + return + + # If nothing else has setup a locking callback already, we set up + # our own + res = lib.Cryptography_setup_ssl_threads() + _openssl_assert(cls.lib, res == 1) + + +def _verify_openssl_version(lib): + if ( + lib.CRYPTOGRAPHY_OPENSSL_LESS_THAN_102 and + not lib.CRYPTOGRAPHY_IS_LIBRESSL + ): + warnings.warn( + "OpenSSL version 1.0.1 is no longer supported by the OpenSSL " + "project, please upgrade. The next version of cryptography will " + "drop support for it.", + utils.CryptographyDeprecationWarning + ) + + +def _verify_package_version(version): + # Occasionally we run into situations where the version of the Python + # package does not match the version of the shared object that is loaded. + # This may occur in environments where multiple versions of cryptography + # are installed and available in the python path. To avoid errors cropping + # up later this code checks that the currently imported package and the + # shared object that were loaded have the same version and raise an + # ImportError if they do not + so_package_version = ffi.string(lib.CRYPTOGRAPHY_PACKAGE_VERSION) + if version.encode("ascii") != so_package_version: + raise ImportError( + "The version of cryptography does not match the loaded " + "shared object. This can happen if you have multiple copies of " + "cryptography installed in your Python path. Please try creating " + "a new virtual environment to resolve this issue. " + "Loaded python version: {}, shared object version: {}".format( + version, so_package_version + ) + ) + + +_verify_package_version(cryptography.__version__) + +# OpenSSL is not thread safe until the locks are initialized. We call this +# method in module scope so that it executes with the import lock. On +# Pythons < 3.4 this import lock is a global lock, which can prevent a race +# condition registering the OpenSSL locks. On Python 3.4+ the import lock +# is per module so this approach will not work. +Binding.init_static_locks() + +_verify_openssl_version(Binding.lib) diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/__init__.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/__init__.py new file mode 100644 index 0000000..4b54088 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/__init__.py @@ -0,0 +1,5 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py new file mode 100644 index 0000000..494a7a1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py @@ -0,0 +1,40 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + + +@six.add_metaclass(abc.ABCMeta) +class AsymmetricSignatureContext(object): + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes and returns nothing. + """ + + @abc.abstractmethod + def finalize(self): + """ + Returns the signature as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class AsymmetricVerificationContext(object): + @abc.abstractmethod + def update(self, data): + """ + Processes the provided bytes and returns nothing. + """ + + @abc.abstractmethod + def verify(self): + """ + Raises an exception if the bytes provided to update do not match the + signature or the signature does not match the public key. + """ diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py new file mode 100644 index 0000000..4fc9952 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py @@ -0,0 +1,212 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography import utils + + +def generate_parameters(generator, key_size, backend): + return backend.generate_dh_parameters(generator, key_size) + + +class DHPrivateNumbers(object): + def __init__(self, x, public_numbers): + if not isinstance(x, six.integer_types): + raise TypeError("x must be an integer.") + + if not isinstance(public_numbers, DHPublicNumbers): + raise TypeError("public_numbers must be an instance of " + "DHPublicNumbers.") + + self._x = x + self._public_numbers = public_numbers + + def __eq__(self, other): + if not isinstance(other, DHPrivateNumbers): + return NotImplemented + + return ( + self._x == other._x and + self._public_numbers == other._public_numbers + ) + + def __ne__(self, other): + return not self == other + + def private_key(self, backend): + return backend.load_dh_private_numbers(self) + + public_numbers = utils.read_only_property("_public_numbers") + x = utils.read_only_property("_x") + + +class DHPublicNumbers(object): + def __init__(self, y, parameter_numbers): + if not isinstance(y, six.integer_types): + raise TypeError("y must be an integer.") + + if not isinstance(parameter_numbers, DHParameterNumbers): + raise TypeError( + "parameters must be an instance of DHParameterNumbers.") + + self._y = y + self._parameter_numbers = parameter_numbers + + def __eq__(self, other): + if not isinstance(other, DHPublicNumbers): + return NotImplemented + + return ( + self._y == other._y and + self._parameter_numbers == other._parameter_numbers + ) + + def __ne__(self, other): + return not self == other + + def public_key(self, backend): + return backend.load_dh_public_numbers(self) + + y = utils.read_only_property("_y") + parameter_numbers = utils.read_only_property("_parameter_numbers") + + +class DHParameterNumbers(object): + def __init__(self, p, g, q=None): + if ( + not isinstance(p, six.integer_types) or + not isinstance(g, six.integer_types) + ): + raise TypeError("p and g must be integers") + if q is not None and not isinstance(q, six.integer_types): + raise TypeError("q must be integer or None") + + if g < 2: + raise ValueError("DH generator must be 2 or greater") + + self._p = p + self._g = g + self._q = q + + def __eq__(self, other): + if not isinstance(other, DHParameterNumbers): + return NotImplemented + + return ( + self._p == other._p and + self._g == other._g and + self._q == other._q + ) + + def __ne__(self, other): + return not self == other + + def parameters(self, backend): + return backend.load_dh_parameter_numbers(self) + + p = utils.read_only_property("_p") + g = utils.read_only_property("_g") + q = utils.read_only_property("_q") + + +@six.add_metaclass(abc.ABCMeta) +class DHParameters(object): + @abc.abstractmethod + def generate_private_key(self): + """ + Generates and returns a DHPrivateKey. + """ + + @abc.abstractmethod + def parameter_bytes(self, encoding, format): + """ + Returns the parameters serialized as bytes. + """ + + @abc.abstractmethod + def parameter_numbers(self): + """ + Returns a DHParameterNumbers. + """ + + +DHParametersWithSerialization = DHParameters + + +@six.add_metaclass(abc.ABCMeta) +class DHPrivateKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def public_key(self): + """ + The DHPublicKey associated with this private key. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DHParameters object associated with this private key. + """ + + @abc.abstractmethod + def exchange(self, peer_public_key): + """ + Given peer's DHPublicKey, carry out the key exchange and + return shared key as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DHPrivateKeyWithSerialization(DHPrivateKey): + @abc.abstractmethod + def private_numbers(self): + """ + Returns a DHPrivateNumbers. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + Returns the key serialized as bytes. + """ + + +@six.add_metaclass(abc.ABCMeta) +class DHPublicKey(object): + @abc.abstractproperty + def key_size(self): + """ + The bit length of the prime modulus. + """ + + @abc.abstractmethod + def parameters(self): + """ + The DHParameters object associated with this public key. + """ + + @abc.abstractmethod + def public_numbers(self): + """ + Returns a DHPublicNumbers. + """ + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + Returns the key serialized as bytes. + """ + + +DHPublicKeyWithSerialization = DHPublicKey diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py new file mode 100644 index 0000000..939157a --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py @@ -0,0 +1,79 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +@six.add_metaclass(abc.ABCMeta) +class Ed448PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed448_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding, format): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def verify(self, signature, data): + """ + Verify the signature. + """ + + +@six.add_metaclass(abc.ABCMeta) +class Ed448PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + return backend.ed448_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.ed448_supported(): + raise UnsupportedAlgorithm( + "ed448 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM + ) + + return backend.ed448_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The Ed448PublicKey derived from the private key. + """ + + @abc.abstractmethod + def sign(self, data): + """ + Signs the data. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/utils.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/utils.py new file mode 100644 index 0000000..14d2abe --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/utils.py @@ -0,0 +1,37 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography import utils +from cryptography.hazmat._der import ( + DERReader, INTEGER, SEQUENCE, encode_der, encode_der_integer +) +from cryptography.hazmat.primitives import hashes + + +def decode_dss_signature(signature): + with DERReader(signature).read_single_element(SEQUENCE) as seq: + r = seq.read_element(INTEGER).as_integer() + s = seq.read_element(INTEGER).as_integer() + return r, s + + +def encode_dss_signature(r, s): + return encode_der( + SEQUENCE, + encode_der(INTEGER, encode_der_integer(r)), + encode_der(INTEGER, encode_der_integer(s)), + ) + + +class Prehashed(object): + def __init__(self, algorithm): + if not isinstance(algorithm, hashes.HashAlgorithm): + raise TypeError("Expected instance of HashAlgorithm.") + + self._algorithm = algorithm + self._digest_size = algorithm.digest_size + + digest_size = utils.read_only_property("_digest_size") diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py new file mode 100644 index 0000000..4e8badf --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py @@ -0,0 +1,73 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc + +import six + +from cryptography.exceptions import UnsupportedAlgorithm, _Reasons + + +@six.add_metaclass(abc.ABCMeta) +class X25519PublicKey(object): + @classmethod + def from_public_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x25519_load_public_bytes(data) + + @abc.abstractmethod + def public_bytes(self, encoding=None, format=None): + """ + The serialized bytes of the public key. + """ + + +@six.add_metaclass(abc.ABCMeta) +class X25519PrivateKey(object): + @classmethod + def generate(cls): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + return backend.x25519_generate_key() + + @classmethod + def from_private_bytes(cls, data): + from cryptography.hazmat.backends.openssl.backend import backend + if not backend.x25519_supported(): + raise UnsupportedAlgorithm( + "X25519 is not supported by this version of OpenSSL.", + _Reasons.UNSUPPORTED_EXCHANGE_ALGORITHM + ) + + return backend.x25519_load_private_bytes(data) + + @abc.abstractmethod + def public_key(self): + """ + The serialized bytes of the public key. + """ + + @abc.abstractmethod + def private_bytes(self, encoding, format, encryption_algorithm): + """ + The serialized bytes of the private key. + """ + + @abc.abstractmethod + def exchange(self, peer_public_key): + """ + Performs a key exchange operation using the provided peer's public key. + """ diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py new file mode 100644 index 0000000..171b1c6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat.primitives.ciphers.base import ( + AEADCipherContext, AEADDecryptionContext, AEADEncryptionContext, + BlockCipherAlgorithm, Cipher, CipherAlgorithm, CipherContext +) + + +__all__ = [ + "Cipher", + "CipherAlgorithm", + "BlockCipherAlgorithm", + "CipherContext", + "AEADCipherContext", + "AEADDecryptionContext", + "AEADEncryptionContext", +] diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py new file mode 100644 index 0000000..01f0f28 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py @@ -0,0 +1,110 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import six + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time, hmac +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +@utils.register_interface(KeyDerivationFunction) +class HKDF(object): + def __init__(self, algorithm, length, salt, info, backend): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._algorithm = algorithm + + if salt is None: + salt = b"\x00" * self._algorithm.digest_size + else: + utils._check_bytes("salt", salt) + + self._salt = salt + + self._backend = backend + + self._hkdf_expand = HKDFExpand(self._algorithm, length, info, backend) + + def _extract(self, key_material): + h = hmac.HMAC(self._salt, self._algorithm, backend=self._backend) + h.update(key_material) + return h.finalize() + + def derive(self, key_material): + utils._check_byteslike("key_material", key_material) + return self._hkdf_expand.derive(self._extract(key_material)) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey + + +@utils.register_interface(KeyDerivationFunction) +class HKDFExpand(object): + def __init__(self, algorithm, length, info, backend): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._algorithm = algorithm + + self._backend = backend + + max_length = 255 * algorithm.digest_size + + if length > max_length: + raise ValueError( + "Can not derive keys larger than {} octets.".format( + max_length + )) + + self._length = length + + if info is None: + info = b"" + else: + utils._check_bytes("info", info) + + self._info = info + + self._used = False + + def _expand(self, key_material): + output = [b""] + counter = 1 + + while self._algorithm.digest_size * (len(output) - 1) < self._length: + h = hmac.HMAC(key_material, self._algorithm, backend=self._backend) + h.update(output[-1]) + h.update(self._info) + h.update(six.int2byte(counter)) + output.append(h.finalize()) + counter += 1 + + return b"".join(output)[:self._length] + + def derive(self, key_material): + utils._check_byteslike("key_material", key_material) + if self._used: + raise AlreadyFinalized + + self._used = True + return self._expand(key_material) + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/scrypt.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/scrypt.py new file mode 100644 index 0000000..df9745e --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/scrypt.py @@ -0,0 +1,63 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import sys + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import ScryptBackend +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +# This is used by the scrypt tests to skip tests that require more memory +# than the MEM_LIMIT +_MEM_LIMIT = sys.maxsize // 2 + + +@utils.register_interface(KeyDerivationFunction) +class Scrypt(object): + def __init__(self, salt, length, n, r, p, backend): + if not isinstance(backend, ScryptBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement ScryptBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._length = length + utils._check_bytes("salt", salt) + if n < 2 or (n & (n - 1)) != 0: + raise ValueError("n must be greater than 1 and be a power of 2.") + + if r < 1: + raise ValueError("r must be greater than or equal to 1.") + + if p < 1: + raise ValueError("p must be greater than or equal to 1.") + + self._used = False + self._salt = salt + self._n = n + self._r = r + self._p = p + self._backend = backend + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized("Scrypt instances can only be used once.") + self._used = True + + utils._check_byteslike("key_material", key_material) + return self._backend.derive_scrypt( + key_material, self._salt, self._length, self._n, self._r, self._p + ) + + def verify(self, key_material, expected_key): + derived_key = self.derive(key_material) + if not constant_time.bytes_eq(derived_key, expected_key): + raise InvalidKey("Keys do not match.") diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py new file mode 100644 index 0000000..9eb50b0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import struct + +from cryptography import utils +from cryptography.exceptions import ( + AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HashBackend +from cryptography.hazmat.primitives import constant_time, hashes +from cryptography.hazmat.primitives.kdf import KeyDerivationFunction + + +def _int_to_u32be(n): + return struct.pack('>I', n) + + +@utils.register_interface(KeyDerivationFunction) +class X963KDF(object): + def __init__(self, algorithm, length, sharedinfo, backend): + + max_len = algorithm.digest_size * (2 ** 32 - 1) + if length > max_len: + raise ValueError( + "Can not derive keys larger than {} bits.".format(max_len)) + if sharedinfo is not None: + utils._check_bytes("sharedinfo", sharedinfo) + + self._algorithm = algorithm + self._length = length + self._sharedinfo = sharedinfo + + if not isinstance(backend, HashBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HashBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + self._backend = backend + self._used = False + + def derive(self, key_material): + if self._used: + raise AlreadyFinalized + self._used = True + utils._check_byteslike("key_material", key_material) + output = [b""] + outlen = 0 + counter = 1 + + while self._length > outlen: + h = hashes.Hash(self._algorithm, self._backend) + h.update(key_material) + h.update(_int_to_u32be(counter)) + if self._sharedinfo is not None: + h.update(self._sharedinfo) + output.append(h.finalize()) + outlen += len(output[-1]) + counter += 1 + + return b"".join(output)[:self._length] + + def verify(self, key_material, expected_key): + if not constant_time.bytes_eq(self.derive(key_material), expected_key): + raise InvalidKey diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/__init__.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/__init__.py new file mode 100644 index 0000000..f6d4ce9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/__init__.py @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat.primitives.serialization.base import ( + BestAvailableEncryption, Encoding, KeySerializationEncryption, + NoEncryption, ParameterFormat, PrivateFormat, PublicFormat, + load_der_parameters, load_der_private_key, load_der_public_key, + load_pem_parameters, load_pem_private_key, load_pem_public_key, +) +from cryptography.hazmat.primitives.serialization.ssh import ( + load_ssh_public_key +) + + +_PEM_DER = (Encoding.PEM, Encoding.DER) + +__all__ = [ + "load_der_parameters", "load_der_private_key", "load_der_public_key", + "load_pem_parameters", "load_pem_private_key", "load_pem_public_key", + "load_ssh_public_key", "Encoding", "PrivateFormat", "PublicFormat", + "ParameterFormat", "KeySerializationEncryption", "BestAvailableEncryption", + "NoEncryption", +] diff --git a/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/twofactor/totp.py b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/twofactor/totp.py new file mode 100644 index 0000000..499f282 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/hazmat/primitives/twofactor/totp.py @@ -0,0 +1,40 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.exceptions import ( + UnsupportedAlgorithm, _Reasons +) +from cryptography.hazmat.backends.interfaces import HMACBackend +from cryptography.hazmat.primitives import constant_time +from cryptography.hazmat.primitives.twofactor import InvalidToken +from cryptography.hazmat.primitives.twofactor.hotp import HOTP +from cryptography.hazmat.primitives.twofactor.utils import _generate_uri + + +class TOTP(object): + def __init__(self, key, length, algorithm, time_step, backend, + enforce_key_length=True): + if not isinstance(backend, HMACBackend): + raise UnsupportedAlgorithm( + "Backend object does not implement HMACBackend.", + _Reasons.BACKEND_MISSING_INTERFACE + ) + + self._time_step = time_step + self._hotp = HOTP(key, length, algorithm, backend, enforce_key_length) + + def generate(self, time): + counter = int(time / self._time_step) + return self._hotp.generate(counter) + + def verify(self, totp, time): + if not constant_time.bytes_eq(self.generate(time), totp): + raise InvalidToken("Supplied TOTP value does not match.") + + def get_provisioning_uri(self, account_name, issuer): + return _generate_uri(self._hotp, "totp", account_name, issuer, [ + ("period", int(self._time_step)), + ]) diff --git a/venv/lib/python3.7/site-packages/cryptography/utils.py b/venv/lib/python3.7/site-packages/cryptography/utils.py new file mode 100644 index 0000000..0b36f63 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/utils.py @@ -0,0 +1,173 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import binascii +import inspect +import sys +import warnings + + +# We use a UserWarning subclass, instead of DeprecationWarning, because CPython +# decided deprecation warnings should be invisble by default. +class CryptographyDeprecationWarning(UserWarning): + pass + + +# Several APIs were deprecated with no specific end-of-life date because of the +# ubiquity of their use. They should not be removed until we agree on when that +# cycle ends. +PersistentlyDeprecated2017 = CryptographyDeprecationWarning +PersistentlyDeprecated2018 = CryptographyDeprecationWarning +DeprecatedIn25 = CryptographyDeprecationWarning +DeprecatedIn27 = CryptographyDeprecationWarning + + +def _check_bytes(name, value): + if not isinstance(value, bytes): + raise TypeError("{} must be bytes".format(name)) + + +def _check_byteslike(name, value): + try: + memoryview(value) + except TypeError: + raise TypeError("{} must be bytes-like".format(name)) + + +def read_only_property(name): + return property(lambda self: getattr(self, name)) + + +def register_interface(iface): + def register_decorator(klass): + verify_interface(iface, klass) + iface.register(klass) + return klass + return register_decorator + + +def register_interface_if(predicate, iface): + def register_decorator(klass): + if predicate: + verify_interface(iface, klass) + iface.register(klass) + return klass + return register_decorator + + +if hasattr(int, "from_bytes"): + int_from_bytes = int.from_bytes +else: + def int_from_bytes(data, byteorder, signed=False): + assert byteorder == 'big' + assert not signed + + return int(binascii.hexlify(data), 16) + + +if hasattr(int, "to_bytes"): + def int_to_bytes(integer, length=None): + return integer.to_bytes( + length or (integer.bit_length() + 7) // 8 or 1, 'big' + ) +else: + def int_to_bytes(integer, length=None): + hex_string = '%x' % integer + if length is None: + n = len(hex_string) + else: + n = length * 2 + return binascii.unhexlify(hex_string.zfill(n + (n & 1))) + + +class InterfaceNotImplemented(Exception): + pass + + +if hasattr(inspect, "signature"): + signature = inspect.signature +else: + signature = inspect.getargspec + + +def verify_interface(iface, klass): + for method in iface.__abstractmethods__: + if not hasattr(klass, method): + raise InterfaceNotImplemented( + "{} is missing a {!r} method".format(klass, method) + ) + if isinstance(getattr(iface, method), abc.abstractproperty): + # Can't properly verify these yet. + continue + sig = signature(getattr(iface, method)) + actual = signature(getattr(klass, method)) + if sig != actual: + raise InterfaceNotImplemented( + "{}.{}'s signature differs from the expected. Expected: " + "{!r}. Received: {!r}".format( + klass, method, sig, actual + ) + ) + + +# No longer needed as of 2.2, but retained because we have external consumers +# who use it. +def bit_length(x): + return x.bit_length() + + +class _DeprecatedValue(object): + def __init__(self, value, message, warning_class): + self.value = value + self.message = message + self.warning_class = warning_class + + +class _ModuleWithDeprecations(object): + def __init__(self, module): + self.__dict__["_module"] = module + + def __getattr__(self, attr): + obj = getattr(self._module, attr) + if isinstance(obj, _DeprecatedValue): + warnings.warn(obj.message, obj.warning_class, stacklevel=2) + obj = obj.value + return obj + + def __setattr__(self, attr, value): + setattr(self._module, attr, value) + + def __delattr__(self, attr): + obj = getattr(self._module, attr) + if isinstance(obj, _DeprecatedValue): + warnings.warn(obj.message, obj.warning_class, stacklevel=2) + + delattr(self._module, attr) + + def __dir__(self): + return ["_module"] + dir(self._module) + + +def deprecated(value, module_name, message, warning_class): + module = sys.modules[module_name] + if not isinstance(module, _ModuleWithDeprecations): + sys.modules[module_name] = _ModuleWithDeprecations(module) + return _DeprecatedValue(value, message, warning_class) + + +def cached_property(func): + cached_name = "_cached_{}".format(func) + sentinel = object() + + def inner(instance): + cache = getattr(instance, cached_name, sentinel) + if cache is not sentinel: + return cache + result = func(instance) + setattr(instance, cached_name, result) + return result + return property(inner) diff --git a/venv/lib/python3.7/site-packages/cryptography/x509/__init__.py b/venv/lib/python3.7/site-packages/cryptography/x509/__init__.py new file mode 100644 index 0000000..b761e26 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/x509/__init__.py @@ -0,0 +1,189 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.x509 import certificate_transparency +from cryptography.x509.base import ( + Certificate, CertificateBuilder, CertificateRevocationList, + CertificateRevocationListBuilder, + CertificateSigningRequest, CertificateSigningRequestBuilder, + InvalidVersion, RevokedCertificate, RevokedCertificateBuilder, + Version, load_der_x509_certificate, load_der_x509_crl, load_der_x509_csr, + load_pem_x509_certificate, load_pem_x509_crl, load_pem_x509_csr, + random_serial_number, +) +from cryptography.x509.extensions import ( + AccessDescription, AuthorityInformationAccess, + AuthorityKeyIdentifier, BasicConstraints, CRLDistributionPoints, + CRLNumber, CRLReason, CertificateIssuer, CertificatePolicies, + DeltaCRLIndicator, DistributionPoint, DuplicateExtension, ExtendedKeyUsage, + Extension, ExtensionNotFound, ExtensionType, Extensions, FreshestCRL, + GeneralNames, InhibitAnyPolicy, InvalidityDate, IssuerAlternativeName, + IssuingDistributionPoint, KeyUsage, NameConstraints, NoticeReference, + OCSPNoCheck, OCSPNonce, PolicyConstraints, PolicyInformation, + PrecertPoison, PrecertificateSignedCertificateTimestamps, ReasonFlags, + SubjectAlternativeName, SubjectKeyIdentifier, TLSFeature, TLSFeatureType, + UnrecognizedExtension, UserNotice +) +from cryptography.x509.general_name import ( + DNSName, DirectoryName, GeneralName, IPAddress, OtherName, RFC822Name, + RegisteredID, UniformResourceIdentifier, UnsupportedGeneralNameType, + _GENERAL_NAMES +) +from cryptography.x509.name import ( + Name, NameAttribute, RelativeDistinguishedName +) +from cryptography.x509.oid import ( + AuthorityInformationAccessOID, CRLEntryExtensionOID, + CertificatePoliciesOID, ExtendedKeyUsageOID, ExtensionOID, NameOID, + ObjectIdentifier, SignatureAlgorithmOID, _SIG_OIDS_TO_HASH +) + + +OID_AUTHORITY_INFORMATION_ACCESS = ExtensionOID.AUTHORITY_INFORMATION_ACCESS +OID_AUTHORITY_KEY_IDENTIFIER = ExtensionOID.AUTHORITY_KEY_IDENTIFIER +OID_BASIC_CONSTRAINTS = ExtensionOID.BASIC_CONSTRAINTS +OID_CERTIFICATE_POLICIES = ExtensionOID.CERTIFICATE_POLICIES +OID_CRL_DISTRIBUTION_POINTS = ExtensionOID.CRL_DISTRIBUTION_POINTS +OID_EXTENDED_KEY_USAGE = ExtensionOID.EXTENDED_KEY_USAGE +OID_FRESHEST_CRL = ExtensionOID.FRESHEST_CRL +OID_INHIBIT_ANY_POLICY = ExtensionOID.INHIBIT_ANY_POLICY +OID_ISSUER_ALTERNATIVE_NAME = ExtensionOID.ISSUER_ALTERNATIVE_NAME +OID_KEY_USAGE = ExtensionOID.KEY_USAGE +OID_NAME_CONSTRAINTS = ExtensionOID.NAME_CONSTRAINTS +OID_OCSP_NO_CHECK = ExtensionOID.OCSP_NO_CHECK +OID_POLICY_CONSTRAINTS = ExtensionOID.POLICY_CONSTRAINTS +OID_POLICY_MAPPINGS = ExtensionOID.POLICY_MAPPINGS +OID_SUBJECT_ALTERNATIVE_NAME = ExtensionOID.SUBJECT_ALTERNATIVE_NAME +OID_SUBJECT_DIRECTORY_ATTRIBUTES = ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES +OID_SUBJECT_INFORMATION_ACCESS = ExtensionOID.SUBJECT_INFORMATION_ACCESS +OID_SUBJECT_KEY_IDENTIFIER = ExtensionOID.SUBJECT_KEY_IDENTIFIER + +OID_DSA_WITH_SHA1 = SignatureAlgorithmOID.DSA_WITH_SHA1 +OID_DSA_WITH_SHA224 = SignatureAlgorithmOID.DSA_WITH_SHA224 +OID_DSA_WITH_SHA256 = SignatureAlgorithmOID.DSA_WITH_SHA256 +OID_ECDSA_WITH_SHA1 = SignatureAlgorithmOID.ECDSA_WITH_SHA1 +OID_ECDSA_WITH_SHA224 = SignatureAlgorithmOID.ECDSA_WITH_SHA224 +OID_ECDSA_WITH_SHA256 = SignatureAlgorithmOID.ECDSA_WITH_SHA256 +OID_ECDSA_WITH_SHA384 = SignatureAlgorithmOID.ECDSA_WITH_SHA384 +OID_ECDSA_WITH_SHA512 = SignatureAlgorithmOID.ECDSA_WITH_SHA512 +OID_RSA_WITH_MD5 = SignatureAlgorithmOID.RSA_WITH_MD5 +OID_RSA_WITH_SHA1 = SignatureAlgorithmOID.RSA_WITH_SHA1 +OID_RSA_WITH_SHA224 = SignatureAlgorithmOID.RSA_WITH_SHA224 +OID_RSA_WITH_SHA256 = SignatureAlgorithmOID.RSA_WITH_SHA256 +OID_RSA_WITH_SHA384 = SignatureAlgorithmOID.RSA_WITH_SHA384 +OID_RSA_WITH_SHA512 = SignatureAlgorithmOID.RSA_WITH_SHA512 +OID_RSASSA_PSS = SignatureAlgorithmOID.RSASSA_PSS + +OID_COMMON_NAME = NameOID.COMMON_NAME +OID_COUNTRY_NAME = NameOID.COUNTRY_NAME +OID_DOMAIN_COMPONENT = NameOID.DOMAIN_COMPONENT +OID_DN_QUALIFIER = NameOID.DN_QUALIFIER +OID_EMAIL_ADDRESS = NameOID.EMAIL_ADDRESS +OID_GENERATION_QUALIFIER = NameOID.GENERATION_QUALIFIER +OID_GIVEN_NAME = NameOID.GIVEN_NAME +OID_LOCALITY_NAME = NameOID.LOCALITY_NAME +OID_ORGANIZATIONAL_UNIT_NAME = NameOID.ORGANIZATIONAL_UNIT_NAME +OID_ORGANIZATION_NAME = NameOID.ORGANIZATION_NAME +OID_PSEUDONYM = NameOID.PSEUDONYM +OID_SERIAL_NUMBER = NameOID.SERIAL_NUMBER +OID_STATE_OR_PROVINCE_NAME = NameOID.STATE_OR_PROVINCE_NAME +OID_SURNAME = NameOID.SURNAME +OID_TITLE = NameOID.TITLE + +OID_CLIENT_AUTH = ExtendedKeyUsageOID.CLIENT_AUTH +OID_CODE_SIGNING = ExtendedKeyUsageOID.CODE_SIGNING +OID_EMAIL_PROTECTION = ExtendedKeyUsageOID.EMAIL_PROTECTION +OID_OCSP_SIGNING = ExtendedKeyUsageOID.OCSP_SIGNING +OID_SERVER_AUTH = ExtendedKeyUsageOID.SERVER_AUTH +OID_TIME_STAMPING = ExtendedKeyUsageOID.TIME_STAMPING + +OID_ANY_POLICY = CertificatePoliciesOID.ANY_POLICY +OID_CPS_QUALIFIER = CertificatePoliciesOID.CPS_QUALIFIER +OID_CPS_USER_NOTICE = CertificatePoliciesOID.CPS_USER_NOTICE + +OID_CERTIFICATE_ISSUER = CRLEntryExtensionOID.CERTIFICATE_ISSUER +OID_CRL_REASON = CRLEntryExtensionOID.CRL_REASON +OID_INVALIDITY_DATE = CRLEntryExtensionOID.INVALIDITY_DATE + +OID_CA_ISSUERS = AuthorityInformationAccessOID.CA_ISSUERS +OID_OCSP = AuthorityInformationAccessOID.OCSP + +__all__ = [ + "certificate_transparency", + "load_pem_x509_certificate", + "load_der_x509_certificate", + "load_pem_x509_csr", + "load_der_x509_csr", + "load_pem_x509_crl", + "load_der_x509_crl", + "random_serial_number", + "InvalidVersion", + "DeltaCRLIndicator", + "DuplicateExtension", + "ExtensionNotFound", + "UnsupportedGeneralNameType", + "NameAttribute", + "Name", + "RelativeDistinguishedName", + "ObjectIdentifier", + "ExtensionType", + "Extensions", + "Extension", + "ExtendedKeyUsage", + "FreshestCRL", + "IssuingDistributionPoint", + "TLSFeature", + "TLSFeatureType", + "OCSPNoCheck", + "BasicConstraints", + "CRLNumber", + "KeyUsage", + "AuthorityInformationAccess", + "AccessDescription", + "CertificatePolicies", + "PolicyInformation", + "UserNotice", + "NoticeReference", + "SubjectKeyIdentifier", + "NameConstraints", + "CRLDistributionPoints", + "DistributionPoint", + "ReasonFlags", + "InhibitAnyPolicy", + "SubjectAlternativeName", + "IssuerAlternativeName", + "AuthorityKeyIdentifier", + "GeneralNames", + "GeneralName", + "RFC822Name", + "DNSName", + "UniformResourceIdentifier", + "RegisteredID", + "DirectoryName", + "IPAddress", + "OtherName", + "Certificate", + "CertificateRevocationList", + "CertificateRevocationListBuilder", + "CertificateSigningRequest", + "RevokedCertificate", + "RevokedCertificateBuilder", + "CertificateSigningRequestBuilder", + "CertificateBuilder", + "Version", + "_SIG_OIDS_TO_HASH", + "OID_CA_ISSUERS", + "OID_OCSP", + "_GENERAL_NAMES", + "CertificateIssuer", + "CRLReason", + "InvalidityDate", + "UnrecognizedExtension", + "PolicyConstraints", + "PrecertificateSignedCertificateTimestamps", + "PrecertPoison", + "OCSPNonce", +] diff --git a/venv/lib/python3.7/site-packages/cryptography/x509/extensions.py b/venv/lib/python3.7/site-packages/cryptography/x509/extensions.py new file mode 100644 index 0000000..f60075a --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/x509/extensions.py @@ -0,0 +1,1609 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +import abc +import datetime +import hashlib +import ipaddress +import warnings +from enum import Enum + +import six + +from cryptography import utils +from cryptography.hazmat._der import ( + BIT_STRING, DERReader, OBJECT_IDENTIFIER, SEQUENCE +) +from cryptography.hazmat.primitives import constant_time, serialization +from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey +from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey +from cryptography.x509.certificate_transparency import ( + SignedCertificateTimestamp +) +from cryptography.x509.general_name import GeneralName, IPAddress, OtherName +from cryptography.x509.name import RelativeDistinguishedName +from cryptography.x509.oid import ( + CRLEntryExtensionOID, ExtensionOID, OCSPExtensionOID, ObjectIdentifier, +) + + +def _key_identifier_from_public_key(public_key): + if isinstance(public_key, RSAPublicKey): + data = public_key.public_bytes( + serialization.Encoding.DER, + serialization.PublicFormat.PKCS1, + ) + elif isinstance(public_key, EllipticCurvePublicKey): + data = public_key.public_bytes( + serialization.Encoding.X962, + serialization.PublicFormat.UncompressedPoint + ) + else: + # This is a very slow way to do this. + serialized = public_key.public_bytes( + serialization.Encoding.DER, + serialization.PublicFormat.SubjectPublicKeyInfo + ) + + reader = DERReader(serialized) + with reader.read_single_element(SEQUENCE) as public_key_info: + algorithm = public_key_info.read_element(SEQUENCE) + public_key = public_key_info.read_element(BIT_STRING) + + # Double-check the algorithm structure. + with algorithm: + algorithm.read_element(OBJECT_IDENTIFIER) + if not algorithm.is_empty(): + # Skip the optional parameters field. + algorithm.read_any_element() + + # BIT STRING contents begin with the number of padding bytes added. It + # must be zero for SubjectPublicKeyInfo structures. + if public_key.read_byte() != 0: + raise ValueError('Invalid public key encoding') + + data = public_key.data + + return hashlib.sha1(data).digest() + + +def _make_sequence_methods(field_name): + def len_method(self): + return len(getattr(self, field_name)) + + def iter_method(self): + return iter(getattr(self, field_name)) + + def getitem_method(self, idx): + return getattr(self, field_name)[idx] + + return len_method, iter_method, getitem_method + + +class DuplicateExtension(Exception): + def __init__(self, msg, oid): + super(DuplicateExtension, self).__init__(msg) + self.oid = oid + + +class ExtensionNotFound(Exception): + def __init__(self, msg, oid): + super(ExtensionNotFound, self).__init__(msg) + self.oid = oid + + +@six.add_metaclass(abc.ABCMeta) +class ExtensionType(object): + @abc.abstractproperty + def oid(self): + """ + Returns the oid associated with the given extension type. + """ + + +class Extensions(object): + def __init__(self, extensions): + self._extensions = extensions + + def get_extension_for_oid(self, oid): + for ext in self: + if ext.oid == oid: + return ext + + raise ExtensionNotFound("No {} extension was found".format(oid), oid) + + def get_extension_for_class(self, extclass): + if extclass is UnrecognizedExtension: + raise TypeError( + "UnrecognizedExtension can't be used with " + "get_extension_for_class because more than one instance of the" + " class may be present." + ) + + for ext in self: + if isinstance(ext.value, extclass): + return ext + + raise ExtensionNotFound( + "No {} extension was found".format(extclass), extclass.oid + ) + + __len__, __iter__, __getitem__ = _make_sequence_methods("_extensions") + + def __repr__(self): + return ( + "".format(self._extensions) + ) + + +@utils.register_interface(ExtensionType) +class CRLNumber(object): + oid = ExtensionOID.CRL_NUMBER + + def __init__(self, crl_number): + if not isinstance(crl_number, six.integer_types): + raise TypeError("crl_number must be an integer") + + self._crl_number = crl_number + + def __eq__(self, other): + if not isinstance(other, CRLNumber): + return NotImplemented + + return self.crl_number == other.crl_number + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.crl_number) + + def __repr__(self): + return "".format(self.crl_number) + + crl_number = utils.read_only_property("_crl_number") + + +@utils.register_interface(ExtensionType) +class AuthorityKeyIdentifier(object): + oid = ExtensionOID.AUTHORITY_KEY_IDENTIFIER + + def __init__(self, key_identifier, authority_cert_issuer, + authority_cert_serial_number): + if (authority_cert_issuer is None) != ( + authority_cert_serial_number is None + ): + raise ValueError( + "authority_cert_issuer and authority_cert_serial_number " + "must both be present or both None" + ) + + if authority_cert_issuer is not None: + authority_cert_issuer = list(authority_cert_issuer) + if not all( + isinstance(x, GeneralName) for x in authority_cert_issuer + ): + raise TypeError( + "authority_cert_issuer must be a list of GeneralName " + "objects" + ) + + if authority_cert_serial_number is not None and not isinstance( + authority_cert_serial_number, six.integer_types + ): + raise TypeError( + "authority_cert_serial_number must be an integer" + ) + + self._key_identifier = key_identifier + self._authority_cert_issuer = authority_cert_issuer + self._authority_cert_serial_number = authority_cert_serial_number + + @classmethod + def from_issuer_public_key(cls, public_key): + digest = _key_identifier_from_public_key(public_key) + return cls( + key_identifier=digest, + authority_cert_issuer=None, + authority_cert_serial_number=None + ) + + @classmethod + def from_issuer_subject_key_identifier(cls, ski): + if isinstance(ski, SubjectKeyIdentifier): + digest = ski.digest + else: + digest = ski.value.digest + warnings.warn( + "Extension objects are deprecated as arguments to " + "from_issuer_subject_key_identifier and support will be " + "removed soon. Please migrate to passing a " + "SubjectKeyIdentifier directly.", + utils.DeprecatedIn27, + stacklevel=2, + ) + + return cls( + key_identifier=digest, + authority_cert_issuer=None, + authority_cert_serial_number=None + ) + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, AuthorityKeyIdentifier): + return NotImplemented + + return ( + self.key_identifier == other.key_identifier and + self.authority_cert_issuer == other.authority_cert_issuer and + self.authority_cert_serial_number == + other.authority_cert_serial_number + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.authority_cert_issuer is None: + aci = None + else: + aci = tuple(self.authority_cert_issuer) + return hash(( + self.key_identifier, aci, self.authority_cert_serial_number + )) + + key_identifier = utils.read_only_property("_key_identifier") + authority_cert_issuer = utils.read_only_property("_authority_cert_issuer") + authority_cert_serial_number = utils.read_only_property( + "_authority_cert_serial_number" + ) + + +@utils.register_interface(ExtensionType) +class SubjectKeyIdentifier(object): + oid = ExtensionOID.SUBJECT_KEY_IDENTIFIER + + def __init__(self, digest): + self._digest = digest + + @classmethod + def from_public_key(cls, public_key): + return cls(_key_identifier_from_public_key(public_key)) + + digest = utils.read_only_property("_digest") + + def __repr__(self): + return "".format(self.digest) + + def __eq__(self, other): + if not isinstance(other, SubjectKeyIdentifier): + return NotImplemented + + return constant_time.bytes_eq(self.digest, other.digest) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.digest) + + +@utils.register_interface(ExtensionType) +class AuthorityInformationAccess(object): + oid = ExtensionOID.AUTHORITY_INFORMATION_ACCESS + + def __init__(self, descriptions): + descriptions = list(descriptions) + if not all(isinstance(x, AccessDescription) for x in descriptions): + raise TypeError( + "Every item in the descriptions list must be an " + "AccessDescription" + ) + + self._descriptions = descriptions + + __len__, __iter__, __getitem__ = _make_sequence_methods("_descriptions") + + def __repr__(self): + return "".format(self._descriptions) + + def __eq__(self, other): + if not isinstance(other, AuthorityInformationAccess): + return NotImplemented + + return self._descriptions == other._descriptions + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._descriptions)) + + +class AccessDescription(object): + def __init__(self, access_method, access_location): + if not isinstance(access_method, ObjectIdentifier): + raise TypeError("access_method must be an ObjectIdentifier") + + if not isinstance(access_location, GeneralName): + raise TypeError("access_location must be a GeneralName") + + self._access_method = access_method + self._access_location = access_location + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, AccessDescription): + return NotImplemented + + return ( + self.access_method == other.access_method and + self.access_location == other.access_location + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.access_method, self.access_location)) + + access_method = utils.read_only_property("_access_method") + access_location = utils.read_only_property("_access_location") + + +@utils.register_interface(ExtensionType) +class BasicConstraints(object): + oid = ExtensionOID.BASIC_CONSTRAINTS + + def __init__(self, ca, path_length): + if not isinstance(ca, bool): + raise TypeError("ca must be a boolean value") + + if path_length is not None and not ca: + raise ValueError("path_length must be None when ca is False") + + if ( + path_length is not None and + (not isinstance(path_length, six.integer_types) or path_length < 0) + ): + raise TypeError( + "path_length must be a non-negative integer or None" + ) + + self._ca = ca + self._path_length = path_length + + ca = utils.read_only_property("_ca") + path_length = utils.read_only_property("_path_length") + + def __repr__(self): + return ("").format(self) + + def __eq__(self, other): + if not isinstance(other, BasicConstraints): + return NotImplemented + + return self.ca == other.ca and self.path_length == other.path_length + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.ca, self.path_length)) + + +@utils.register_interface(ExtensionType) +class DeltaCRLIndicator(object): + oid = ExtensionOID.DELTA_CRL_INDICATOR + + def __init__(self, crl_number): + if not isinstance(crl_number, six.integer_types): + raise TypeError("crl_number must be an integer") + + self._crl_number = crl_number + + crl_number = utils.read_only_property("_crl_number") + + def __eq__(self, other): + if not isinstance(other, DeltaCRLIndicator): + return NotImplemented + + return self.crl_number == other.crl_number + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.crl_number) + + def __repr__(self): + return "".format(self) + + +@utils.register_interface(ExtensionType) +class CRLDistributionPoints(object): + oid = ExtensionOID.CRL_DISTRIBUTION_POINTS + + def __init__(self, distribution_points): + distribution_points = list(distribution_points) + if not all( + isinstance(x, DistributionPoint) for x in distribution_points + ): + raise TypeError( + "distribution_points must be a list of DistributionPoint " + "objects" + ) + + self._distribution_points = distribution_points + + __len__, __iter__, __getitem__ = _make_sequence_methods( + "_distribution_points" + ) + + def __repr__(self): + return "".format(self._distribution_points) + + def __eq__(self, other): + if not isinstance(other, CRLDistributionPoints): + return NotImplemented + + return self._distribution_points == other._distribution_points + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._distribution_points)) + + +@utils.register_interface(ExtensionType) +class FreshestCRL(object): + oid = ExtensionOID.FRESHEST_CRL + + def __init__(self, distribution_points): + distribution_points = list(distribution_points) + if not all( + isinstance(x, DistributionPoint) for x in distribution_points + ): + raise TypeError( + "distribution_points must be a list of DistributionPoint " + "objects" + ) + + self._distribution_points = distribution_points + + __len__, __iter__, __getitem__ = _make_sequence_methods( + "_distribution_points" + ) + + def __repr__(self): + return "".format(self._distribution_points) + + def __eq__(self, other): + if not isinstance(other, FreshestCRL): + return NotImplemented + + return self._distribution_points == other._distribution_points + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._distribution_points)) + + +class DistributionPoint(object): + def __init__(self, full_name, relative_name, reasons, crl_issuer): + if full_name and relative_name: + raise ValueError( + "You cannot provide both full_name and relative_name, at " + "least one must be None." + ) + + if full_name: + full_name = list(full_name) + if not all(isinstance(x, GeneralName) for x in full_name): + raise TypeError( + "full_name must be a list of GeneralName objects" + ) + + if relative_name: + if not isinstance(relative_name, RelativeDistinguishedName): + raise TypeError( + "relative_name must be a RelativeDistinguishedName" + ) + + if crl_issuer: + crl_issuer = list(crl_issuer) + if not all(isinstance(x, GeneralName) for x in crl_issuer): + raise TypeError( + "crl_issuer must be None or a list of general names" + ) + + if reasons and (not isinstance(reasons, frozenset) or not all( + isinstance(x, ReasonFlags) for x in reasons + )): + raise TypeError("reasons must be None or frozenset of ReasonFlags") + + if reasons and ( + ReasonFlags.unspecified in reasons or + ReasonFlags.remove_from_crl in reasons + ): + raise ValueError( + "unspecified and remove_from_crl are not valid reasons in a " + "DistributionPoint" + ) + + if reasons and not crl_issuer and not (full_name or relative_name): + raise ValueError( + "You must supply crl_issuer, full_name, or relative_name when " + "reasons is not None" + ) + + self._full_name = full_name + self._relative_name = relative_name + self._reasons = reasons + self._crl_issuer = crl_issuer + + def __repr__(self): + return ( + "" + .format(self) + ) + + def __eq__(self, other): + if not isinstance(other, DistributionPoint): + return NotImplemented + + return ( + self.full_name == other.full_name and + self.relative_name == other.relative_name and + self.reasons == other.reasons and + self.crl_issuer == other.crl_issuer + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.full_name is not None: + fn = tuple(self.full_name) + else: + fn = None + + if self.crl_issuer is not None: + crl_issuer = tuple(self.crl_issuer) + else: + crl_issuer = None + + return hash((fn, self.relative_name, self.reasons, crl_issuer)) + + full_name = utils.read_only_property("_full_name") + relative_name = utils.read_only_property("_relative_name") + reasons = utils.read_only_property("_reasons") + crl_issuer = utils.read_only_property("_crl_issuer") + + +class ReasonFlags(Enum): + unspecified = "unspecified" + key_compromise = "keyCompromise" + ca_compromise = "cACompromise" + affiliation_changed = "affiliationChanged" + superseded = "superseded" + cessation_of_operation = "cessationOfOperation" + certificate_hold = "certificateHold" + privilege_withdrawn = "privilegeWithdrawn" + aa_compromise = "aACompromise" + remove_from_crl = "removeFromCRL" + + +@utils.register_interface(ExtensionType) +class PolicyConstraints(object): + oid = ExtensionOID.POLICY_CONSTRAINTS + + def __init__(self, require_explicit_policy, inhibit_policy_mapping): + if require_explicit_policy is not None and not isinstance( + require_explicit_policy, six.integer_types + ): + raise TypeError( + "require_explicit_policy must be a non-negative integer or " + "None" + ) + + if inhibit_policy_mapping is not None and not isinstance( + inhibit_policy_mapping, six.integer_types + ): + raise TypeError( + "inhibit_policy_mapping must be a non-negative integer or None" + ) + + if inhibit_policy_mapping is None and require_explicit_policy is None: + raise ValueError( + "At least one of require_explicit_policy and " + "inhibit_policy_mapping must not be None" + ) + + self._require_explicit_policy = require_explicit_policy + self._inhibit_policy_mapping = inhibit_policy_mapping + + def __repr__(self): + return ( + u"".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, PolicyConstraints): + return NotImplemented + + return ( + self.require_explicit_policy == other.require_explicit_policy and + self.inhibit_policy_mapping == other.inhibit_policy_mapping + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash( + (self.require_explicit_policy, self.inhibit_policy_mapping) + ) + + require_explicit_policy = utils.read_only_property( + "_require_explicit_policy" + ) + inhibit_policy_mapping = utils.read_only_property( + "_inhibit_policy_mapping" + ) + + +@utils.register_interface(ExtensionType) +class CertificatePolicies(object): + oid = ExtensionOID.CERTIFICATE_POLICIES + + def __init__(self, policies): + policies = list(policies) + if not all(isinstance(x, PolicyInformation) for x in policies): + raise TypeError( + "Every item in the policies list must be a " + "PolicyInformation" + ) + + self._policies = policies + + __len__, __iter__, __getitem__ = _make_sequence_methods("_policies") + + def __repr__(self): + return "".format(self._policies) + + def __eq__(self, other): + if not isinstance(other, CertificatePolicies): + return NotImplemented + + return self._policies == other._policies + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._policies)) + + +class PolicyInformation(object): + def __init__(self, policy_identifier, policy_qualifiers): + if not isinstance(policy_identifier, ObjectIdentifier): + raise TypeError("policy_identifier must be an ObjectIdentifier") + + self._policy_identifier = policy_identifier + + if policy_qualifiers: + policy_qualifiers = list(policy_qualifiers) + if not all( + isinstance(x, (six.text_type, UserNotice)) + for x in policy_qualifiers + ): + raise TypeError( + "policy_qualifiers must be a list of strings and/or " + "UserNotice objects or None" + ) + + self._policy_qualifiers = policy_qualifiers + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, PolicyInformation): + return NotImplemented + + return ( + self.policy_identifier == other.policy_identifier and + self.policy_qualifiers == other.policy_qualifiers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + if self.policy_qualifiers is not None: + pq = tuple(self.policy_qualifiers) + else: + pq = None + + return hash((self.policy_identifier, pq)) + + policy_identifier = utils.read_only_property("_policy_identifier") + policy_qualifiers = utils.read_only_property("_policy_qualifiers") + + +class UserNotice(object): + def __init__(self, notice_reference, explicit_text): + if notice_reference and not isinstance( + notice_reference, NoticeReference + ): + raise TypeError( + "notice_reference must be None or a NoticeReference" + ) + + self._notice_reference = notice_reference + self._explicit_text = explicit_text + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, UserNotice): + return NotImplemented + + return ( + self.notice_reference == other.notice_reference and + self.explicit_text == other.explicit_text + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.notice_reference, self.explicit_text)) + + notice_reference = utils.read_only_property("_notice_reference") + explicit_text = utils.read_only_property("_explicit_text") + + +class NoticeReference(object): + def __init__(self, organization, notice_numbers): + self._organization = organization + notice_numbers = list(notice_numbers) + if not all(isinstance(x, int) for x in notice_numbers): + raise TypeError( + "notice_numbers must be a list of integers" + ) + + self._notice_numbers = notice_numbers + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, NoticeReference): + return NotImplemented + + return ( + self.organization == other.organization and + self.notice_numbers == other.notice_numbers + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.organization, tuple(self.notice_numbers))) + + organization = utils.read_only_property("_organization") + notice_numbers = utils.read_only_property("_notice_numbers") + + +@utils.register_interface(ExtensionType) +class ExtendedKeyUsage(object): + oid = ExtensionOID.EXTENDED_KEY_USAGE + + def __init__(self, usages): + usages = list(usages) + if not all(isinstance(x, ObjectIdentifier) for x in usages): + raise TypeError( + "Every item in the usages list must be an ObjectIdentifier" + ) + + self._usages = usages + + __len__, __iter__, __getitem__ = _make_sequence_methods("_usages") + + def __repr__(self): + return "".format(self._usages) + + def __eq__(self, other): + if not isinstance(other, ExtendedKeyUsage): + return NotImplemented + + return self._usages == other._usages + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._usages)) + + +@utils.register_interface(ExtensionType) +class OCSPNoCheck(object): + oid = ExtensionOID.OCSP_NO_CHECK + + def __eq__(self, other): + if not isinstance(other, OCSPNoCheck): + return NotImplemented + + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(OCSPNoCheck) + + def __repr__(self): + return "" + + +@utils.register_interface(ExtensionType) +class PrecertPoison(object): + oid = ExtensionOID.PRECERT_POISON + + def __eq__(self, other): + if not isinstance(other, PrecertPoison): + return NotImplemented + + return True + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(PrecertPoison) + + def __repr__(self): + return "" + + +@utils.register_interface(ExtensionType) +class TLSFeature(object): + oid = ExtensionOID.TLS_FEATURE + + def __init__(self, features): + features = list(features) + if ( + not all(isinstance(x, TLSFeatureType) for x in features) or + len(features) == 0 + ): + raise TypeError( + "features must be a list of elements from the TLSFeatureType " + "enum" + ) + + self._features = features + + __len__, __iter__, __getitem__ = _make_sequence_methods("_features") + + def __repr__(self): + return "".format(self) + + def __eq__(self, other): + if not isinstance(other, TLSFeature): + return NotImplemented + + return self._features == other._features + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._features)) + + +class TLSFeatureType(Enum): + # status_request is defined in RFC 6066 and is used for what is commonly + # called OCSP Must-Staple when present in the TLS Feature extension in an + # X.509 certificate. + status_request = 5 + # status_request_v2 is defined in RFC 6961 and allows multiple OCSP + # responses to be provided. It is not currently in use by clients or + # servers. + status_request_v2 = 17 + + +_TLS_FEATURE_TYPE_TO_ENUM = dict((x.value, x) for x in TLSFeatureType) + + +@utils.register_interface(ExtensionType) +class InhibitAnyPolicy(object): + oid = ExtensionOID.INHIBIT_ANY_POLICY + + def __init__(self, skip_certs): + if not isinstance(skip_certs, six.integer_types): + raise TypeError("skip_certs must be an integer") + + if skip_certs < 0: + raise ValueError("skip_certs must be a non-negative integer") + + self._skip_certs = skip_certs + + def __repr__(self): + return "".format(self) + + def __eq__(self, other): + if not isinstance(other, InhibitAnyPolicy): + return NotImplemented + + return self.skip_certs == other.skip_certs + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.skip_certs) + + skip_certs = utils.read_only_property("_skip_certs") + + +@utils.register_interface(ExtensionType) +class KeyUsage(object): + oid = ExtensionOID.KEY_USAGE + + def __init__(self, digital_signature, content_commitment, key_encipherment, + data_encipherment, key_agreement, key_cert_sign, crl_sign, + encipher_only, decipher_only): + if not key_agreement and (encipher_only or decipher_only): + raise ValueError( + "encipher_only and decipher_only can only be true when " + "key_agreement is true" + ) + + self._digital_signature = digital_signature + self._content_commitment = content_commitment + self._key_encipherment = key_encipherment + self._data_encipherment = data_encipherment + self._key_agreement = key_agreement + self._key_cert_sign = key_cert_sign + self._crl_sign = crl_sign + self._encipher_only = encipher_only + self._decipher_only = decipher_only + + digital_signature = utils.read_only_property("_digital_signature") + content_commitment = utils.read_only_property("_content_commitment") + key_encipherment = utils.read_only_property("_key_encipherment") + data_encipherment = utils.read_only_property("_data_encipherment") + key_agreement = utils.read_only_property("_key_agreement") + key_cert_sign = utils.read_only_property("_key_cert_sign") + crl_sign = utils.read_only_property("_crl_sign") + + @property + def encipher_only(self): + if not self.key_agreement: + raise ValueError( + "encipher_only is undefined unless key_agreement is true" + ) + else: + return self._encipher_only + + @property + def decipher_only(self): + if not self.key_agreement: + raise ValueError( + "decipher_only is undefined unless key_agreement is true" + ) + else: + return self._decipher_only + + def __repr__(self): + try: + encipher_only = self.encipher_only + decipher_only = self.decipher_only + except ValueError: + encipher_only = None + decipher_only = None + + return ("").format( + self, encipher_only, decipher_only) + + def __eq__(self, other): + if not isinstance(other, KeyUsage): + return NotImplemented + + return ( + self.digital_signature == other.digital_signature and + self.content_commitment == other.content_commitment and + self.key_encipherment == other.key_encipherment and + self.data_encipherment == other.data_encipherment and + self.key_agreement == other.key_agreement and + self.key_cert_sign == other.key_cert_sign and + self.crl_sign == other.crl_sign and + self._encipher_only == other._encipher_only and + self._decipher_only == other._decipher_only + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(( + self.digital_signature, self.content_commitment, + self.key_encipherment, self.data_encipherment, + self.key_agreement, self.key_cert_sign, + self.crl_sign, self._encipher_only, + self._decipher_only + )) + + +@utils.register_interface(ExtensionType) +class NameConstraints(object): + oid = ExtensionOID.NAME_CONSTRAINTS + + def __init__(self, permitted_subtrees, excluded_subtrees): + if permitted_subtrees is not None: + permitted_subtrees = list(permitted_subtrees) + if not all( + isinstance(x, GeneralName) for x in permitted_subtrees + ): + raise TypeError( + "permitted_subtrees must be a list of GeneralName objects " + "or None" + ) + + self._validate_ip_name(permitted_subtrees) + + if excluded_subtrees is not None: + excluded_subtrees = list(excluded_subtrees) + if not all( + isinstance(x, GeneralName) for x in excluded_subtrees + ): + raise TypeError( + "excluded_subtrees must be a list of GeneralName objects " + "or None" + ) + + self._validate_ip_name(excluded_subtrees) + + if permitted_subtrees is None and excluded_subtrees is None: + raise ValueError( + "At least one of permitted_subtrees and excluded_subtrees " + "must not be None" + ) + + self._permitted_subtrees = permitted_subtrees + self._excluded_subtrees = excluded_subtrees + + def __eq__(self, other): + if not isinstance(other, NameConstraints): + return NotImplemented + + return ( + self.excluded_subtrees == other.excluded_subtrees and + self.permitted_subtrees == other.permitted_subtrees + ) + + def __ne__(self, other): + return not self == other + + def _validate_ip_name(self, tree): + if any(isinstance(name, IPAddress) and not isinstance( + name.value, (ipaddress.IPv4Network, ipaddress.IPv6Network) + ) for name in tree): + raise TypeError( + "IPAddress name constraints must be an IPv4Network or" + " IPv6Network object" + ) + + def __repr__(self): + return ( + u"".format(self) + ) + + def __hash__(self): + if self.permitted_subtrees is not None: + ps = tuple(self.permitted_subtrees) + else: + ps = None + + if self.excluded_subtrees is not None: + es = tuple(self.excluded_subtrees) + else: + es = None + + return hash((ps, es)) + + permitted_subtrees = utils.read_only_property("_permitted_subtrees") + excluded_subtrees = utils.read_only_property("_excluded_subtrees") + + +class Extension(object): + def __init__(self, oid, critical, value): + if not isinstance(oid, ObjectIdentifier): + raise TypeError( + "oid argument must be an ObjectIdentifier instance." + ) + + if not isinstance(critical, bool): + raise TypeError("critical must be a boolean value") + + self._oid = oid + self._critical = critical + self._value = value + + oid = utils.read_only_property("_oid") + critical = utils.read_only_property("_critical") + value = utils.read_only_property("_value") + + def __repr__(self): + return ("").format(self) + + def __eq__(self, other): + if not isinstance(other, Extension): + return NotImplemented + + return ( + self.oid == other.oid and + self.critical == other.critical and + self.value == other.value + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.oid, self.critical, self.value)) + + +class GeneralNames(object): + def __init__(self, general_names): + general_names = list(general_names) + if not all(isinstance(x, GeneralName) for x in general_names): + raise TypeError( + "Every item in the general_names list must be an " + "object conforming to the GeneralName interface" + ) + + self._general_names = general_names + __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names") + + def get_values_for_type(self, type): + # Return the value of each GeneralName, except for OtherName instances + # which we return directly because it has two important properties not + # just one value. + objs = (i for i in self if isinstance(i, type)) + if type != OtherName: + objs = (i.value for i in objs) + return list(objs) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, GeneralNames): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self._general_names)) + + +@utils.register_interface(ExtensionType) +class SubjectAlternativeName(object): + oid = ExtensionOID.SUBJECT_ALTERNATIVE_NAME + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names") + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, SubjectAlternativeName): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class IssuerAlternativeName(object): + oid = ExtensionOID.ISSUER_ALTERNATIVE_NAME + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names") + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, IssuerAlternativeName): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class CertificateIssuer(object): + oid = CRLEntryExtensionOID.CERTIFICATE_ISSUER + + def __init__(self, general_names): + self._general_names = GeneralNames(general_names) + + __len__, __iter__, __getitem__ = _make_sequence_methods("_general_names") + + def get_values_for_type(self, type): + return self._general_names.get_values_for_type(type) + + def __repr__(self): + return "".format(self._general_names) + + def __eq__(self, other): + if not isinstance(other, CertificateIssuer): + return NotImplemented + + return self._general_names == other._general_names + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self._general_names) + + +@utils.register_interface(ExtensionType) +class CRLReason(object): + oid = CRLEntryExtensionOID.CRL_REASON + + def __init__(self, reason): + if not isinstance(reason, ReasonFlags): + raise TypeError("reason must be an element from ReasonFlags") + + self._reason = reason + + def __repr__(self): + return "".format(self._reason) + + def __eq__(self, other): + if not isinstance(other, CRLReason): + return NotImplemented + + return self.reason == other.reason + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.reason) + + reason = utils.read_only_property("_reason") + + +@utils.register_interface(ExtensionType) +class InvalidityDate(object): + oid = CRLEntryExtensionOID.INVALIDITY_DATE + + def __init__(self, invalidity_date): + if not isinstance(invalidity_date, datetime.datetime): + raise TypeError("invalidity_date must be a datetime.datetime") + + self._invalidity_date = invalidity_date + + def __repr__(self): + return "".format( + self._invalidity_date + ) + + def __eq__(self, other): + if not isinstance(other, InvalidityDate): + return NotImplemented + + return self.invalidity_date == other.invalidity_date + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.invalidity_date) + + invalidity_date = utils.read_only_property("_invalidity_date") + + +@utils.register_interface(ExtensionType) +class PrecertificateSignedCertificateTimestamps(object): + oid = ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS + + def __init__(self, signed_certificate_timestamps): + signed_certificate_timestamps = list(signed_certificate_timestamps) + if not all( + isinstance(sct, SignedCertificateTimestamp) + for sct in signed_certificate_timestamps + ): + raise TypeError( + "Every item in the signed_certificate_timestamps list must be " + "a SignedCertificateTimestamp" + ) + self._signed_certificate_timestamps = signed_certificate_timestamps + + __len__, __iter__, __getitem__ = _make_sequence_methods( + "_signed_certificate_timestamps" + ) + + def __repr__(self): + return ( + "".format( + list(self) + ) + ) + + def __hash__(self): + return hash(tuple(self._signed_certificate_timestamps)) + + def __eq__(self, other): + if not isinstance(other, PrecertificateSignedCertificateTimestamps): + return NotImplemented + + return ( + self._signed_certificate_timestamps == + other._signed_certificate_timestamps + ) + + def __ne__(self, other): + return not self == other + + +@utils.register_interface(ExtensionType) +class OCSPNonce(object): + oid = OCSPExtensionOID.NONCE + + def __init__(self, nonce): + if not isinstance(nonce, bytes): + raise TypeError("nonce must be bytes") + + self._nonce = nonce + + def __eq__(self, other): + if not isinstance(other, OCSPNonce): + return NotImplemented + + return self.nonce == other.nonce + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(self.nonce) + + def __repr__(self): + return "".format(self) + + nonce = utils.read_only_property("_nonce") + + +@utils.register_interface(ExtensionType) +class IssuingDistributionPoint(object): + oid = ExtensionOID.ISSUING_DISTRIBUTION_POINT + + def __init__(self, full_name, relative_name, only_contains_user_certs, + only_contains_ca_certs, only_some_reasons, indirect_crl, + only_contains_attribute_certs): + if ( + only_some_reasons and ( + not isinstance(only_some_reasons, frozenset) or not all( + isinstance(x, ReasonFlags) for x in only_some_reasons + ) + ) + ): + raise TypeError( + "only_some_reasons must be None or frozenset of ReasonFlags" + ) + + if only_some_reasons and ( + ReasonFlags.unspecified in only_some_reasons or + ReasonFlags.remove_from_crl in only_some_reasons + ): + raise ValueError( + "unspecified and remove_from_crl are not valid reasons in an " + "IssuingDistributionPoint" + ) + + if not ( + isinstance(only_contains_user_certs, bool) and + isinstance(only_contains_ca_certs, bool) and + isinstance(indirect_crl, bool) and + isinstance(only_contains_attribute_certs, bool) + ): + raise TypeError( + "only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl and only_contains_attribute_certs " + "must all be boolean." + ) + + crl_constraints = [ + only_contains_user_certs, only_contains_ca_certs, + indirect_crl, only_contains_attribute_certs + ] + + if len([x for x in crl_constraints if x]) > 1: + raise ValueError( + "Only one of the following can be set to True: " + "only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl, only_contains_attribute_certs" + ) + + if ( + not any([ + only_contains_user_certs, only_contains_ca_certs, + indirect_crl, only_contains_attribute_certs, full_name, + relative_name, only_some_reasons + ]) + ): + raise ValueError( + "Cannot create empty extension: " + "if only_contains_user_certs, only_contains_ca_certs, " + "indirect_crl, and only_contains_attribute_certs are all False" + ", then either full_name, relative_name, or only_some_reasons " + "must have a value." + ) + + self._only_contains_user_certs = only_contains_user_certs + self._only_contains_ca_certs = only_contains_ca_certs + self._indirect_crl = indirect_crl + self._only_contains_attribute_certs = only_contains_attribute_certs + self._only_some_reasons = only_some_reasons + self._full_name = full_name + self._relative_name = relative_name + + def __repr__(self): + return ( + "".format(self) + ) + + def __eq__(self, other): + if not isinstance(other, IssuingDistributionPoint): + return NotImplemented + + return ( + self.full_name == other.full_name and + self.relative_name == other.relative_name and + self.only_contains_user_certs == other.only_contains_user_certs and + self.only_contains_ca_certs == other.only_contains_ca_certs and + self.only_some_reasons == other.only_some_reasons and + self.indirect_crl == other.indirect_crl and + self.only_contains_attribute_certs == + other.only_contains_attribute_certs + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(( + self.full_name, + self.relative_name, + self.only_contains_user_certs, + self.only_contains_ca_certs, + self.only_some_reasons, + self.indirect_crl, + self.only_contains_attribute_certs, + )) + + full_name = utils.read_only_property("_full_name") + relative_name = utils.read_only_property("_relative_name") + only_contains_user_certs = utils.read_only_property( + "_only_contains_user_certs" + ) + only_contains_ca_certs = utils.read_only_property( + "_only_contains_ca_certs" + ) + only_some_reasons = utils.read_only_property("_only_some_reasons") + indirect_crl = utils.read_only_property("_indirect_crl") + only_contains_attribute_certs = utils.read_only_property( + "_only_contains_attribute_certs" + ) + + +@utils.register_interface(ExtensionType) +class UnrecognizedExtension(object): + def __init__(self, oid, value): + if not isinstance(oid, ObjectIdentifier): + raise TypeError("oid must be an ObjectIdentifier") + self._oid = oid + self._value = value + + oid = utils.read_only_property("_oid") + value = utils.read_only_property("_value") + + def __repr__(self): + return ( + "".format( + self + ) + ) + + def __eq__(self, other): + if not isinstance(other, UnrecognizedExtension): + return NotImplemented + + return self.oid == other.oid and self.value == other.value + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.oid, self.value)) diff --git a/venv/lib/python3.7/site-packages/cryptography/x509/oid.py b/venv/lib/python3.7/site-packages/cryptography/x509/oid.py new file mode 100644 index 0000000..c1e5dc5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/cryptography/x509/oid.py @@ -0,0 +1,232 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from __future__ import absolute_import, division, print_function + +from cryptography.hazmat._oid import ObjectIdentifier +from cryptography.hazmat.primitives import hashes + + +class ExtensionOID(object): + SUBJECT_DIRECTORY_ATTRIBUTES = ObjectIdentifier("2.5.29.9") + SUBJECT_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.14") + KEY_USAGE = ObjectIdentifier("2.5.29.15") + SUBJECT_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.17") + ISSUER_ALTERNATIVE_NAME = ObjectIdentifier("2.5.29.18") + BASIC_CONSTRAINTS = ObjectIdentifier("2.5.29.19") + NAME_CONSTRAINTS = ObjectIdentifier("2.5.29.30") + CRL_DISTRIBUTION_POINTS = ObjectIdentifier("2.5.29.31") + CERTIFICATE_POLICIES = ObjectIdentifier("2.5.29.32") + POLICY_MAPPINGS = ObjectIdentifier("2.5.29.33") + AUTHORITY_KEY_IDENTIFIER = ObjectIdentifier("2.5.29.35") + POLICY_CONSTRAINTS = ObjectIdentifier("2.5.29.36") + EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37") + FRESHEST_CRL = ObjectIdentifier("2.5.29.46") + INHIBIT_ANY_POLICY = ObjectIdentifier("2.5.29.54") + ISSUING_DISTRIBUTION_POINT = ObjectIdentifier("2.5.29.28") + AUTHORITY_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.1") + SUBJECT_INFORMATION_ACCESS = ObjectIdentifier("1.3.6.1.5.5.7.1.11") + OCSP_NO_CHECK = ObjectIdentifier("1.3.6.1.5.5.7.48.1.5") + TLS_FEATURE = ObjectIdentifier("1.3.6.1.5.5.7.1.24") + CRL_NUMBER = ObjectIdentifier("2.5.29.20") + DELTA_CRL_INDICATOR = ObjectIdentifier("2.5.29.27") + PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS = ( + ObjectIdentifier("1.3.6.1.4.1.11129.2.4.2") + ) + PRECERT_POISON = ( + ObjectIdentifier("1.3.6.1.4.1.11129.2.4.3") + ) + + +class OCSPExtensionOID(object): + NONCE = ObjectIdentifier("1.3.6.1.5.5.7.48.1.2") + + +class CRLEntryExtensionOID(object): + CERTIFICATE_ISSUER = ObjectIdentifier("2.5.29.29") + CRL_REASON = ObjectIdentifier("2.5.29.21") + INVALIDITY_DATE = ObjectIdentifier("2.5.29.24") + + +class NameOID(object): + COMMON_NAME = ObjectIdentifier("2.5.4.3") + COUNTRY_NAME = ObjectIdentifier("2.5.4.6") + LOCALITY_NAME = ObjectIdentifier("2.5.4.7") + STATE_OR_PROVINCE_NAME = ObjectIdentifier("2.5.4.8") + STREET_ADDRESS = ObjectIdentifier("2.5.4.9") + ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10") + ORGANIZATIONAL_UNIT_NAME = ObjectIdentifier("2.5.4.11") + SERIAL_NUMBER = ObjectIdentifier("2.5.4.5") + SURNAME = ObjectIdentifier("2.5.4.4") + GIVEN_NAME = ObjectIdentifier("2.5.4.42") + TITLE = ObjectIdentifier("2.5.4.12") + GENERATION_QUALIFIER = ObjectIdentifier("2.5.4.44") + X500_UNIQUE_IDENTIFIER = ObjectIdentifier("2.5.4.45") + DN_QUALIFIER = ObjectIdentifier("2.5.4.46") + PSEUDONYM = ObjectIdentifier("2.5.4.65") + USER_ID = ObjectIdentifier("0.9.2342.19200300.100.1.1") + DOMAIN_COMPONENT = ObjectIdentifier("0.9.2342.19200300.100.1.25") + EMAIL_ADDRESS = ObjectIdentifier("1.2.840.113549.1.9.1") + JURISDICTION_COUNTRY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.3") + JURISDICTION_LOCALITY_NAME = ObjectIdentifier("1.3.6.1.4.1.311.60.2.1.1") + JURISDICTION_STATE_OR_PROVINCE_NAME = ObjectIdentifier( + "1.3.6.1.4.1.311.60.2.1.2" + ) + BUSINESS_CATEGORY = ObjectIdentifier("2.5.4.15") + POSTAL_ADDRESS = ObjectIdentifier("2.5.4.16") + POSTAL_CODE = ObjectIdentifier("2.5.4.17") + + +class SignatureAlgorithmOID(object): + RSA_WITH_MD5 = ObjectIdentifier("1.2.840.113549.1.1.4") + RSA_WITH_SHA1 = ObjectIdentifier("1.2.840.113549.1.1.5") + # This is an alternate OID for RSA with SHA1 that is occasionally seen + _RSA_WITH_SHA1 = ObjectIdentifier("1.3.14.3.2.29") + RSA_WITH_SHA224 = ObjectIdentifier("1.2.840.113549.1.1.14") + RSA_WITH_SHA256 = ObjectIdentifier("1.2.840.113549.1.1.11") + RSA_WITH_SHA384 = ObjectIdentifier("1.2.840.113549.1.1.12") + RSA_WITH_SHA512 = ObjectIdentifier("1.2.840.113549.1.1.13") + RSASSA_PSS = ObjectIdentifier("1.2.840.113549.1.1.10") + ECDSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10045.4.1") + ECDSA_WITH_SHA224 = ObjectIdentifier("1.2.840.10045.4.3.1") + ECDSA_WITH_SHA256 = ObjectIdentifier("1.2.840.10045.4.3.2") + ECDSA_WITH_SHA384 = ObjectIdentifier("1.2.840.10045.4.3.3") + ECDSA_WITH_SHA512 = ObjectIdentifier("1.2.840.10045.4.3.4") + DSA_WITH_SHA1 = ObjectIdentifier("1.2.840.10040.4.3") + DSA_WITH_SHA224 = ObjectIdentifier("2.16.840.1.101.3.4.3.1") + DSA_WITH_SHA256 = ObjectIdentifier("2.16.840.1.101.3.4.3.2") + ED25519 = ObjectIdentifier("1.3.101.112") + ED448 = ObjectIdentifier("1.3.101.113") + + +_SIG_OIDS_TO_HASH = { + SignatureAlgorithmOID.RSA_WITH_MD5: hashes.MD5(), + SignatureAlgorithmOID.RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID._RSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.RSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.RSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.RSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.RSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.ECDSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.ECDSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.ECDSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.ECDSA_WITH_SHA384: hashes.SHA384(), + SignatureAlgorithmOID.ECDSA_WITH_SHA512: hashes.SHA512(), + SignatureAlgorithmOID.DSA_WITH_SHA1: hashes.SHA1(), + SignatureAlgorithmOID.DSA_WITH_SHA224: hashes.SHA224(), + SignatureAlgorithmOID.DSA_WITH_SHA256: hashes.SHA256(), + SignatureAlgorithmOID.ED25519: None, + SignatureAlgorithmOID.ED448: None, +} + + +class ExtendedKeyUsageOID(object): + SERVER_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.1") + CLIENT_AUTH = ObjectIdentifier("1.3.6.1.5.5.7.3.2") + CODE_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.3") + EMAIL_PROTECTION = ObjectIdentifier("1.3.6.1.5.5.7.3.4") + TIME_STAMPING = ObjectIdentifier("1.3.6.1.5.5.7.3.8") + OCSP_SIGNING = ObjectIdentifier("1.3.6.1.5.5.7.3.9") + ANY_EXTENDED_KEY_USAGE = ObjectIdentifier("2.5.29.37.0") + + +class AuthorityInformationAccessOID(object): + CA_ISSUERS = ObjectIdentifier("1.3.6.1.5.5.7.48.2") + OCSP = ObjectIdentifier("1.3.6.1.5.5.7.48.1") + + +class CertificatePoliciesOID(object): + CPS_QUALIFIER = ObjectIdentifier("1.3.6.1.5.5.7.2.1") + CPS_USER_NOTICE = ObjectIdentifier("1.3.6.1.5.5.7.2.2") + ANY_POLICY = ObjectIdentifier("2.5.29.32.0") + + +_OID_NAMES = { + NameOID.COMMON_NAME: "commonName", + NameOID.COUNTRY_NAME: "countryName", + NameOID.LOCALITY_NAME: "localityName", + NameOID.STATE_OR_PROVINCE_NAME: "stateOrProvinceName", + NameOID.STREET_ADDRESS: "streetAddress", + NameOID.ORGANIZATION_NAME: "organizationName", + NameOID.ORGANIZATIONAL_UNIT_NAME: "organizationalUnitName", + NameOID.SERIAL_NUMBER: "serialNumber", + NameOID.SURNAME: "surname", + NameOID.GIVEN_NAME: "givenName", + NameOID.TITLE: "title", + NameOID.GENERATION_QUALIFIER: "generationQualifier", + NameOID.X500_UNIQUE_IDENTIFIER: "x500UniqueIdentifier", + NameOID.DN_QUALIFIER: "dnQualifier", + NameOID.PSEUDONYM: "pseudonym", + NameOID.USER_ID: "userID", + NameOID.DOMAIN_COMPONENT: "domainComponent", + NameOID.EMAIL_ADDRESS: "emailAddress", + NameOID.JURISDICTION_COUNTRY_NAME: "jurisdictionCountryName", + NameOID.JURISDICTION_LOCALITY_NAME: "jurisdictionLocalityName", + NameOID.JURISDICTION_STATE_OR_PROVINCE_NAME: ( + "jurisdictionStateOrProvinceName" + ), + NameOID.BUSINESS_CATEGORY: "businessCategory", + NameOID.POSTAL_ADDRESS: "postalAddress", + NameOID.POSTAL_CODE: "postalCode", + + SignatureAlgorithmOID.RSA_WITH_MD5: "md5WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA1: "sha1WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA224: "sha224WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA256: "sha256WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA384: "sha384WithRSAEncryption", + SignatureAlgorithmOID.RSA_WITH_SHA512: "sha512WithRSAEncryption", + SignatureAlgorithmOID.RSASSA_PSS: "RSASSA-PSS", + SignatureAlgorithmOID.ECDSA_WITH_SHA1: "ecdsa-with-SHA1", + SignatureAlgorithmOID.ECDSA_WITH_SHA224: "ecdsa-with-SHA224", + SignatureAlgorithmOID.ECDSA_WITH_SHA256: "ecdsa-with-SHA256", + SignatureAlgorithmOID.ECDSA_WITH_SHA384: "ecdsa-with-SHA384", + SignatureAlgorithmOID.ECDSA_WITH_SHA512: "ecdsa-with-SHA512", + SignatureAlgorithmOID.DSA_WITH_SHA1: "dsa-with-sha1", + SignatureAlgorithmOID.DSA_WITH_SHA224: "dsa-with-sha224", + SignatureAlgorithmOID.DSA_WITH_SHA256: "dsa-with-sha256", + SignatureAlgorithmOID.ED25519: "ed25519", + SignatureAlgorithmOID.ED448: "ed448", + ExtendedKeyUsageOID.SERVER_AUTH: "serverAuth", + ExtendedKeyUsageOID.CLIENT_AUTH: "clientAuth", + ExtendedKeyUsageOID.CODE_SIGNING: "codeSigning", + ExtendedKeyUsageOID.EMAIL_PROTECTION: "emailProtection", + ExtendedKeyUsageOID.TIME_STAMPING: "timeStamping", + ExtendedKeyUsageOID.OCSP_SIGNING: "OCSPSigning", + ExtensionOID.SUBJECT_DIRECTORY_ATTRIBUTES: "subjectDirectoryAttributes", + ExtensionOID.SUBJECT_KEY_IDENTIFIER: "subjectKeyIdentifier", + ExtensionOID.KEY_USAGE: "keyUsage", + ExtensionOID.SUBJECT_ALTERNATIVE_NAME: "subjectAltName", + ExtensionOID.ISSUER_ALTERNATIVE_NAME: "issuerAltName", + ExtensionOID.BASIC_CONSTRAINTS: "basicConstraints", + ExtensionOID.PRECERT_SIGNED_CERTIFICATE_TIMESTAMPS: ( + "signedCertificateTimestampList" + ), + ExtensionOID.PRECERT_POISON: "ctPoison", + CRLEntryExtensionOID.CRL_REASON: "cRLReason", + CRLEntryExtensionOID.INVALIDITY_DATE: "invalidityDate", + CRLEntryExtensionOID.CERTIFICATE_ISSUER: "certificateIssuer", + ExtensionOID.NAME_CONSTRAINTS: "nameConstraints", + ExtensionOID.CRL_DISTRIBUTION_POINTS: "cRLDistributionPoints", + ExtensionOID.CERTIFICATE_POLICIES: "certificatePolicies", + ExtensionOID.POLICY_MAPPINGS: "policyMappings", + ExtensionOID.AUTHORITY_KEY_IDENTIFIER: "authorityKeyIdentifier", + ExtensionOID.POLICY_CONSTRAINTS: "policyConstraints", + ExtensionOID.EXTENDED_KEY_USAGE: "extendedKeyUsage", + ExtensionOID.FRESHEST_CRL: "freshestCRL", + ExtensionOID.INHIBIT_ANY_POLICY: "inhibitAnyPolicy", + ExtensionOID.ISSUING_DISTRIBUTION_POINT: ( + "issuingDistributionPoint" + ), + ExtensionOID.AUTHORITY_INFORMATION_ACCESS: "authorityInfoAccess", + ExtensionOID.SUBJECT_INFORMATION_ACCESS: "subjectInfoAccess", + ExtensionOID.OCSP_NO_CHECK: "OCSPNoCheck", + ExtensionOID.CRL_NUMBER: "cRLNumber", + ExtensionOID.DELTA_CRL_INDICATOR: "deltaCRLIndicator", + ExtensionOID.TLS_FEATURE: "TLSFeature", + AuthorityInformationAccessOID.OCSP: "OCSP", + AuthorityInformationAccessOID.CA_ISSUERS: "caIssuers", + CertificatePoliciesOID.CPS_QUALIFIER: "id-qt-cps", + CertificatePoliciesOID.CPS_USER_NOTICE: "id-qt-unotice", + OCSPExtensionOID.NONCE: "OCSPNonce", +} diff --git a/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/LICENSE b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/LICENSE new file mode 100644 index 0000000..5f4f225 --- /dev/null +++ b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Django Software Foundation and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Django nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/WHEEL b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/entry_points.txt b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/entry_points.txt new file mode 100644 index 0000000..af86eee --- /dev/null +++ b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +daphne = daphne.cli:CommandLineInterface.entrypoint + diff --git a/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..eed8051 --- /dev/null +++ b/venv/lib/python3.7/site-packages/daphne-2.4.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +daphne +twisted diff --git a/venv/lib/python3.7/site-packages/daphne/utils.py b/venv/lib/python3.7/site-packages/daphne/utils.py new file mode 100644 index 0000000..81f1f9d --- /dev/null +++ b/venv/lib/python3.7/site-packages/daphne/utils.py @@ -0,0 +1,84 @@ +import importlib + +from twisted.web.http_headers import Headers + + +def import_by_path(path): + """ + Given a dotted/colon path, like project.module:ClassName.callable, + returns the object at the end of the path. + """ + module_path, object_path = path.split(":", 1) + target = importlib.import_module(module_path) + for bit in object_path.split("."): + target = getattr(target, bit) + return target + + +def header_value(headers, header_name): + value = headers[header_name] + if isinstance(value, list): + value = value[0] + return value.decode("utf-8") + + +def parse_x_forwarded_for( + headers, + address_header_name="X-Forwarded-For", + port_header_name="X-Forwarded-Port", + proto_header_name="X-Forwarded-Proto", + original_addr=None, + original_scheme=None, +): + """ + Parses an X-Forwarded-For header and returns a host/port pair as a list. + + @param headers: The twisted-style object containing a request's headers + @param address_header_name: The name of the expected host header + @param port_header_name: The name of the expected port header + @param proto_header_name: The name of the expected proto header + @param original_addr: A host/port pair that should be returned if the headers are not in the request + @param original_scheme: A scheme that should be returned if the headers are not in the request + @return: A list containing a host (string) as the first entry and a port (int) as the second. + """ + if not address_header_name: + return original_addr, original_scheme + + # Convert twisted-style headers into dicts + if isinstance(headers, Headers): + headers = dict(headers.getAllRawHeaders()) + + # Lowercase all header names in the dict + headers = {name.lower(): values for name, values in headers.items()} + + # Make sure header names are bytes (values are checked in header_value) + assert all(isinstance(name, bytes) for name in headers.keys()) + + address_header_name = address_header_name.lower().encode("utf-8") + result_addr = original_addr + result_scheme = original_scheme + if address_header_name in headers: + address_value = header_value(headers, address_header_name) + + if "," in address_value: + address_value = address_value.split(",")[0].strip() + + result_addr = [address_value, 0] + + if port_header_name: + # We only want to parse the X-Forwarded-Port header if we also parsed the X-Forwarded-For + # header to avoid inconsistent results. + port_header_name = port_header_name.lower().encode("utf-8") + if port_header_name in headers: + port_value = header_value(headers, port_header_name) + try: + result_addr[1] = int(port_value) + except ValueError: + pass + + if proto_header_name: + proto_header_name = proto_header_name.lower().encode("utf-8") + if proto_header_name in headers: + result_scheme = header_value(headers, proto_header_name) + + return result_addr, result_scheme diff --git a/venv/lib/python3.7/site-packages/django/__init__.py b/venv/lib/python3.7/site-packages/django/__init__.py new file mode 100644 index 0000000..877ad80 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/__init__.py @@ -0,0 +1,24 @@ +from django.utils.version import get_version + +VERSION = (2, 2, 6, 'final', 0) + +__version__ = get_version(VERSION) + + +def setup(set_prefix=True): + """ + Configure the settings (this happens as a side effect of accessing the + first setting), configure logging and populate the app registry. + Set the thread-local urlresolvers script prefix if `set_prefix` is True. + """ + from django.apps import apps + from django.conf import settings + from django.urls import set_script_prefix + from django.utils.log import configure_logging + + configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) + if set_prefix: + set_script_prefix( + '/' if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME + ) + apps.populate(settings.INSTALLED_APPS) diff --git a/venv/lib/python3.7/site-packages/django/bin/django-admin.py b/venv/lib/python3.7/site-packages/django/bin/django-admin.py new file mode 100755 index 0000000..f518cdc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/bin/django-admin.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +from django.core import management + +if __name__ == "__main__": + management.execute_from_command_line() diff --git a/venv/lib/python3.7/site-packages/django/conf/app_template/apps.py-tpl b/venv/lib/python3.7/site-packages/django/conf/app_template/apps.py-tpl new file mode 100644 index 0000000..9b2ce52 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/app_template/apps.py-tpl @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class {{ camel_case_app_name }}Config(AppConfig): + name = '{{ app_name }}' diff --git a/venv/lib/python3.7/site-packages/django/conf/global_settings.py b/venv/lib/python3.7/site-packages/django/conf/global_settings.py new file mode 100644 index 0000000..f3abfad --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/global_settings.py @@ -0,0 +1,636 @@ +""" +Default Django settings. Override these with settings in the module pointed to +by the DJANGO_SETTINGS_MODULE environment variable. +""" + + +# This is defined here as a do-nothing function because we can't import +# django.utils.translation -- that module depends on the settings. +def gettext_noop(s): + return s + + +#################### +# CORE # +#################### + +DEBUG = False + +# Whether the framework should propagate raw exceptions rather than catching +# them. This is useful under some testing situations and should never be used +# on a live site. +DEBUG_PROPAGATE_EXCEPTIONS = False + +# People who get code error notifications. +# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] +ADMINS = [] + +# List of IP addresses, as strings, that: +# * See debug comments, when DEBUG is true +# * Receive x-headers +INTERNAL_IPS = [] + +# Hosts/domain names that are valid for this site. +# "*" matches anything, ".example.com" matches example.com and all subdomains +ALLOWED_HOSTS = [] + +# Local time zone for this installation. All choices can be found here: +# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all +# systems may support all possibilities). When USE_TZ is True, this is +# interpreted as the default user time zone. +TIME_ZONE = 'America/Chicago' + +# If you set this to True, Django will use timezone-aware datetimes. +USE_TZ = False + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +# Languages we provide translations for, out of the box. +LANGUAGES = [ + ('af', gettext_noop('Afrikaans')), + ('ar', gettext_noop('Arabic')), + ('ast', gettext_noop('Asturian')), + ('az', gettext_noop('Azerbaijani')), + ('bg', gettext_noop('Bulgarian')), + ('be', gettext_noop('Belarusian')), + ('bn', gettext_noop('Bengali')), + ('br', gettext_noop('Breton')), + ('bs', gettext_noop('Bosnian')), + ('ca', gettext_noop('Catalan')), + ('cs', gettext_noop('Czech')), + ('cy', gettext_noop('Welsh')), + ('da', gettext_noop('Danish')), + ('de', gettext_noop('German')), + ('dsb', gettext_noop('Lower Sorbian')), + ('el', gettext_noop('Greek')), + ('en', gettext_noop('English')), + ('en-au', gettext_noop('Australian English')), + ('en-gb', gettext_noop('British English')), + ('eo', gettext_noop('Esperanto')), + ('es', gettext_noop('Spanish')), + ('es-ar', gettext_noop('Argentinian Spanish')), + ('es-co', gettext_noop('Colombian Spanish')), + ('es-mx', gettext_noop('Mexican Spanish')), + ('es-ni', gettext_noop('Nicaraguan Spanish')), + ('es-ve', gettext_noop('Venezuelan Spanish')), + ('et', gettext_noop('Estonian')), + ('eu', gettext_noop('Basque')), + ('fa', gettext_noop('Persian')), + ('fi', gettext_noop('Finnish')), + ('fr', gettext_noop('French')), + ('fy', gettext_noop('Frisian')), + ('ga', gettext_noop('Irish')), + ('gd', gettext_noop('Scottish Gaelic')), + ('gl', gettext_noop('Galician')), + ('he', gettext_noop('Hebrew')), + ('hi', gettext_noop('Hindi')), + ('hr', gettext_noop('Croatian')), + ('hsb', gettext_noop('Upper Sorbian')), + ('hu', gettext_noop('Hungarian')), + ('hy', gettext_noop('Armenian')), + ('ia', gettext_noop('Interlingua')), + ('id', gettext_noop('Indonesian')), + ('io', gettext_noop('Ido')), + ('is', gettext_noop('Icelandic')), + ('it', gettext_noop('Italian')), + ('ja', gettext_noop('Japanese')), + ('ka', gettext_noop('Georgian')), + ('kab', gettext_noop('Kabyle')), + ('kk', gettext_noop('Kazakh')), + ('km', gettext_noop('Khmer')), + ('kn', gettext_noop('Kannada')), + ('ko', gettext_noop('Korean')), + ('lb', gettext_noop('Luxembourgish')), + ('lt', gettext_noop('Lithuanian')), + ('lv', gettext_noop('Latvian')), + ('mk', gettext_noop('Macedonian')), + ('ml', gettext_noop('Malayalam')), + ('mn', gettext_noop('Mongolian')), + ('mr', gettext_noop('Marathi')), + ('my', gettext_noop('Burmese')), + ('nb', gettext_noop('Norwegian Bokmål')), + ('ne', gettext_noop('Nepali')), + ('nl', gettext_noop('Dutch')), + ('nn', gettext_noop('Norwegian Nynorsk')), + ('os', gettext_noop('Ossetic')), + ('pa', gettext_noop('Punjabi')), + ('pl', gettext_noop('Polish')), + ('pt', gettext_noop('Portuguese')), + ('pt-br', gettext_noop('Brazilian Portuguese')), + ('ro', gettext_noop('Romanian')), + ('ru', gettext_noop('Russian')), + ('sk', gettext_noop('Slovak')), + ('sl', gettext_noop('Slovenian')), + ('sq', gettext_noop('Albanian')), + ('sr', gettext_noop('Serbian')), + ('sr-latn', gettext_noop('Serbian Latin')), + ('sv', gettext_noop('Swedish')), + ('sw', gettext_noop('Swahili')), + ('ta', gettext_noop('Tamil')), + ('te', gettext_noop('Telugu')), + ('th', gettext_noop('Thai')), + ('tr', gettext_noop('Turkish')), + ('tt', gettext_noop('Tatar')), + ('udm', gettext_noop('Udmurt')), + ('uk', gettext_noop('Ukrainian')), + ('ur', gettext_noop('Urdu')), + ('vi', gettext_noop('Vietnamese')), + ('zh-hans', gettext_noop('Simplified Chinese')), + ('zh-hant', gettext_noop('Traditional Chinese')), +] + +# Languages using BiDi (right-to-left) layout +LANGUAGES_BIDI = ["he", "ar", "fa", "ur"] + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True +LOCALE_PATHS = [] + +# Settings for language cookie +LANGUAGE_COOKIE_NAME = 'django_language' +LANGUAGE_COOKIE_AGE = None +LANGUAGE_COOKIE_DOMAIN = None +LANGUAGE_COOKIE_PATH = '/' + + +# If you set this to True, Django will format dates, numbers and calendars +# according to user current locale. +USE_L10N = False + +# Not-necessarily-technical managers of the site. They get broken link +# notifications and other various emails. +MANAGERS = ADMINS + +# Default content type and charset to use for all HttpResponse objects, if a +# MIME type isn't manually specified. These are used to construct the +# Content-Type header. +DEFAULT_CONTENT_TYPE = 'text/html' +DEFAULT_CHARSET = 'utf-8' + +# Encoding of files read from disk (template and initial SQL files). +FILE_CHARSET = 'utf-8' + +# Email address that error messages come from. +SERVER_EMAIL = 'root@localhost' + +# Database connection info. If left empty, will default to the dummy backend. +DATABASES = {} + +# Classes used to implement DB routing behavior. +DATABASE_ROUTERS = [] + +# The email backend to use. For possible shortcuts see django.core.mail. +# The default is to use the SMTP backend. +# Third-party backends can be specified by providing a Python path +# to a module that defines an EmailBackend class. +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +# Host for sending email. +EMAIL_HOST = 'localhost' + +# Port for sending email. +EMAIL_PORT = 25 + +# Whether to send SMTP 'Date' header in the local time zone or in UTC. +EMAIL_USE_LOCALTIME = False + +# Optional SMTP authentication information for EMAIL_HOST. +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' +EMAIL_USE_TLS = False +EMAIL_USE_SSL = False +EMAIL_SSL_CERTFILE = None +EMAIL_SSL_KEYFILE = None +EMAIL_TIMEOUT = None + +# List of strings representing installed apps. +INSTALLED_APPS = [] + +TEMPLATES = [] + +# Default form rendering class. +FORM_RENDERER = 'django.forms.renderers.DjangoTemplates' + +# Default email address to use for various automated correspondence from +# the site managers. +DEFAULT_FROM_EMAIL = 'webmaster@localhost' + +# Subject-line prefix for email messages send with django.core.mail.mail_admins +# or ...mail_managers. Make sure to include the trailing space. +EMAIL_SUBJECT_PREFIX = '[Django] ' + +# Whether to append trailing slashes to URLs. +APPEND_SLASH = True + +# Whether to prepend the "www." subdomain to URLs that don't have it. +PREPEND_WWW = False + +# Override the server-derived value of SCRIPT_NAME +FORCE_SCRIPT_NAME = None + +# List of compiled regular expression objects representing User-Agent strings +# that are not allowed to visit any page, systemwide. Use this for bad +# robots/crawlers. Here are a few examples: +# import re +# DISALLOWED_USER_AGENTS = [ +# re.compile(r'^NaverBot.*'), +# re.compile(r'^EmailSiphon.*'), +# re.compile(r'^SiteSucker.*'), +# re.compile(r'^sohu-search'), +# ] +DISALLOWED_USER_AGENTS = [] + +ABSOLUTE_URL_OVERRIDES = {} + +# List of compiled regular expression objects representing URLs that need not +# be reported by BrokenLinkEmailsMiddleware. Here are a few examples: +# import re +# IGNORABLE_404_URLS = [ +# re.compile(r'^/apple-touch-icon.*\.png$'), +# re.compile(r'^/favicon.ico$'), +# re.compile(r'^/robots.txt$'), +# re.compile(r'^/phpmyadmin/'), +# re.compile(r'\.(cgi|php|pl)$'), +# ] +IGNORABLE_404_URLS = [] + +# A secret key for this particular Django installation. Used in secret-key +# hashing algorithms. Set this in your settings, or Django will complain +# loudly. +SECRET_KEY = '' + +# Default file storage mechanism that holds media. +DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/var/www/example.com/media/" +MEDIA_ROOT = '' + +# URL that handles the media served from MEDIA_ROOT. +# Examples: "http://example.com/media/", "http://media.example.com/" +MEDIA_URL = '' + +# Absolute path to the directory static files should be collected to. +# Example: "/var/www/example.com/static/" +STATIC_ROOT = None + +# URL that handles the static files served from STATIC_ROOT. +# Example: "http://example.com/static/", "http://static.example.com/" +STATIC_URL = None + +# List of upload handler classes to be applied in order. +FILE_UPLOAD_HANDLERS = [ + 'django.core.files.uploadhandler.MemoryFileUploadHandler', + 'django.core.files.uploadhandler.TemporaryFileUploadHandler', +] + +# Maximum size, in bytes, of a request before it will be streamed to the +# file system instead of into memory. +FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB + +# Maximum size in bytes of request data (excluding file uploads) that will be +# read before a SuspiciousOperation (RequestDataTooBig) is raised. +DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB + +# Maximum number of GET/POST parameters that will be read before a +# SuspiciousOperation (TooManyFieldsSent) is raised. +DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 + +# Directory in which upload streamed files will be temporarily saved. A value of +# `None` will make Django use the operating system's default temporary directory +# (i.e. "/tmp" on *nix systems). +FILE_UPLOAD_TEMP_DIR = None + +# The numeric mode to set newly-uploaded files to. The value should be a mode +# you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories. +FILE_UPLOAD_PERMISSIONS = None + +# The numeric mode to assign to newly-created directories, when uploading files. +# The value should be a mode as you'd pass to os.chmod; +# see https://docs.python.org/library/os.html#files-and-directories. +FILE_UPLOAD_DIRECTORY_PERMISSIONS = None + +# Python module path where user will place custom format definition. +# The directory where this setting is pointing should contain subdirectories +# named as the locales, containing a formats.py file +# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) +FORMAT_MODULE_PATH = None + +# Default formatting for date objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'N j, Y' + +# Default formatting for datetime objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATETIME_FORMAT = 'N j, Y, P' + +# Default formatting for time objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +TIME_FORMAT = 'P' + +# Default formatting for date objects when only the year and month are relevant. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +YEAR_MONTH_FORMAT = 'F Y' + +# Default formatting for date objects when only the month and day are relevant. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +MONTH_DAY_FORMAT = 'F j' + +# Default short formatting for date objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +SHORT_DATE_FORMAT = 'm/d/Y' + +# Default short formatting for datetime objects. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +SHORT_DATETIME_FORMAT = 'm/d/Y P' + +# Default formats to be used when parsing dates from input boxes, in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +DATE_INPUT_FORMATS = [ + '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' +] + +# Default formats to be used when parsing times from input boxes, in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +TIME_INPUT_FORMATS = [ + '%H:%M:%S', # '14:30:59' + '%H:%M:%S.%f', # '14:30:59.000200' + '%H:%M', # '14:30' +] + +# Default formats to be used when parsing dates and times from input boxes, +# in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' + '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' + '%m/%d/%Y %H:%M', # '10/25/2006 14:30' + '%m/%d/%Y', # '10/25/2006' + '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' + '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' + '%m/%d/%y %H:%M', # '10/25/06 14:30' + '%m/%d/%y', # '10/25/06' +] + +# First day of week, to be used on calendars +# 0 means Sunday, 1 means Monday... +FIRST_DAY_OF_WEEK = 0 + +# Decimal separator symbol +DECIMAL_SEPARATOR = '.' + +# Boolean that sets whether to add thousand separator when formatting numbers +USE_THOUSAND_SEPARATOR = False + +# Number of digits that will be together, when splitting them by +# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands... +NUMBER_GROUPING = 0 + +# Thousand separator symbol +THOUSAND_SEPARATOR = ',' + +# The tablespaces to use for each model when not specified otherwise. +DEFAULT_TABLESPACE = '' +DEFAULT_INDEX_TABLESPACE = '' + +# Default X-Frame-Options header value +X_FRAME_OPTIONS = 'SAMEORIGIN' + +USE_X_FORWARDED_HOST = False +USE_X_FORWARDED_PORT = False + +# The Python dotted path to the WSGI application that Django's internal server +# (runserver) will use. If `None`, the return value of +# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same +# behavior as previous versions of Django. Otherwise this should point to an +# actual WSGI application object. +WSGI_APPLICATION = None + +# If your Django app is behind a proxy that sets a header to specify secure +# connections, AND that proxy ensures that user-submitted headers with the +# same name are ignored (so that people can't spoof it), set this value to +# a tuple of (header_name, header_value). For any requests that come in with +# that header/value, request.is_secure() will return True. +# WARNING! Only set this if you fully understand what you're doing. Otherwise, +# you may be opening yourself up to a security risk. +SECURE_PROXY_SSL_HEADER = None + +############## +# MIDDLEWARE # +############## + +# List of middleware to use. Order is important; in the request phase, these +# middleware will be applied in the order given, and in the response +# phase the middleware will be applied in reverse order. +MIDDLEWARE = [] + +############ +# SESSIONS # +############ + +# Cache to store session data if using the cache session backend. +SESSION_CACHE_ALIAS = 'default' +# Cookie name. This can be whatever you want. +SESSION_COOKIE_NAME = 'sessionid' +# Age of cookie, in seconds (default: 2 weeks). +SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 +# A string like "example.com", or None for standard domain cookie. +SESSION_COOKIE_DOMAIN = None +# Whether the session cookie should be secure (https:// only). +SESSION_COOKIE_SECURE = False +# The path of the session cookie. +SESSION_COOKIE_PATH = '/' +# Whether to use the HttpOnly flag. +SESSION_COOKIE_HTTPONLY = True +# Whether to set the flag restricting cookie leaks on cross-site requests. +# This can be 'Lax', 'Strict', or None to disable the flag. +SESSION_COOKIE_SAMESITE = 'Lax' +# Whether to save the session data on every request. +SESSION_SAVE_EVERY_REQUEST = False +# Whether a user's session cookie expires when the Web browser is closed. +SESSION_EXPIRE_AT_BROWSER_CLOSE = False +# The module to store session data +SESSION_ENGINE = 'django.contrib.sessions.backends.db' +# Directory to store session files if using the file session module. If None, +# the backend will use a sensible default. +SESSION_FILE_PATH = None +# class to serialize session data +SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' + +######### +# CACHE # +######### + +# The cache backends to use. +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + } +} +CACHE_MIDDLEWARE_KEY_PREFIX = '' +CACHE_MIDDLEWARE_SECONDS = 600 +CACHE_MIDDLEWARE_ALIAS = 'default' + +################## +# AUTHENTICATION # +################## + +AUTH_USER_MODEL = 'auth.User' + +AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend'] + +LOGIN_URL = '/accounts/login/' + +LOGIN_REDIRECT_URL = '/accounts/profile/' + +LOGOUT_REDIRECT_URL = None + +# The number of days a password reset link is valid for +PASSWORD_RESET_TIMEOUT_DAYS = 3 + +# the first hasher in this list is the preferred algorithm. any +# password using different algorithms will be converted automatically +# upon login +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.PBKDF2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', + 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', +] + +AUTH_PASSWORD_VALIDATORS = [] + +########### +# SIGNING # +########### + +SIGNING_BACKEND = 'django.core.signing.TimestampSigner' + +######## +# CSRF # +######## + +# Dotted path to callable to be used as view when a request is +# rejected by the CSRF middleware. +CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure' + +# Settings for CSRF cookie. +CSRF_COOKIE_NAME = 'csrftoken' +CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 +CSRF_COOKIE_DOMAIN = None +CSRF_COOKIE_PATH = '/' +CSRF_COOKIE_SECURE = False +CSRF_COOKIE_HTTPONLY = False +CSRF_COOKIE_SAMESITE = 'Lax' +CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN' +CSRF_TRUSTED_ORIGINS = [] +CSRF_USE_SESSIONS = False + +############ +# MESSAGES # +############ + +# Class to use as messages backend +MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage' + +# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within +# django.contrib.messages to avoid imports in this settings file. + +########### +# LOGGING # +########### + +# The callable to use to configure logging +LOGGING_CONFIG = 'logging.config.dictConfig' + +# Custom logging configuration. +LOGGING = {} + +# Default exception reporter filter class used in case none has been +# specifically assigned to the HttpRequest instance. +DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter' + +########### +# TESTING # +########### + +# The name of the class to use to run the test suite +TEST_RUNNER = 'django.test.runner.DiscoverRunner' + +# Apps that don't need to be serialized at test database creation time +# (only apps with migrations are to start with) +TEST_NON_SERIALIZED_APPS = [] + +############ +# FIXTURES # +############ + +# The list of directories to search for fixtures +FIXTURE_DIRS = [] + +############### +# STATICFILES # +############### + +# A list of locations of additional static files +STATICFILES_DIRS = [] + +# The default file storage backend used during the build process +STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + # 'django.contrib.staticfiles.finders.DefaultStorageFinder', +] + +############## +# MIGRATIONS # +############## + +# Migration module overrides for apps, by app label. +MIGRATION_MODULES = {} + +################# +# SYSTEM CHECKS # +################# + +# List of all issues generated by system checks that should be silenced. Light +# issues like warnings, infos or debugs will not generate a message. Silencing +# serious issues like errors and criticals does not result in hiding the +# message, but Django will not stop you from e.g. running server. +SILENCED_SYSTEM_CHECKS = [] + +####################### +# SECURITY MIDDLEWARE # +####################### +SECURE_BROWSER_XSS_FILTER = False +SECURE_CONTENT_TYPE_NOSNIFF = False +SECURE_HSTS_INCLUDE_SUBDOMAINS = False +SECURE_HSTS_PRELOAD = False +SECURE_HSTS_SECONDS = 0 +SECURE_REDIRECT_EXEMPT = [] +SECURE_SSL_HOST = None +SECURE_SSL_REDIRECT = False diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/__init__.py new file mode 100644 index 0000000..720045d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/__init__.py @@ -0,0 +1,575 @@ +""" +LANG_INFO is a dictionary structure to provide meta information about languages. + +About name_local: capitalize it as if your language name was appearing +inside a sentence in your language. +The 'fallback' key can be used to specify a special fallback logic which doesn't +follow the traditional 'fr-ca' -> 'fr' fallback logic. +""" + +LANG_INFO = { + 'af': { + 'bidi': False, + 'code': 'af', + 'name': 'Afrikaans', + 'name_local': 'Afrikaans', + }, + 'ar': { + 'bidi': True, + 'code': 'ar', + 'name': 'Arabic', + 'name_local': 'العربيّة', + }, + 'ast': { + 'bidi': False, + 'code': 'ast', + 'name': 'Asturian', + 'name_local': 'asturianu', + }, + 'az': { + 'bidi': True, + 'code': 'az', + 'name': 'Azerbaijani', + 'name_local': 'Azərbaycanca', + }, + 'be': { + 'bidi': False, + 'code': 'be', + 'name': 'Belarusian', + 'name_local': 'беларуская', + }, + 'bg': { + 'bidi': False, + 'code': 'bg', + 'name': 'Bulgarian', + 'name_local': 'български', + }, + 'bn': { + 'bidi': False, + 'code': 'bn', + 'name': 'Bengali', + 'name_local': 'বাংলা', + }, + 'br': { + 'bidi': False, + 'code': 'br', + 'name': 'Breton', + 'name_local': 'brezhoneg', + }, + 'bs': { + 'bidi': False, + 'code': 'bs', + 'name': 'Bosnian', + 'name_local': 'bosanski', + }, + 'ca': { + 'bidi': False, + 'code': 'ca', + 'name': 'Catalan', + 'name_local': 'català', + }, + 'cs': { + 'bidi': False, + 'code': 'cs', + 'name': 'Czech', + 'name_local': 'česky', + }, + 'cy': { + 'bidi': False, + 'code': 'cy', + 'name': 'Welsh', + 'name_local': 'Cymraeg', + }, + 'da': { + 'bidi': False, + 'code': 'da', + 'name': 'Danish', + 'name_local': 'dansk', + }, + 'de': { + 'bidi': False, + 'code': 'de', + 'name': 'German', + 'name_local': 'Deutsch', + }, + 'dsb': { + 'bidi': False, + 'code': 'dsb', + 'name': 'Lower Sorbian', + 'name_local': 'dolnoserbski', + }, + 'el': { + 'bidi': False, + 'code': 'el', + 'name': 'Greek', + 'name_local': 'Ελληνικά', + }, + 'en': { + 'bidi': False, + 'code': 'en', + 'name': 'English', + 'name_local': 'English', + }, + 'en-au': { + 'bidi': False, + 'code': 'en-au', + 'name': 'Australian English', + 'name_local': 'Australian English', + }, + 'en-gb': { + 'bidi': False, + 'code': 'en-gb', + 'name': 'British English', + 'name_local': 'British English', + }, + 'eo': { + 'bidi': False, + 'code': 'eo', + 'name': 'Esperanto', + 'name_local': 'Esperanto', + }, + 'es': { + 'bidi': False, + 'code': 'es', + 'name': 'Spanish', + 'name_local': 'español', + }, + 'es-ar': { + 'bidi': False, + 'code': 'es-ar', + 'name': 'Argentinian Spanish', + 'name_local': 'español de Argentina', + }, + 'es-co': { + 'bidi': False, + 'code': 'es-co', + 'name': 'Colombian Spanish', + 'name_local': 'español de Colombia', + }, + 'es-mx': { + 'bidi': False, + 'code': 'es-mx', + 'name': 'Mexican Spanish', + 'name_local': 'español de Mexico', + }, + 'es-ni': { + 'bidi': False, + 'code': 'es-ni', + 'name': 'Nicaraguan Spanish', + 'name_local': 'español de Nicaragua', + }, + 'es-ve': { + 'bidi': False, + 'code': 'es-ve', + 'name': 'Venezuelan Spanish', + 'name_local': 'español de Venezuela', + }, + 'et': { + 'bidi': False, + 'code': 'et', + 'name': 'Estonian', + 'name_local': 'eesti', + }, + 'eu': { + 'bidi': False, + 'code': 'eu', + 'name': 'Basque', + 'name_local': 'Basque', + }, + 'fa': { + 'bidi': True, + 'code': 'fa', + 'name': 'Persian', + 'name_local': 'فارسی', + }, + 'fi': { + 'bidi': False, + 'code': 'fi', + 'name': 'Finnish', + 'name_local': 'suomi', + }, + 'fr': { + 'bidi': False, + 'code': 'fr', + 'name': 'French', + 'name_local': 'français', + }, + 'fy': { + 'bidi': False, + 'code': 'fy', + 'name': 'Frisian', + 'name_local': 'frysk', + }, + 'ga': { + 'bidi': False, + 'code': 'ga', + 'name': 'Irish', + 'name_local': 'Gaeilge', + }, + 'gd': { + 'bidi': False, + 'code': 'gd', + 'name': 'Scottish Gaelic', + 'name_local': 'Gàidhlig', + }, + 'gl': { + 'bidi': False, + 'code': 'gl', + 'name': 'Galician', + 'name_local': 'galego', + }, + 'he': { + 'bidi': True, + 'code': 'he', + 'name': 'Hebrew', + 'name_local': 'עברית', + }, + 'hi': { + 'bidi': False, + 'code': 'hi', + 'name': 'Hindi', + 'name_local': 'Hindi', + }, + 'hr': { + 'bidi': False, + 'code': 'hr', + 'name': 'Croatian', + 'name_local': 'Hrvatski', + }, + 'hsb': { + 'bidi': False, + 'code': 'hsb', + 'name': 'Upper Sorbian', + 'name_local': 'hornjoserbsce', + }, + 'hu': { + 'bidi': False, + 'code': 'hu', + 'name': 'Hungarian', + 'name_local': 'Magyar', + }, + 'hy': { + 'bidi': False, + 'code': 'hy', + 'name': 'Armenian', + 'name_local': 'հայերեն', + }, + 'ia': { + 'bidi': False, + 'code': 'ia', + 'name': 'Interlingua', + 'name_local': 'Interlingua', + }, + 'io': { + 'bidi': False, + 'code': 'io', + 'name': 'Ido', + 'name_local': 'ido', + }, + 'id': { + 'bidi': False, + 'code': 'id', + 'name': 'Indonesian', + 'name_local': 'Bahasa Indonesia', + }, + 'is': { + 'bidi': False, + 'code': 'is', + 'name': 'Icelandic', + 'name_local': 'Íslenska', + }, + 'it': { + 'bidi': False, + 'code': 'it', + 'name': 'Italian', + 'name_local': 'italiano', + }, + 'ja': { + 'bidi': False, + 'code': 'ja', + 'name': 'Japanese', + 'name_local': '日本語', + }, + 'ka': { + 'bidi': False, + 'code': 'ka', + 'name': 'Georgian', + 'name_local': 'ქართული', + }, + 'kab': { + 'bidi': False, + 'code': 'kab', + 'name': 'Kabyle', + 'name_local': 'taqbaylit', + }, + 'kk': { + 'bidi': False, + 'code': 'kk', + 'name': 'Kazakh', + 'name_local': 'Қазақ', + }, + 'km': { + 'bidi': False, + 'code': 'km', + 'name': 'Khmer', + 'name_local': 'Khmer', + }, + 'kn': { + 'bidi': False, + 'code': 'kn', + 'name': 'Kannada', + 'name_local': 'Kannada', + }, + 'ko': { + 'bidi': False, + 'code': 'ko', + 'name': 'Korean', + 'name_local': '한국어', + }, + 'lb': { + 'bidi': False, + 'code': 'lb', + 'name': 'Luxembourgish', + 'name_local': 'Lëtzebuergesch', + }, + 'lt': { + 'bidi': False, + 'code': 'lt', + 'name': 'Lithuanian', + 'name_local': 'Lietuviškai', + }, + 'lv': { + 'bidi': False, + 'code': 'lv', + 'name': 'Latvian', + 'name_local': 'latviešu', + }, + 'mk': { + 'bidi': False, + 'code': 'mk', + 'name': 'Macedonian', + 'name_local': 'Македонски', + }, + 'ml': { + 'bidi': False, + 'code': 'ml', + 'name': 'Malayalam', + 'name_local': 'Malayalam', + }, + 'mn': { + 'bidi': False, + 'code': 'mn', + 'name': 'Mongolian', + 'name_local': 'Mongolian', + }, + 'mr': { + 'bidi': False, + 'code': 'mr', + 'name': 'Marathi', + 'name_local': 'मराठी', + }, + 'my': { + 'bidi': False, + 'code': 'my', + 'name': 'Burmese', + 'name_local': 'မြန်မာဘာသာ', + }, + 'nb': { + 'bidi': False, + 'code': 'nb', + 'name': 'Norwegian Bokmal', + 'name_local': 'norsk (bokmål)', + }, + 'ne': { + 'bidi': False, + 'code': 'ne', + 'name': 'Nepali', + 'name_local': 'नेपाली', + }, + 'nl': { + 'bidi': False, + 'code': 'nl', + 'name': 'Dutch', + 'name_local': 'Nederlands', + }, + 'nn': { + 'bidi': False, + 'code': 'nn', + 'name': 'Norwegian Nynorsk', + 'name_local': 'norsk (nynorsk)', + }, + 'no': { + 'bidi': False, + 'code': 'no', + 'name': 'Norwegian', + 'name_local': 'norsk', + }, + 'os': { + 'bidi': False, + 'code': 'os', + 'name': 'Ossetic', + 'name_local': 'Ирон', + }, + 'pa': { + 'bidi': False, + 'code': 'pa', + 'name': 'Punjabi', + 'name_local': 'Punjabi', + }, + 'pl': { + 'bidi': False, + 'code': 'pl', + 'name': 'Polish', + 'name_local': 'polski', + }, + 'pt': { + 'bidi': False, + 'code': 'pt', + 'name': 'Portuguese', + 'name_local': 'Português', + }, + 'pt-br': { + 'bidi': False, + 'code': 'pt-br', + 'name': 'Brazilian Portuguese', + 'name_local': 'Português Brasileiro', + }, + 'ro': { + 'bidi': False, + 'code': 'ro', + 'name': 'Romanian', + 'name_local': 'Română', + }, + 'ru': { + 'bidi': False, + 'code': 'ru', + 'name': 'Russian', + 'name_local': 'Русский', + }, + 'sk': { + 'bidi': False, + 'code': 'sk', + 'name': 'Slovak', + 'name_local': 'Slovensky', + }, + 'sl': { + 'bidi': False, + 'code': 'sl', + 'name': 'Slovenian', + 'name_local': 'Slovenščina', + }, + 'sq': { + 'bidi': False, + 'code': 'sq', + 'name': 'Albanian', + 'name_local': 'shqip', + }, + 'sr': { + 'bidi': False, + 'code': 'sr', + 'name': 'Serbian', + 'name_local': 'српски', + }, + 'sr-latn': { + 'bidi': False, + 'code': 'sr-latn', + 'name': 'Serbian Latin', + 'name_local': 'srpski (latinica)', + }, + 'sv': { + 'bidi': False, + 'code': 'sv', + 'name': 'Swedish', + 'name_local': 'svenska', + }, + 'sw': { + 'bidi': False, + 'code': 'sw', + 'name': 'Swahili', + 'name_local': 'Kiswahili', + }, + 'ta': { + 'bidi': False, + 'code': 'ta', + 'name': 'Tamil', + 'name_local': 'தமிழ்', + }, + 'te': { + 'bidi': False, + 'code': 'te', + 'name': 'Telugu', + 'name_local': 'తెలుగు', + }, + 'th': { + 'bidi': False, + 'code': 'th', + 'name': 'Thai', + 'name_local': 'ภาษาไทย', + }, + 'tr': { + 'bidi': False, + 'code': 'tr', + 'name': 'Turkish', + 'name_local': 'Türkçe', + }, + 'tt': { + 'bidi': False, + 'code': 'tt', + 'name': 'Tatar', + 'name_local': 'Татарча', + }, + 'udm': { + 'bidi': False, + 'code': 'udm', + 'name': 'Udmurt', + 'name_local': 'Удмурт', + }, + 'uk': { + 'bidi': False, + 'code': 'uk', + 'name': 'Ukrainian', + 'name_local': 'Українська', + }, + 'ur': { + 'bidi': True, + 'code': 'ur', + 'name': 'Urdu', + 'name_local': 'اردو', + }, + 'vi': { + 'bidi': False, + 'code': 'vi', + 'name': 'Vietnamese', + 'name_local': 'Tiếng Việt', + }, + 'zh-cn': { + 'fallback': ['zh-hans'], + }, + 'zh-hans': { + 'bidi': False, + 'code': 'zh-hans', + 'name': 'Simplified Chinese', + 'name_local': '简体中文', + }, + 'zh-hant': { + 'bidi': False, + 'code': 'zh-hant', + 'name': 'Traditional Chinese', + 'name_local': '繁體中文', + }, + 'zh-hk': { + 'fallback': ['zh-hant'], + }, + 'zh-mo': { + 'fallback': ['zh-hant'], + }, + 'zh-my': { + 'fallback': ['zh-hans'], + }, + 'zh-sg': { + 'fallback': ['zh-hans'], + }, + 'zh-tw': { + 'fallback': ['zh-hant'], + }, +} diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ea048a7 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ar/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/ar/formats.py new file mode 100644 index 0000000..19cc860 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/ar/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F، Y' +TIME_FORMAT = 'g:i A' +# DATETIME_FORMAT = +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'd‏/m‏/Y' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d0489e2 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..60ddc20 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,1260 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emin Mastizada , 2018 +# Emin Mastizada , 2015-2016 +# Metin Amiroff , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-09-09 12:46+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Ərəbcə" + +msgid "Asturian" +msgstr "Asturiyaca" + +msgid "Azerbaijani" +msgstr "Azərbaycanca" + +msgid "Bulgarian" +msgstr "Bolqarca" + +msgid "Belarusian" +msgstr "Belarusca" + +msgid "Bengali" +msgstr "Benqalca" + +msgid "Breton" +msgstr "Bretonca" + +msgid "Bosnian" +msgstr "Bosniyaca" + +msgid "Catalan" +msgstr "Katalanca" + +msgid "Czech" +msgstr "Çexcə" + +msgid "Welsh" +msgstr "Uelscə" + +msgid "Danish" +msgstr "Danimarkaca" + +msgid "German" +msgstr "Almanca" + +msgid "Lower Sorbian" +msgstr "Aşağı Sorbca" + +msgid "Greek" +msgstr "Yunanca" + +msgid "English" +msgstr "İngiliscə" + +msgid "Australian English" +msgstr "Avstraliya İngiliscəsi" + +msgid "British English" +msgstr "Britaniya İngiliscəsi" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "İspanca" + +msgid "Argentinian Spanish" +msgstr "Argentina İspancası" + +msgid "Colombian Spanish" +msgstr "Kolumbia İspancası" + +msgid "Mexican Spanish" +msgstr "Meksika İspancası" + +msgid "Nicaraguan Spanish" +msgstr "Nikaraqua İspancası" + +msgid "Venezuelan Spanish" +msgstr "Venesuela İspancası" + +msgid "Estonian" +msgstr "Estonca" + +msgid "Basque" +msgstr "Baskca" + +msgid "Persian" +msgstr "Farsca" + +msgid "Finnish" +msgstr "Fincə" + +msgid "French" +msgstr "Fransızca" + +msgid "Frisian" +msgstr "Friscə" + +msgid "Irish" +msgstr "İrlandca" + +msgid "Scottish Gaelic" +msgstr "Şotland Keltcəsi" + +msgid "Galician" +msgstr "Qallik dili" + +msgid "Hebrew" +msgstr "İbranicə" + +msgid "Hindi" +msgstr "Hindcə" + +msgid "Croatian" +msgstr "Xorvatca" + +msgid "Upper Sorbian" +msgstr "Üst Sorbca" + +msgid "Hungarian" +msgstr "Macarca" + +msgid "Interlingua" +msgstr "İnterlinqua" + +msgid "Indonesian" +msgstr "İndonezcə" + +msgid "Ido" +msgstr "İdoca" + +msgid "Icelandic" +msgstr "İslandca" + +msgid "Italian" +msgstr "İtalyanca" + +msgid "Japanese" +msgstr "Yaponca" + +msgid "Georgian" +msgstr "Gürcücə" + +msgid "Kabyle" +msgstr "Kabile" + +msgid "Kazakh" +msgstr "Qazax" + +msgid "Khmer" +msgstr "Kxmercə" + +msgid "Kannada" +msgstr "Kannada dili" + +msgid "Korean" +msgstr "Koreyca" + +msgid "Luxembourgish" +msgstr "Lüksemburqca" + +msgid "Lithuanian" +msgstr "Litva dili" + +msgid "Latvian" +msgstr "Latviya dili" + +msgid "Macedonian" +msgstr "Makedonca" + +msgid "Malayalam" +msgstr "Malayamca" + +msgid "Mongolian" +msgstr "Monqolca" + +msgid "Marathi" +msgstr "Marathicə" + +msgid "Burmese" +msgstr "Burmescə" + +msgid "Norwegian Bokmål" +msgstr "Norveç Bukmolcası" + +msgid "Nepali" +msgstr "Nepal" + +msgid "Dutch" +msgstr "Flamandca" + +msgid "Norwegian Nynorsk" +msgstr "Nynorsk Norveçcəsi" + +msgid "Ossetic" +msgstr "Osetincə" + +msgid "Punjabi" +msgstr "Pancabicə" + +msgid "Polish" +msgstr "Polyakca" + +msgid "Portuguese" +msgstr "Portuqalca" + +msgid "Brazilian Portuguese" +msgstr "Braziliya Portuqalcası" + +msgid "Romanian" +msgstr "Rumınca" + +msgid "Russian" +msgstr "Rusca" + +msgid "Slovak" +msgstr "Slovakca" + +msgid "Slovenian" +msgstr "Slovencə" + +msgid "Albanian" +msgstr "Albanca" + +msgid "Serbian" +msgstr "Serbcə" + +msgid "Serbian Latin" +msgstr "Serbcə Latın" + +msgid "Swedish" +msgstr "İsveçcə" + +msgid "Swahili" +msgstr "Suahili" + +msgid "Tamil" +msgstr "Tamilcə" + +msgid "Telugu" +msgstr "Teluqu dili" + +msgid "Thai" +msgstr "Tayca" + +msgid "Turkish" +msgstr "Türkcə" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurtca" + +msgid "Ukrainian" +msgstr "Ukraynaca" + +msgid "Urdu" +msgstr "Urduca" + +msgid "Vietnamese" +msgstr "Vyetnamca" + +msgid "Simplified Chinese" +msgstr "Sadələşdirilmiş Çincə" + +msgid "Traditional Chinese" +msgstr "Ənənəvi Çincə" + +msgid "Messages" +msgstr "Mesajlar" + +msgid "Site Maps" +msgstr "Sayt Xəritələri" + +msgid "Static Files" +msgstr "Statik Fayllar" + +msgid "Syndication" +msgstr "Sindikasiya" + +msgid "That page number is not an integer" +msgstr "Səhifə nömrəsi rəqəm deyil" + +msgid "That page number is less than 1" +msgstr "Səhifə nömrəsi 1-dən balacadır" + +msgid "That page contains no results" +msgstr "Səhifədə nəticə yoxdur" + +msgid "Enter a valid value." +msgstr "Düzgün qiymət daxil edin." + +msgid "Enter a valid URL." +msgstr "Düzgün URL daxil edin." + +msgid "Enter a valid integer." +msgstr "Düzgün rəqəm daxil edin." + +msgid "Enter a valid email address." +msgstr "Düzgün e-poçt ünvanı daxil edin." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət düzgün " +"qısaltma daxil edin." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Keçərli Unicode hərfləri, rəqəmlər, alt xətt və ya defis olan 'slug' daxil " +"edin." + +msgid "Enter a valid IPv4 address." +msgstr "Düzgün IPv4 ünvanı daxil edin." + +msgid "Enter a valid IPv6 address." +msgstr "Düzgün IPv6 ünvanını daxil edin." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Düzgün IPv4 və ya IPv6 ünvanını daxil edin." + +msgid "Enter only digits separated by commas." +msgstr "Vergüllə ayırmaqla yalnız rəqəmlər daxil edin." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Əmin edin ki, bu qiymət %(limit_value)s-dir (bu %(show_value)s-dir)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan kiçik olduğunu yoxlayın." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan böyük olduğunu yoxlayın." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"var)" +msgstr[1] "" +"Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"var)" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"var)" +msgstr[1] "" +"Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " +"var)" + +msgid "Enter a number." +msgstr "Ədəd daxil edin." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." +msgstr[1] "Toplamda %(max)s rəqəmdən çox olmadığına əmin olun." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." +msgstr[1] "Onluq hissənin %(max)s rəqəmdən çox olmadığına əmin olun." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." +msgstr[1] "Onluq hissədən əvvəl %(max)s rəqəmdən çox olmadığına əmin olun." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"'%(extension)s' fayl uzantısına icazə verilmir. İcazə verilən fayl " +"uzantıları: '%(allowed_extensions)s'" + +msgid "Null characters are not allowed." +msgstr "Null simvollara icazə verilmir." + +msgid "and" +msgstr "və" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(field_labels)s ilə %(model_name)s artıq mövcuddur." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r dəyəri doğru seçim deyil." + +msgid "This field cannot be null." +msgstr "Bu sahə boş qala bilməz." + +msgid "This field cannot be blank." +msgstr "Bu sahə ağ qala bilməz." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s bu %(field_label)s sahə ilə artıq mövcuddur." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s dəyəri %(date_field_label)s %(lookup_type)s üçün unikal " +"olmalıdır." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Sahənin tipi: %(field_type)s" + +msgid "Integer" +msgstr "Tam ədəd" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' dəyəri tam rəqəm olmalıdır." + +msgid "Big (8 byte) integer" +msgstr "Böyük (8 bayt) tam ədəd" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' dəyəri True və ya False olmalıdır." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' dəyəri True, False və ya None olmalıdır." + +msgid "Boolean (Either True or False)" +msgstr "Bul (ya Doğru, ya Yalan)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Sətir (%(max_length)s simvola kimi)" + +msgid "Comma-separated integers" +msgstr "Vergüllə ayrılmış tam ədədlər" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' dəyəri səhv tarix formatındadır. Formatı YYYY-MM-DD olmalıdır." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s dəyəri düzgün formatdadır (YYYY-MM-DD) amma bu xətalı tarixdir." + +msgid "Date (without time)" +msgstr "Tarix (saatsız)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' dəyərinin formatı səhvdir. Formatı YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ] olmalıdır." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' dəyərinin formatı düzgündür (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"ancaq tarix səhvdir." + +msgid "Date (with time)" +msgstr "Tarix (vaxt ilə)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' dəyəri decimal rəqəm olmalıdır." + +msgid "Decimal number" +msgstr "Rasional ədəd" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' dəyərinin formatı səhvdir. Formatı [DD] [HH:[MM:]]ss[.uuuuuu] " +"olmalıdır." + +msgid "Duration" +msgstr "Müddət" + +msgid "Email address" +msgstr "E-poçt" + +msgid "File path" +msgstr "Faylın ünvanı" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' dəyəri float olmalıdır." + +msgid "Floating point number" +msgstr "Sürüşən vergüllü ədəd" + +msgid "IPv4 address" +msgstr "IPv4 ünvanı" + +msgid "IP address" +msgstr "IP ünvan" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' dəyəri None, True və ya False olmalıdır." + +msgid "Boolean (Either True, False or None)" +msgstr "Bul (Ya Doğru, ya Yalan, ya da Heç nə)" + +msgid "Positive integer" +msgstr "Müsbət tam ədəd" + +msgid "Positive small integer" +msgstr "Müsbət tam kiçik ədəd" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Əzmə (%(max_length)s simvola kimi)" + +msgid "Small integer" +msgstr "Kiçik tam ədəd" + +msgid "Text" +msgstr "Mətn" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' dəyərinin formatı səhvdir. Formatı HH:MM[:ss[.uuuuuu]] olmalıdır." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' dəyəri düzgün formatdadır (HH:MM[:ss[.uuuuuu]]), ancaq vaxtı " +"səhvdir." + +msgid "Time" +msgstr "Vaxt" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Düz ikili (binary) məlumat" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' keçərli UUID deyil." + +msgid "File" +msgstr "Fayl" + +msgid "Image" +msgstr "Şəkil" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(field)s dəyəri %(value)r olan %(model)s mövcud deyil." + +msgid "Foreign Key (type determined by related field)" +msgstr "Xarici açar (bağlı olduğu sahəyə uyğun tipi alır)" + +msgid "One-to-one relationship" +msgstr "Birin-birə münasibət" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s əlaqəsi" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s əlaqələri" + +msgid "Many-to-many relationship" +msgstr "Çoxun-çoxa münasibət" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Bu sahə vacibdir." + +msgid "Enter a whole number." +msgstr "Tam ədəd daxil edin." + +msgid "Enter a valid date." +msgstr "Düzgün tarix daxil edin." + +msgid "Enter a valid time." +msgstr "Düzgün vaxt daxil edin." + +msgid "Enter a valid date/time." +msgstr "Düzgün tarix/vaxt daxil edin." + +msgid "Enter a valid duration." +msgstr "Keçərli müddət daxil edin." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Günlərin sayı {min_days} ilə {max_days} arasında olmalıdır." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Fayl göndərilməyib. Vərəqənin (\"form\") şifrələmə tipini yoxlayın." + +msgid "No file was submitted." +msgstr "Fayl göndərilməyib." + +msgid "The submitted file is empty." +msgstr "Göndərilən fayl boşdur." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." +msgstr[1] "" +"Bu fayl adının ən çox %(max)d simvol olduğuna əmin olun (%(length)d var)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Ya fayl göndərin, ya da xanaya quş qoymayın, hər ikisini də birdən etməyin." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Düzgün şəkil göndərin. Göndərdiyiniz fayl ya şəkil deyil, ya da şəkildə " +"problem var." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Düzgün seçim edin. %(value)s seçimlər arasında yoxdur." + +msgid "Enter a list of values." +msgstr "Qiymətlərin siyahısını daxil edin." + +msgid "Enter a complete value." +msgstr "Tam dəyər daxil edin." + +msgid "Enter a valid UUID." +msgstr "Keçərli UUID daxil et." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Gizli %(name)s sahəsi) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm məlumatları əksikdir və ya korlanıb" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Lütfən %d və ya daha az forma göndərin." +msgstr[1] "Lütfən %d və ya daha az forma göndərin." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Lütfən %d və ya daha çox forma göndərin." +msgstr[1] "Lütfən %d və ya daha çox forma göndərin." + +msgid "Order" +msgstr "Sırala" + +msgid "Delete" +msgstr "Sil" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onların hamısı " +"fərqli olmalıdır." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s sahəsinə görə təkrarlanan məlumatlara düzəliş edin, onlar " +"%(date_field)s %(lookup)s-a görə fərqli olmalıdır." + +msgid "Please correct the duplicate values below." +msgstr "Aşağıda təkrarlanan qiymətlərə düzəliş edin." + +msgid "The inline value did not match the parent instance." +msgstr "Sətiriçi dəyər ana nüsxəyə uyğun deyil." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Düzgün seçim edin. Bu seçim mümkün deyil." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" düzgün dəyər deyil." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s %(current_timezone)s zaman qurşağında ifadə oluna bilmir; ya " +"duallıq, ya da yanlışlıq var." + +msgid "Clear" +msgstr "Təmizlə" + +msgid "Currently" +msgstr "Hal-hazırda" + +msgid "Change" +msgstr "Dəyiş" + +msgid "Unknown" +msgstr "Məlum deyil" + +msgid "Yes" +msgstr "Hə" + +msgid "No" +msgstr "Yox" + +msgid "yes,no,maybe" +msgstr "hə,yox,bəlkə" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bayt" +msgstr[1] "%(size)d bayt" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s QB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "gecə yarısı" + +msgid "noon" +msgstr "günorta" + +msgid "Monday" +msgstr "Bazar ertəsi" + +msgid "Tuesday" +msgstr "Çərşənbə axşamı" + +msgid "Wednesday" +msgstr "Çərşənbə" + +msgid "Thursday" +msgstr "Cümə axşamı" + +msgid "Friday" +msgstr "Cümə" + +msgid "Saturday" +msgstr "Şənbə" + +msgid "Sunday" +msgstr "Bazar" + +msgid "Mon" +msgstr "B.e" + +msgid "Tue" +msgstr "Ç.a" + +msgid "Wed" +msgstr "Çrş" + +msgid "Thu" +msgstr "C.a" + +msgid "Fri" +msgstr "Cüm" + +msgid "Sat" +msgstr "Şnb" + +msgid "Sun" +msgstr "Bzr" + +msgid "January" +msgstr "Yanvar" + +msgid "February" +msgstr "Fevral" + +msgid "March" +msgstr "Mart" + +msgid "April" +msgstr "Aprel" + +msgid "May" +msgstr "May" + +msgid "June" +msgstr "İyun" + +msgid "July" +msgstr "İyul" + +msgid "August" +msgstr "Avqust" + +msgid "September" +msgstr "Sentyabr" + +msgid "October" +msgstr "Oktyabr" + +msgid "November" +msgstr "Noyabr" + +msgid "December" +msgstr "Dekabr" + +msgid "jan" +msgstr "ynv" + +msgid "feb" +msgstr "fvr" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "may" + +msgid "jun" +msgstr "iyn" + +msgid "jul" +msgstr "iyl" + +msgid "aug" +msgstr "avq" + +msgid "sep" +msgstr "snt" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "noy" + +msgid "dec" +msgstr "dek" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Yan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Fev." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mart" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Aprel" + +msgctxt "abbrev. month" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month" +msgid "June" +msgstr "İyun" + +msgctxt "abbrev. month" +msgid "July" +msgstr "İyul" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Avq." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sent." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Noy." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dek." + +msgctxt "alt. month" +msgid "January" +msgstr "Yanvar" + +msgctxt "alt. month" +msgid "February" +msgstr "Fevral" + +msgctxt "alt. month" +msgid "March" +msgstr "Mart" + +msgctxt "alt. month" +msgid "April" +msgstr "Aprel" + +msgctxt "alt. month" +msgid "May" +msgstr "May" + +msgctxt "alt. month" +msgid "June" +msgstr "İyun" + +msgctxt "alt. month" +msgid "July" +msgstr "İyul" + +msgctxt "alt. month" +msgid "August" +msgstr "Avqust" + +msgctxt "alt. month" +msgid "September" +msgstr "Sentyabr" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktyabr" + +msgctxt "alt. month" +msgid "November" +msgstr "Noyabr" + +msgctxt "alt. month" +msgid "December" +msgstr "Dekabr" + +msgid "This is not a valid IPv6 address." +msgstr "Bu doğru IPv6 ünvanı deyil." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "və ya" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d il" +msgstr[1] "%d il" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ay" +msgstr[1] "%d ay" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d həftə" +msgstr[1] "%d həftə" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dəqiqə" +msgstr[1] "%d dəqiqə" + +msgid "0 minutes" +msgstr "0 dəqiqə" + +msgid "Forbidden" +msgstr "Qadağan" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF təsdiqləmə alınmadı. Sorğu ləğv edildi." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Bu HTTPS sayt səyyahınız tərəfindən 'Referer header' göndərilməsini tələb " +"edir, amma göndərilmir. Bu başlıq səyyahınızın üçüncü biri tərəfindən hack-" +"lənmədiyinə əmin olmaq üçün istifadə edilir." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Əgər səyyahınızın 'Referer' başlığını göndərməsini söndürmüsünüzsə, lütfən " +"bu sayt üçün, HTTPS əlaqələr üçün və ya 'same-origin' sorğular üçün aktiv " +"edin." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Əgər etiketini və ya " +"'Referrer-Policy: no-referrer' başlığını işlədirsinizsə, lütfən silin. CSRF " +"qoruma dəqiq yönləndirən yoxlaması üçün 'Referer' başlığını tələb edir. Əgər " +"məxfilik üçün düşünürsünüzsə, üçüncü tərəf sayt keçidləri üçün kimi bir alternativ işlədin." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Bu sayt formaları göndərmək üçün CSRF çərəzini işlədir. Bu çərəz " +"səyyahınızın üçüncü biri tərəfindən hack-lənmədiyinə əmin olmaq üçün " +"istifadə edilir. " + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Əgər səyyahınızda çərəzlər söndürülübsə, lütfən bu sayt və ya 'same-origin' " +"sorğular üçün aktiv edin." + +msgid "More information is available with DEBUG=True." +msgstr "Daha ətraflı məlumat DEBUG=True ilə mövcuddur." + +msgid "No year specified" +msgstr "İl göstərilməyib" + +msgid "Date out of range" +msgstr "Tarix aralığın xaricindədir" + +msgid "No month specified" +msgstr "Ay göstərilməyib" + +msgid "No day specified" +msgstr "Gün göstərilməyib" + +msgid "No week specified" +msgstr "Həftə göstərilməyib" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s seçmək mümkün deyil" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Gələcək %(verbose_name_plural)s seçmək mümkün deyil, çünki %(class_name)s." +"allow_future Yalan kimi qeyd olunub." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "\"%(format)s\" formatına görə \"%(datestr)s\" tarixi düzgün deyil" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Sorğuya uyğun %(verbose_name)s tapılmadı" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Səhifə nə \"axırıncı\"dır, nə də tam ədədə çevirmək mümkündür." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Qeyri-düzgün səhifə (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Siyahı boşdur və '%(class_name)s.allow_empty' Yalan kimi qeyd olunub." + +msgid "Directory indexes are not allowed here." +msgstr "Ünvan indekslərinə icazə verilmir." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" mövcud deyil" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s-nin indeksi" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: tələsən mükəmməlləkçilər üçün Web framework." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django %(version)s üçün buraxılış " +"qeydlərinə baxın" + +msgid "The install worked successfully! Congratulations!" +msgstr "Quruluş uğurla tamamlandı! Təbriklər!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Tənzimləmə faylınızda DEBUG=True və heç bir URL qurmadığınız üçün bu səhifəni görürsünüz." + +msgid "Django Documentation" +msgstr "Django Sənədləri" + +msgid "Topics, references, & how-to's" +msgstr "Mövzular, istinadlar və nümunələr" + +msgid "Tutorial: A Polling App" +msgstr "Məşğələ: Səsvermə Tətbiqi" + +msgid "Get started with Django" +msgstr "Django-ya başla" + +msgid "Django Community" +msgstr "Django İcması" + +msgid "Connect, get help, or contribute" +msgstr "Qoşul, kömək al və dəstək ol" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/az/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/az/formats.py new file mode 100644 index 0000000..49dd0fa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/az/formats.py @@ -0,0 +1,32 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j E Y' +TIME_FORMAT = 'G:i' +DATETIME_FORMAT = 'j E Y, G:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'd.m.Y' +SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d.%m.%Y', # '25.10.2006' + '%d.%m.%y', # '25.10.06' +] +DATETIME_INPUT_FORMATS = [ + '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + '%d.%m.%Y', # '25.10.2006' + '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' + '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' + '%d.%m.%y %H:%M', # '25.10.06 14:30' + '%d.%m.%y', # '25.10.06' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..84f6e43 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/be/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/bg/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/bg/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po new file mode 100644 index 0000000..05aeea1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/bn/LC_MESSAGES/django.po @@ -0,0 +1,1191 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# M Nasimul Haque , 2013 +# Tahmid Rafi , 2012-2013 +# Tahmid Rafi , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bengali (http://www.transifex.com/django/django/language/" +"bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "আফ্রিকার অন্যতম সরকারি ভাষা" + +msgid "Arabic" +msgstr "আরবী" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "আজারবাইজানি" + +msgid "Bulgarian" +msgstr "বুলগেরিয়ান" + +msgid "Belarusian" +msgstr "বেলারুশীয়" + +msgid "Bengali" +msgstr "বাংলা" + +msgid "Breton" +msgstr "ব্রেটন" + +msgid "Bosnian" +msgstr "বসনিয়ান" + +msgid "Catalan" +msgstr "ক্যাটালান" + +msgid "Czech" +msgstr "চেক" + +msgid "Welsh" +msgstr "ওয়েল্স" + +msgid "Danish" +msgstr "ড্যানিশ" + +msgid "German" +msgstr "জার্মান" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "গ্রিক" + +msgid "English" +msgstr "ইংলিশ" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "বৃটিশ ইংলিশ" + +msgid "Esperanto" +msgstr "আন্তর্জাতিক ভাষা" + +msgid "Spanish" +msgstr "স্প্যানিশ" + +msgid "Argentinian Spanish" +msgstr "আর্জেন্টিনিয়ান স্প্যানিশ" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "মেক্সিকান স্প্যানিশ" + +msgid "Nicaraguan Spanish" +msgstr "নিকারাগুয়ান স্প্যানিশ" + +msgid "Venezuelan Spanish" +msgstr "ভেনেজুয়েলার স্প্যানিশ" + +msgid "Estonian" +msgstr "এস্তোনিয়ান" + +msgid "Basque" +msgstr "বাস্ক" + +msgid "Persian" +msgstr "ফারসি" + +msgid "Finnish" +msgstr "ফিনিশ" + +msgid "French" +msgstr "ফ্রেঞ্চ" + +msgid "Frisian" +msgstr "ফ্রিজ্ল্যানডের ভাষা" + +msgid "Irish" +msgstr "আইরিশ" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "গ্যালিসিয়ান" + +msgid "Hebrew" +msgstr "হিব্রু" + +msgid "Hindi" +msgstr "হিন্দী" + +msgid "Croatian" +msgstr "ক্রোয়েশিয়ান" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "হাঙ্গেরিয়ান" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "ইন্দোনেশিয়ান" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "আইসল্যান্ডিক" + +msgid "Italian" +msgstr "ইটালিয়ান" + +msgid "Japanese" +msgstr "জাপানিজ" + +msgid "Georgian" +msgstr "জর্জিয়ান" + +msgid "Kazakh" +msgstr "কাজাখ" + +msgid "Khmer" +msgstr "খমার" + +msgid "Kannada" +msgstr "কান্নাড়া" + +msgid "Korean" +msgstr "কোরিয়ান" + +msgid "Luxembourgish" +msgstr "লুক্সেমবার্গীয়" + +msgid "Lithuanian" +msgstr "লিথুয়ানিয়ান" + +msgid "Latvian" +msgstr "লাটভিয়ান" + +msgid "Macedonian" +msgstr "ম্যাসাডোনিয়ান" + +msgid "Malayalam" +msgstr "মালায়ালম" + +msgid "Mongolian" +msgstr "মঙ্গোলিয়ান" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "বার্মিজ" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "নেপালি" + +msgid "Dutch" +msgstr "ডাচ" + +msgid "Norwegian Nynorsk" +msgstr "নরওয়েজীয়ান নিনর্স্ক" + +msgid "Ossetic" +msgstr "অসেটিক" + +msgid "Punjabi" +msgstr "পাঞ্জাবী" + +msgid "Polish" +msgstr "পোলিশ" + +msgid "Portuguese" +msgstr "পর্তুগীজ" + +msgid "Brazilian Portuguese" +msgstr "ব্রাজিলিয়ান পর্তুগীজ" + +msgid "Romanian" +msgstr "রোমানিয়ান" + +msgid "Russian" +msgstr "রাশান" + +msgid "Slovak" +msgstr "স্লোভাক" + +msgid "Slovenian" +msgstr "স্লোভেনিয়ান" + +msgid "Albanian" +msgstr "আলবেনীয়ান" + +msgid "Serbian" +msgstr "সার্বিয়ান" + +msgid "Serbian Latin" +msgstr "সার্বিয়ান ল্যাটিন" + +msgid "Swedish" +msgstr "সুইডিশ" + +msgid "Swahili" +msgstr "সোয়াহিলি" + +msgid "Tamil" +msgstr "তামিল" + +msgid "Telugu" +msgstr "তেলেগু" + +msgid "Thai" +msgstr "থাই" + +msgid "Turkish" +msgstr "তুর্কি" + +msgid "Tatar" +msgstr "তাতারদেশীয়" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "ইউক্রেনিয়ান" + +msgid "Urdu" +msgstr "উর্দু" + +msgid "Vietnamese" +msgstr "ভিয়েতনামিজ" + +msgid "Simplified Chinese" +msgstr "সরলীকৃত চাইনীজ" + +msgid "Traditional Chinese" +msgstr "প্রচলিত চাইনীজ" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "একটি বৈধ মান দিন।" + +msgid "Enter a valid URL." +msgstr "বৈধ URL দিন" + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "একটি বৈধ ইমেইল ঠিকানা লিখুন." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"বৈধ ’slug' প্রবেশ করান যাতে শুধুমাত্র ইংরেজী বর্ণ, অঙ্ক, আন্ডারস্কোর অথবা হাইফেন " +"রয়েছে।" + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "একটি বৈধ IPv4 ঠিকানা দিন।" + +msgid "Enter a valid IPv6 address." +msgstr "একটি বৈধ IPv6 ঠিকানা টাইপ করুন।" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "একটি বৈধ IPv4 অথবা IPv6 ঠিকানা টাইপ করুন।" + +msgid "Enter only digits separated by commas." +msgstr "শুধুমাত্র কমা দিয়ে সংখ্যা দিন।" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "সংখ্যাটির মান %(limit_value)s হতে হবে (এটা এখন %(show_value)s আছে)।" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে ছোট বা সমান হতে হবে।" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "সংখ্যাটির মান %(limit_value)s এর চেয়ে বড় বা সমান হতে হবে।" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "এবং" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "এর মান null হতে পারবে না।" + +msgid "This field cannot be blank." +msgstr "এই ফিল্ডের মান ফাঁকা হতে পারে না" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(field_label)s সহ %(model_name)s আরেকটি রয়েছে।" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "ফিল্ডের ধরণ: %(field_type)s" + +msgid "Integer" +msgstr "ইন্টিজার" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "বিগ (৮ বাইট) ইন্টিজার" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "বুলিয়ান (হয় True অথবা False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "স্ট্রিং (সর্বোচ্চ %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "কমা দিয়ে আলাদা করা ইন্টিজার" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "তারিখ (সময় বাদে)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "তারিখ (সময় সহ)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "দশমিক সংখ্যা" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "ইমেইল ঠিকানা" + +msgid "File path" +msgstr "ফাইল পথ" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "ফ্লোটিং পয়েন্ট সংখ্যা" + +msgid "IPv4 address" +msgstr "IPv4 ঠিকানা" + +msgid "IP address" +msgstr "আইপি ঠিকানা" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "বুলিয়ান (হয় True, False অথবা None)" + +msgid "Positive integer" +msgstr "পজিটিভ ইন্টিজার" + +msgid "Positive small integer" +msgstr "পজিটিভ স্মল ইন্টিজার" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "স্লাগ (সর্বোচ্চ %(max_length)s)" + +msgid "Small integer" +msgstr "স্মল ইন্টিজার" + +msgid "Text" +msgstr "টেক্সট" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "সময়" + +msgid "URL" +msgstr "ইউআরএল (URL)" + +msgid "Raw binary data" +msgstr "র বাইনারি ডাটা" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "ফাইল" + +msgid "Image" +msgstr "ইমেজ" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "ফরেন কি (টাইপ রিলেটেড ফিল্ড দ্বারা নির্ণীত হবে)" + +msgid "One-to-one relationship" +msgstr "ওয়ান-টু-ওয়ান রিলেশানশিপ" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "ম্যানি-টু-ম্যানি রিলেশানশিপ" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "এটি আবশ্যক।" + +msgid "Enter a whole number." +msgstr "একটি পূর্ণসংখ্যা দিন" + +msgid "Enter a number." +msgstr "একটি সংখ্যা প্রবেশ করান।" + +msgid "Enter a valid date." +msgstr "বৈধ তারিখ দিন।" + +msgid "Enter a valid time." +msgstr "বৈধ সময় দিন।" + +msgid "Enter a valid date/time." +msgstr "বৈধ তারিখ/সময় দিন।" + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "কোন ফাইল দেয়া হয়নি। ফর্মের এনকোডিং ঠিক আছে কিনা দেখুন।" + +msgid "No file was submitted." +msgstr "কোন ফাইল দেয়া হয়নি।" + +msgid "The submitted file is empty." +msgstr "ফাইলটি খালি।" + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"একটি ফাইল সাবমিট করুন অথবা ক্লিয়ার চেকবক্সটি চেক করে দিন, যে কোন একটি করুন।" + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"সঠিক ছবি আপলোড করুন। যে ফাইলটি আপলোড করা হয়েছে তা হয় ছবি নয় অথবা নষ্ট হয়ে " +"যাওয়া ছবি।" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "%(value)s বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" + +msgid "Enter a list of values." +msgstr "কয়েকটি মানের তালিকা দিন।" + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "ক্রম" + +msgid "Delete" +msgstr "মুছুন" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +msgid "Please correct the duplicate values below." +msgstr "" + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "এটি বৈধ নয়। অনুগ্রহ করে আরেকটি সিলেক্ট করুন।" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "পরিষ্কার করুন" + +msgid "Currently" +msgstr "এই মুহুর্তে" + +msgid "Change" +msgstr "পরিবর্তন" + +msgid "Unknown" +msgstr "অজানা" + +msgid "Yes" +msgstr "হ্যাঁ" + +msgid "No" +msgstr "না" + +msgid "yes,no,maybe" +msgstr "হ্যাঁ,না,হয়তো" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d বাইট" +msgstr[1] "%(size)d বাইট" + +#, python-format +msgid "%s KB" +msgstr "%s কিলোবাইট" + +#, python-format +msgid "%s MB" +msgstr "%s মেগাবাইট" + +#, python-format +msgid "%s GB" +msgstr "%s গিগাবাইট" + +#, python-format +msgid "%s TB" +msgstr "%s টেরাবাইট" + +#, python-format +msgid "%s PB" +msgstr "%s পেটাবাইট" + +msgid "p.m." +msgstr "অপরাহ্ন" + +msgid "a.m." +msgstr "পূর্বাহ্ন" + +msgid "PM" +msgstr "অপরাহ্ন" + +msgid "AM" +msgstr "পূর্বাহ্ন" + +msgid "midnight" +msgstr "মধ্যরাত" + +msgid "noon" +msgstr "দুপুর" + +msgid "Monday" +msgstr "সোমবার" + +msgid "Tuesday" +msgstr "মঙ্গলবার" + +msgid "Wednesday" +msgstr "বুধবার" + +msgid "Thursday" +msgstr "বৃহস্পতিবার" + +msgid "Friday" +msgstr "শুক্রবার" + +msgid "Saturday" +msgstr "শনিবার" + +msgid "Sunday" +msgstr "রবিবার" + +msgid "Mon" +msgstr "সোম" + +msgid "Tue" +msgstr "মঙ্গল" + +msgid "Wed" +msgstr "বুধ" + +msgid "Thu" +msgstr "বৃহঃ" + +msgid "Fri" +msgstr "শুক্র" + +msgid "Sat" +msgstr "শনি" + +msgid "Sun" +msgstr "রবি" + +msgid "January" +msgstr "জানুয়ারি" + +msgid "February" +msgstr "ফেব্রুয়ারি" + +msgid "March" +msgstr "মার্চ" + +msgid "April" +msgstr "এপ্রিল" + +msgid "May" +msgstr "মে" + +msgid "June" +msgstr "জুন" + +msgid "July" +msgstr "জুলাই" + +msgid "August" +msgstr "আগস্ট" + +msgid "September" +msgstr "সেপ্টেম্বর" + +msgid "October" +msgstr "অক্টোবর" + +msgid "November" +msgstr "নভেম্বর" + +msgid "December" +msgstr "ডিসেম্বর" + +msgid "jan" +msgstr "জান." + +msgid "feb" +msgstr "ফেব." + +msgid "mar" +msgstr "মার্চ" + +msgid "apr" +msgstr "এপ্রি." + +msgid "may" +msgstr "মে" + +msgid "jun" +msgstr "জুন" + +msgid "jul" +msgstr "জুল." + +msgid "aug" +msgstr "আগ." + +msgid "sep" +msgstr "সেপ্টে." + +msgid "oct" +msgstr "অক্টো." + +msgid "nov" +msgstr "নভে." + +msgid "dec" +msgstr "ডিসে." + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "জানু." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "ফেব্রু." + +msgctxt "abbrev. month" +msgid "March" +msgstr "মার্চ" + +msgctxt "abbrev. month" +msgid "April" +msgstr "এপ্রিল" + +msgctxt "abbrev. month" +msgid "May" +msgstr "মে" + +msgctxt "abbrev. month" +msgid "June" +msgstr "জুন" + +msgctxt "abbrev. month" +msgid "July" +msgstr "জুলাই" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "আগ." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "সেপ্ট." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "অক্টো." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "নভে." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "ডিসে." + +msgctxt "alt. month" +msgid "January" +msgstr "জানুয়ারি" + +msgctxt "alt. month" +msgid "February" +msgstr "ফেব্রুয়ারি" + +msgctxt "alt. month" +msgid "March" +msgstr "মার্চ" + +msgctxt "alt. month" +msgid "April" +msgstr "এপ্রিল" + +msgctxt "alt. month" +msgid "May" +msgstr "মে" + +msgctxt "alt. month" +msgid "June" +msgstr "জুন" + +msgctxt "alt. month" +msgid "July" +msgstr "জুলাই" + +msgctxt "alt. month" +msgid "August" +msgstr "আগস্ট" + +msgctxt "alt. month" +msgid "September" +msgstr "সেপ্টেম্বর" + +msgctxt "alt. month" +msgid "October" +msgstr "অক্টোবর" + +msgctxt "alt. month" +msgid "November" +msgstr "নভেম্বর" + +msgctxt "alt. month" +msgid "December" +msgstr "ডিসেম্বর" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "অথবা" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "0 মিনিট" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "কোন বছর উল্লেখ করা হয়নি" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "কোন মাস উল্লেখ করা হয়নি" + +msgid "No day specified" +msgstr "কোন দিন উল্লেখ করা হয়নি" + +msgid "No week specified" +msgstr "কোন সপ্তাহ উল্লেখ করা হয়নি" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "কোন %(verbose_name_plural)s নেই" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "কুয়েরি ম্যাচ করে এমন কোন %(verbose_name)s পাওয়া যায় নি" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "ডিরেক্টরি ইনডেক্স অনুমোদিত নয়" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" এর অস্তিত্ব নেই" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s এর ইনডেক্স" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/br/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..9c99f7c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,1259 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fulup , 2012,2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 00:21+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: br\n" +"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" +"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" +"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " +"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " +"&& n % 1000000 == 0) ? 3 : 4);\n" + +msgid "Afrikaans" +msgstr "Afrikaneg" + +msgid "Arabic" +msgstr "Arabeg" + +msgid "Asturian" +msgstr "Astureg" + +msgid "Azerbaijani" +msgstr "Azeri" + +msgid "Bulgarian" +msgstr "Bulgareg" + +msgid "Belarusian" +msgstr "Belaruseg" + +msgid "Bengali" +msgstr "Bengaleg" + +msgid "Breton" +msgstr "Brezhoneg" + +msgid "Bosnian" +msgstr "Bosneg" + +msgid "Catalan" +msgstr "Katalaneg" + +msgid "Czech" +msgstr "Tchekeg" + +msgid "Welsh" +msgstr "Kembraeg" + +msgid "Danish" +msgstr "Daneg" + +msgid "German" +msgstr "Alamaneg" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Gresianeg" + +msgid "English" +msgstr "Saozneg" + +msgid "Australian English" +msgstr "Saozneg Aostralia" + +msgid "British English" +msgstr "Saozneg Breizh-Veur" + +msgid "Esperanto" +msgstr "Esperanteg" + +msgid "Spanish" +msgstr "Spagnoleg" + +msgid "Argentinian Spanish" +msgstr "Spagnoleg Arc'hantina" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Spagnoleg Mec'hiko" + +msgid "Nicaraguan Spanish" +msgstr "Spagnoleg Nicaragua" + +msgid "Venezuelan Spanish" +msgstr "Spagnoleg Venezuela" + +msgid "Estonian" +msgstr "Estoneg" + +msgid "Basque" +msgstr "Euskareg" + +msgid "Persian" +msgstr "Perseg" + +msgid "Finnish" +msgstr "Finneg" + +msgid "French" +msgstr "Galleg" + +msgid "Frisian" +msgstr "Frizeg" + +msgid "Irish" +msgstr "Iwerzhoneg" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Galizeg" + +msgid "Hebrew" +msgstr "Hebraeg" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Kroateg" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Hungareg" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonezeg" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandeg" + +msgid "Italian" +msgstr "Italianeg" + +msgid "Japanese" +msgstr "Japaneg" + +msgid "Georgian" +msgstr "Jorjianeg" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "kazak" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannata" + +msgid "Korean" +msgstr "Koreaneg" + +msgid "Luxembourgish" +msgstr "Luksembourgeg" + +msgid "Lithuanian" +msgstr "Lituaneg" + +msgid "Latvian" +msgstr "Latveg" + +msgid "Macedonian" +msgstr "Makedoneg" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Mongoleg" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Burmese" +msgstr "Burmeg" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "nepaleg" + +msgid "Dutch" +msgstr "Nederlandeg" + +msgid "Norwegian Nynorsk" +msgstr "Norvegeg Nynorsk" + +msgid "Ossetic" +msgstr "Oseteg" + +msgid "Punjabi" +msgstr "Punjabeg" + +msgid "Polish" +msgstr "Poloneg" + +msgid "Portuguese" +msgstr "Portugaleg" + +msgid "Brazilian Portuguese" +msgstr "Portugaleg Brazil" + +msgid "Romanian" +msgstr "Roumaneg" + +msgid "Russian" +msgstr "Rusianeg" + +msgid "Slovak" +msgstr "Slovakeg" + +msgid "Slovenian" +msgstr "Sloveneg" + +msgid "Albanian" +msgstr "Albaneg" + +msgid "Serbian" +msgstr "Serbeg" + +msgid "Serbian Latin" +msgstr "Serbeg e lizherennoù latin" + +msgid "Swedish" +msgstr "Svedeg" + +msgid "Swahili" +msgstr "swahileg" + +msgid "Tamil" +msgstr "Tamileg" + +msgid "Telugu" +msgstr "Telougou" + +msgid "Thai" +msgstr "Thai" + +msgid "Turkish" +msgstr "Turkeg" + +msgid "Tatar" +msgstr "tatar" + +msgid "Udmurt" +msgstr "Oudmourteg" + +msgid "Ukrainian" +msgstr "Ukraineg" + +msgid "Urdu" +msgstr "Ourdou" + +msgid "Vietnamese" +msgstr "Vietnameg" + +msgid "Simplified Chinese" +msgstr "Sinaeg eeunaet" + +msgid "Traditional Chinese" +msgstr "Sinaeg hengounel" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "Tresoù al lec'hienn" + +msgid "Static Files" +msgstr "Restroù statek" + +msgid "Syndication" +msgstr "Sindikadur" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Merkit un talvoud reizh" + +msgid "Enter a valid URL." +msgstr "Merkit un URL reizh" + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Merkit ur chomlec'h postel reizh" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"N'hall bezañ er vaezienn-mañ nemet lizherennoù, niveroù, tiredoù izel _ ha " +"barrennigoù-stagañ." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Merkit ur chomlec'h IPv4 reizh." + +msgid "Enter a valid IPv6 address." +msgstr "Merkit ur chomlec'h IPv6 reizh." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Merkit ur chomlec'h IPv4 pe IPv6 reizh." + +msgid "Enter only digits separated by commas." +msgstr "Merkañ hepken sifroù dispartiet dre skejoù." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Bezit sur ez eo an talvoud-mañ %(limit_value)s (evit ar mare ez eo " +"%(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Gwiriit mat emañ an talvoud-mañ a-is pe par da %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Gwiriit mat emañ an talvoud-mañ a-us pe par da %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +msgid "Enter a number." +msgstr "Merkit un niver." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "ha" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "N'hall ket ar vaezienn chom goullo" + +msgid "This field cannot be blank." +msgstr "N'hall ket ar vaezienn chom goullo" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Bez' ez eus c'hoazh eus ur %(model_name)s gant ar %(field_label)s-mañ." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Seurt maezienn : %(field_type)s" + +msgid "Integer" +msgstr "Anterin" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Anterin bras (8 okted)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Boulean (gwir pe gaou)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "neudennad arouezennoù (betek %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Niveroù anterin dispartiet dre ur skej" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Deizad (hep eur)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Deizad (gant an eur)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Niver dekvedennel" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Chomlec'h postel" + +msgid "File path" +msgstr "Treug war-du ar restr" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Niver gant skej nij" + +msgid "IPv4 address" +msgstr "Chomlec'h IPv4" + +msgid "IP address" +msgstr "Chomlec'h IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Rekis eo d'an talvoud '%(value)s' bezañ par da Hini, Gwir pe Gaou." + +msgid "Boolean (Either True, False or None)" +msgstr "Boulean (gwir pe gaou pe netra)" + +msgid "Positive integer" +msgstr "Niver anterin pozitivel" + +msgid "Positive small integer" +msgstr "Niver anterin bihan pozitivel" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (betek %(max_length)s arouez.)" + +msgid "Small integer" +msgstr "Niver anterin bihan" + +msgid "Text" +msgstr "Testenn" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Eur" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Restr" + +msgid "Image" +msgstr "Skeudenn" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Alc'hwez estren (seurt termenet dre ar vaezienn liammet)" + +msgid "One-to-one relationship" +msgstr "Darempred unan-ouzh-unan" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Darempred lies-ouzh-lies" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Rekis eo leuniañ ar vaezienn." + +msgid "Enter a whole number." +msgstr "Merkit un niver anterin." + +msgid "Enter a valid date." +msgstr "Merkit un deiziad reizh" + +msgid "Enter a valid time." +msgstr "Merkit un eur reizh" + +msgid "Enter a valid date/time." +msgstr "Merkit un eur/deiziad reizh" + +msgid "Enter a valid duration." +msgstr "" + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "N'eus ket kaset restr ebet. Gwiriit ar seurt enkodañ evit ar restr" + +msgid "No file was submitted." +msgstr "N'eus bet kaset restr ebet." + +msgid "The submitted file is empty." +msgstr "Goullo eo ar restr kaset." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Kasit ur restr pe askit al log riñsañ; an eil pe egile" + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Enpozhiit ur skeudenn reizh. Ar seurt bet enporzhiet ganeoc'h a oa foeltret " +"pe ne oa ket ur skeudenn" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Dizuit un dibab reizh. %(value)s n'emañ ket e-touez an dibaboù posupl." + +msgid "Enter a list of values." +msgstr "Merkit ur roll talvoudoù" + +msgid "Enter a complete value." +msgstr "Merkañ un talvoud klok" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +msgid "Order" +msgstr "Urzh" + +msgid "Delete" +msgstr "Diverkañ" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Reizhit ar roadennoù e doubl e %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Reizhit ar roadennoù e doubl e %(field)s, na zle bezañ enni nemet talvoudoù " +"dzho o-unan." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Reizhit ar roadennoù e doubl e %(field_name)s a rank bezañ ennañ talvodoù en " +"o-unan evit lodenn %(lookup)s %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Reizhañ ar roadennoù e doubl zo a-is" + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Diuzit un dibab reizh. N'emañ ket an dibab-mañ e-touez ar re bosupl." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"N'eo ket bete komprenet an talvoud %(datetime)s er werzhid eur " +"%(current_timezone)s; pe eo amjestr pe n'eus ket anezhañ." + +msgid "Clear" +msgstr "Riñsañ" + +msgid "Currently" +msgstr "Evit ar mare" + +msgid "Change" +msgstr "Kemmañ" + +msgid "Unknown" +msgstr "Dianav" + +msgid "Yes" +msgstr "Ya" + +msgid "No" +msgstr "Ket" + +msgid "yes,no,maybe" +msgstr "ya, ket, marteze" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d okted" +msgstr[1] "%(size)d okted" +msgstr[2] "%(size)d okted" +msgstr[3] "%(size)d okted" +msgstr[4] "%(size)d okted" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "g.m." + +msgid "a.m." +msgstr "mintin" + +msgid "PM" +msgstr "G.M." + +msgid "AM" +msgstr "Mintin" + +msgid "midnight" +msgstr "hanternoz" + +msgid "noon" +msgstr "kreisteiz" + +msgid "Monday" +msgstr "Lun" + +msgid "Tuesday" +msgstr "Meurzh" + +msgid "Wednesday" +msgstr "Merc'her" + +msgid "Thursday" +msgstr "Yaou" + +msgid "Friday" +msgstr "Gwener" + +msgid "Saturday" +msgstr "Sadorn" + +msgid "Sunday" +msgstr "Sul" + +msgid "Mon" +msgstr "Lun" + +msgid "Tue" +msgstr "Meu" + +msgid "Wed" +msgstr "Mer" + +msgid "Thu" +msgstr "Yao" + +msgid "Fri" +msgstr "Gwe" + +msgid "Sat" +msgstr "Sad" + +msgid "Sun" +msgstr "Sul" + +msgid "January" +msgstr "Genver" + +msgid "February" +msgstr "C'hwevrer" + +msgid "March" +msgstr "Meurzh" + +msgid "April" +msgstr "Ebrel" + +msgid "May" +msgstr "Mae" + +msgid "June" +msgstr "Mezheven" + +msgid "July" +msgstr "Gouere" + +msgid "August" +msgstr "Eost" + +msgid "September" +msgstr "Gwengolo" + +msgid "October" +msgstr "Here" + +msgid "November" +msgstr "Du" + +msgid "December" +msgstr "Kerzu" + +msgid "jan" +msgstr "Gen" + +msgid "feb" +msgstr "C'hwe" + +msgid "mar" +msgstr "Meu" + +msgid "apr" +msgstr "Ebr" + +msgid "may" +msgstr "Mae" + +msgid "jun" +msgstr "Mez" + +msgid "jul" +msgstr "Gou" + +msgid "aug" +msgstr "Eos" + +msgid "sep" +msgstr "Gwe" + +msgid "oct" +msgstr "Her" + +msgid "nov" +msgstr "Du" + +msgid "dec" +msgstr "Kzu" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Gen." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "C'hwe." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Meu." + +msgctxt "abbrev. month" +msgid "April" +msgstr "Ebr." + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mae" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Mez." + +msgctxt "abbrev. month" +msgid "July" +msgstr "Gou." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Eos." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Gwe." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Her." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Du" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Kzu" + +msgctxt "alt. month" +msgid "January" +msgstr "Genver" + +msgctxt "alt. month" +msgid "February" +msgstr "C'hwevrer" + +msgctxt "alt. month" +msgid "March" +msgstr "Meurzh" + +msgctxt "alt. month" +msgid "April" +msgstr "Ebrel" + +msgctxt "alt. month" +msgid "May" +msgstr "Mae" + +msgctxt "alt. month" +msgid "June" +msgstr "Mezheven" + +msgctxt "alt. month" +msgid "July" +msgstr "Gouere" + +msgctxt "alt. month" +msgid "August" +msgstr "Eost" + +msgctxt "alt. month" +msgid "September" +msgstr "Gwengolo" + +msgctxt "alt. month" +msgid "October" +msgstr "Here" + +msgctxt "alt. month" +msgid "November" +msgstr "Du" + +msgctxt "alt. month" +msgid "December" +msgstr "Kerzu" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "pe" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d bloaz" +msgstr[1] "%d bloaz" +msgstr[2] "%d bloaz" +msgstr[3] "%d bloaz" +msgstr[4] "%d bloaz" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d miz" +msgstr[1] "%d miz" +msgstr[2] "%d miz" +msgstr[3] "%d miz" +msgstr[4] "%d miz" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d sizhun" +msgstr[1] "%d sizhun" +msgstr[2] "%d sizhun" +msgstr[3] "%d sizhun" +msgstr[4] "%d sizhun" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d deiz" +msgstr[1] "%d deiz" +msgstr[2] "%d deiz" +msgstr[3] "%d deiz" +msgstr[4] "%d deiz" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d eur" +msgstr[1] "%d eur" +msgstr[2] "%d eur" +msgstr[3] "%d eur" +msgstr[4] "%d eur" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d munud" +msgstr[1] "%d munud" +msgstr[2] "%d munud" +msgstr[3] "%d munud" +msgstr[4] "%d munud" + +msgid "0 minutes" +msgstr "0 munud" + +msgid "Forbidden" +msgstr "Difennet" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "N'eus bet resisaet bloavezh ebet" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "N'eus bet resisaet miz ebet" + +msgid "No day specified" +msgstr "N'eus bet resisaet deiz ebet" + +msgid "No week specified" +msgstr "N'eus bet resisaet sizhun ebet" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "N'eus %(verbose_name_plural)s ebet da gaout." + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"En dazont ne vo ket a %(verbose_name_plural)s rak faos eo %(class_name)s." +"allow_future." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"Direizh eo ar furmad '%(format)s' evit an neudennad deiziad '%(datestr)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" +"N'eus bet kavet traezenn %(verbose_name)s ebet o klotaén gant ar goulenn" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" +"N'eo ket 'last' ar bajenn na n'hall ket bezañ amdroet en un niver anterin." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Roll goullo ha faos eo '%(class_name)s.allow_empty'." + +msgid "Directory indexes are not allowed here." +msgstr "N'haller ket diskwel endalc'had ar c'havlec'h-mañ." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "N'eus ket eus \"%(path)s\"" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Meneger %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..57fec04 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..967fd81 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,1211 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Filip Dupanović , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "arapski" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Azerbejdžanski" + +msgid "Bulgarian" +msgstr "bugarski" + +msgid "Belarusian" +msgstr "" + +msgid "Bengali" +msgstr "bengalski" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "bosanski" + +msgid "Catalan" +msgstr "katalonski" + +msgid "Czech" +msgstr "češki" + +msgid "Welsh" +msgstr "velški" + +msgid "Danish" +msgstr "danski" + +msgid "German" +msgstr "njemački" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "grčki" + +msgid "English" +msgstr "engleski" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Britanski engleski" + +msgid "Esperanto" +msgstr "" + +msgid "Spanish" +msgstr "španski" + +msgid "Argentinian Spanish" +msgstr "Argentinski španski" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Meksički španski" + +msgid "Nicaraguan Spanish" +msgstr "Nikuaraganski španski" + +msgid "Venezuelan Spanish" +msgstr "" + +msgid "Estonian" +msgstr "estonski" + +msgid "Basque" +msgstr "baskijski" + +msgid "Persian" +msgstr "persijski" + +msgid "Finnish" +msgstr "finski" + +msgid "French" +msgstr "francuski" + +msgid "Frisian" +msgstr "frišanski" + +msgid "Irish" +msgstr "irski" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "galski" + +msgid "Hebrew" +msgstr "hebrejski" + +msgid "Hindi" +msgstr "hindi" + +msgid "Croatian" +msgstr "hrvatski" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "mađarski" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Indonežanski" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "islandski" + +msgid "Italian" +msgstr "italijanski" + +msgid "Japanese" +msgstr "japanski" + +msgid "Georgian" +msgstr "gruzijski" + +msgid "Kazakh" +msgstr "" + +msgid "Khmer" +msgstr "kambođanski" + +msgid "Kannada" +msgstr "kanada" + +msgid "Korean" +msgstr "korejski" + +msgid "Luxembourgish" +msgstr "" + +msgid "Lithuanian" +msgstr "litvanski" + +msgid "Latvian" +msgstr "latvijski" + +msgid "Macedonian" +msgstr "makedonski" + +msgid "Malayalam" +msgstr "Malajalamski" + +msgid "Mongolian" +msgstr "Mongolski" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Dutch" +msgstr "holandski" + +msgid "Norwegian Nynorsk" +msgstr "Norveški novi" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Pandžabi" + +msgid "Polish" +msgstr "poljski" + +msgid "Portuguese" +msgstr "portugalski" + +msgid "Brazilian Portuguese" +msgstr "brazilski portugalski" + +msgid "Romanian" +msgstr "rumunski" + +msgid "Russian" +msgstr "ruski" + +msgid "Slovak" +msgstr "slovački" + +msgid "Slovenian" +msgstr "slovenački" + +msgid "Albanian" +msgstr "albanski" + +msgid "Serbian" +msgstr "srpski" + +msgid "Serbian Latin" +msgstr "srpski latinski" + +msgid "Swedish" +msgstr "švedski" + +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "tamilski" + +msgid "Telugu" +msgstr "telugu" + +msgid "Thai" +msgstr "tajlandski" + +msgid "Turkish" +msgstr "turski" + +msgid "Tatar" +msgstr "" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "ukrajinski" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "vijetnamežanski" + +msgid "Simplified Chinese" +msgstr "novokineski" + +msgid "Traditional Chinese" +msgstr "starokineski" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Unesite ispravnu vrijednost." + +msgid "Enter a valid URL." +msgstr "Unesite ispravan URL." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Unesite ispravan „slug“, koji se sastoji od slova, brojki, donjih crta ili " +"crtica." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Unesite ispravnu IPv4 adresu." + +msgid "Enter a valid IPv6 address." +msgstr "" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +msgid "Enter only digits separated by commas." +msgstr "Unesite samo brojke razdvojene zapetama." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Pobrinite se da je ova vrijednost %(limit_value)s (trenutno je " +"%(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Ova vrijednost mora da bude manja ili jednaka %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Ova vrijednost mora biti veća ili jednaka %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "i" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Ovo polje ne može ostati prazno." + +msgid "This field cannot be blank." +msgstr "Ovo polje ne može biti prazno." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s sa ovom vrijednošću %(field_label)s već postoji." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Polje tipa: %(field_type)s" + +msgid "Integer" +msgstr "Cijeo broj" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Big (8 bajtni) integer" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Bulova vrijednost (True ili False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (najviše %(max_length)s znakova)" + +msgid "Comma-separated integers" +msgstr "Cijeli brojevi razdvojeni zapetama" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Datum (bez vremena)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Datum (sa vremenom)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Decimalni broj" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Email adresa" + +msgid "File path" +msgstr "Putanja fajla" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Broj sa pokrenom zapetom" + +msgid "IPv4 address" +msgstr "" + +msgid "IP address" +msgstr "IP adresa" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Bulova vrijednost (True, False ili None)" + +msgid "Positive integer" +msgstr "" + +msgid "Positive small integer" +msgstr "" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +msgid "Small integer" +msgstr "" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Vrijeme" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "" + +msgid "Image" +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Strani ključ (tip određen povezanim poljem)" + +msgid "One-to-one relationship" +msgstr "Jedan-na-jedan odnos" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Više-na-više odsnos" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Ovo polje se mora popuniti." + +msgid "Enter a whole number." +msgstr "Unesite cijeo broj." + +msgid "Enter a number." +msgstr "Unesite broj." + +msgid "Enter a valid date." +msgstr "Unesite ispravan datum." + +msgid "Enter a valid time." +msgstr "Unesite ispravno vrijeme" + +msgid "Enter a valid date/time." +msgstr "Unesite ispravan datum/vrijeme." + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Fajl nije prebačen. Provjerite tip enkodiranja formulara." + +msgid "No file was submitted." +msgstr "Fajl nije prebačen." + +msgid "The submitted file is empty." +msgstr "Prebačen fajl je prazan." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je " +"oštećen." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"%(value)s nije među ponuđenim vrijednostima. Odaberite jednu od ponuđenih." + +msgid "Enter a list of values." +msgstr "Unesite listu vrijednosti." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Order" +msgstr "Redoslijed" + +msgid "Delete" +msgstr "Obriši" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Ispravite dupli sadržaj za polja: %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Ispravite dupli sadržaj za polja: %(field)s, koji mora da bude jedinstven." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Ispravite dupli sadržaj za polja: %(field_name)s, koji mora da bude " +"jedinstven za %(lookup)s u %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Ispravite duple vrijednosti dole." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Odabrana vrijednost nije među ponuđenima. Odaberite jednu od ponuđenih." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "Očisti" + +msgid "Currently" +msgstr "Trenutno" + +msgid "Change" +msgstr "Izmjeni" + +msgid "Unknown" +msgstr "Nepoznato" + +msgid "Yes" +msgstr "Da" + +msgid "No" +msgstr "Ne" + +msgid "yes,no,maybe" +msgstr "da,ne,možda" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "po p." + +msgid "a.m." +msgstr "prije p." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "ponoć" + +msgid "noon" +msgstr "podne" + +msgid "Monday" +msgstr "ponedjeljak" + +msgid "Tuesday" +msgstr "utorak" + +msgid "Wednesday" +msgstr "srijeda" + +msgid "Thursday" +msgstr "četvrtak" + +msgid "Friday" +msgstr "petak" + +msgid "Saturday" +msgstr "subota" + +msgid "Sunday" +msgstr "nedjelja" + +msgid "Mon" +msgstr "pon." + +msgid "Tue" +msgstr "uto." + +msgid "Wed" +msgstr "sri." + +msgid "Thu" +msgstr "čet." + +msgid "Fri" +msgstr "pet." + +msgid "Sat" +msgstr "sub." + +msgid "Sun" +msgstr "ned." + +msgid "January" +msgstr "januar" + +msgid "February" +msgstr "februar" + +msgid "March" +msgstr "mart" + +msgid "April" +msgstr "april" + +msgid "May" +msgstr "maj" + +msgid "June" +msgstr "juni" + +msgid "July" +msgstr "juli" + +msgid "August" +msgstr "august" + +msgid "September" +msgstr "septembar" + +msgid "October" +msgstr "oktobar" + +msgid "November" +msgstr "novembar" + +msgid "December" +msgstr "decembar" + +msgid "jan" +msgstr "jan." + +msgid "feb" +msgstr "feb." + +msgid "mar" +msgstr "mar." + +msgid "apr" +msgstr "apr." + +msgid "may" +msgstr "maj." + +msgid "jun" +msgstr "jun." + +msgid "jul" +msgstr "jul." + +msgid "aug" +msgstr "aug." + +msgid "sep" +msgstr "sep." + +msgid "oct" +msgstr "okt." + +msgid "nov" +msgstr "nov." + +msgid "dec" +msgstr "dec." + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mart" + +msgctxt "abbrev. month" +msgid "April" +msgstr "April" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Juni" + +msgctxt "abbrev. month" +msgid "July" +msgstr "juli" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "august" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "septembar" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "oktobar" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "novembar" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "decembar" + +msgctxt "alt. month" +msgid "January" +msgstr "januar" + +msgctxt "alt. month" +msgid "February" +msgstr "februar" + +msgctxt "alt. month" +msgid "March" +msgstr "mart" + +msgctxt "alt. month" +msgid "April" +msgstr "april" + +msgctxt "alt. month" +msgid "May" +msgstr "maj" + +msgctxt "alt. month" +msgid "June" +msgstr "juni" + +msgctxt "alt. month" +msgid "July" +msgstr "juli" + +msgctxt "alt. month" +msgid "August" +msgstr "august" + +msgctxt "alt. month" +msgid "September" +msgstr "septembar" + +msgctxt "alt. month" +msgid "October" +msgstr "oktobar" + +msgctxt "alt. month" +msgid "November" +msgstr "Novembar" + +msgctxt "alt. month" +msgid "December" +msgstr "decembar" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "" + +msgid "or" +msgstr "ili" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "Godina nije naznačena" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Mjesec nije naznačen" + +msgid "No day specified" +msgstr "Dan nije naznačen" + +msgid "No week specified" +msgstr "Sedmica nije naznačena" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/bs/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/bs/formats.py new file mode 100644 index 0000000..25d9b40 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/bs/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j. N Y.' +TIME_FORMAT = 'G:i' +DATETIME_FORMAT = 'j. N. Y. G:i T' +YEAR_MONTH_FORMAT = 'F Y.' +MONTH_DAY_FORMAT = 'j. F' +SHORT_DATE_FORMAT = 'Y M j' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9ce89a9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/ca/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3cbe280 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/cy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e0e64f9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/da/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/da/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..48165d6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/de/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/de/formats.py new file mode 100644 index 0000000..5e09b2c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/de/formats.py @@ -0,0 +1,28 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j. F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'j. F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j. F' +SHORT_DATE_FORMAT = 'd.m.Y' +SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' +] +DATETIME_INPUT_FORMATS = [ + '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + '%d.%m.%Y', # '25.10.2006' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/de_CH/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/de_CH/formats.py new file mode 100644 index 0000000..b1c1e83 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/de_CH/formats.py @@ -0,0 +1,34 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j. F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'j. F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j. F' +SHORT_DATE_FORMAT = 'd.m.Y' +SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' + # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' +] +DATETIME_INPUT_FORMATS = [ + '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + '%d.%m.%Y', # '25.10.2006' +] + +# these are the separators for non-monetary numbers. For monetary numbers, +# the DECIMAL_SEPARATOR is a . (decimal point) and the THOUSAND_SEPARATOR is a +# ' (single quote). +# For details, please refer to http://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de +# (in German) and the documentation +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0d4c976 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..2c52175 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,1527 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: conf/global_settings.py:52 +msgid "Afrikaans" +msgstr "" + +#: conf/global_settings.py:53 +msgid "Arabic" +msgstr "" + +#: conf/global_settings.py:54 +msgid "Asturian" +msgstr "" + +#: conf/global_settings.py:55 +msgid "Azerbaijani" +msgstr "" + +#: conf/global_settings.py:56 +msgid "Bulgarian" +msgstr "" + +#: conf/global_settings.py:57 +msgid "Belarusian" +msgstr "" + +#: conf/global_settings.py:58 +msgid "Bengali" +msgstr "" + +#: conf/global_settings.py:59 +msgid "Breton" +msgstr "" + +#: conf/global_settings.py:60 +msgid "Bosnian" +msgstr "" + +#: conf/global_settings.py:61 +msgid "Catalan" +msgstr "" + +#: conf/global_settings.py:62 +msgid "Czech" +msgstr "" + +#: conf/global_settings.py:63 +msgid "Welsh" +msgstr "" + +#: conf/global_settings.py:64 +msgid "Danish" +msgstr "" + +#: conf/global_settings.py:65 +msgid "German" +msgstr "" + +#: conf/global_settings.py:66 +msgid "Lower Sorbian" +msgstr "" + +#: conf/global_settings.py:67 +msgid "Greek" +msgstr "" + +#: conf/global_settings.py:68 +msgid "English" +msgstr "" + +#: conf/global_settings.py:69 +msgid "Australian English" +msgstr "" + +#: conf/global_settings.py:70 +msgid "British English" +msgstr "" + +#: conf/global_settings.py:71 +msgid "Esperanto" +msgstr "" + +#: conf/global_settings.py:72 +msgid "Spanish" +msgstr "" + +#: conf/global_settings.py:73 +msgid "Argentinian Spanish" +msgstr "" + +#: conf/global_settings.py:74 +msgid "Colombian Spanish" +msgstr "" + +#: conf/global_settings.py:75 +msgid "Mexican Spanish" +msgstr "" + +#: conf/global_settings.py:76 +msgid "Nicaraguan Spanish" +msgstr "" + +#: conf/global_settings.py:77 +msgid "Venezuelan Spanish" +msgstr "" + +#: conf/global_settings.py:78 +msgid "Estonian" +msgstr "" + +#: conf/global_settings.py:79 +msgid "Basque" +msgstr "" + +#: conf/global_settings.py:80 +msgid "Persian" +msgstr "" + +#: conf/global_settings.py:81 +msgid "Finnish" +msgstr "" + +#: conf/global_settings.py:82 +msgid "French" +msgstr "" + +#: conf/global_settings.py:83 +msgid "Frisian" +msgstr "" + +#: conf/global_settings.py:84 +msgid "Irish" +msgstr "" + +#: conf/global_settings.py:85 +msgid "Scottish Gaelic" +msgstr "" + +#: conf/global_settings.py:86 +msgid "Galician" +msgstr "" + +#: conf/global_settings.py:87 +msgid "Hebrew" +msgstr "" + +#: conf/global_settings.py:88 +msgid "Hindi" +msgstr "" + +#: conf/global_settings.py:89 +msgid "Croatian" +msgstr "" + +#: conf/global_settings.py:90 +msgid "Upper Sorbian" +msgstr "" + +#: conf/global_settings.py:91 +msgid "Hungarian" +msgstr "" + +#: conf/global_settings.py:92 +msgid "Armenian" +msgstr "" + +#: conf/global_settings.py:93 +msgid "Interlingua" +msgstr "" + +#: conf/global_settings.py:94 +msgid "Indonesian" +msgstr "" + +#: conf/global_settings.py:95 +msgid "Ido" +msgstr "" + +#: conf/global_settings.py:96 +msgid "Icelandic" +msgstr "" + +#: conf/global_settings.py:97 +msgid "Italian" +msgstr "" + +#: conf/global_settings.py:98 +msgid "Japanese" +msgstr "" + +#: conf/global_settings.py:99 +msgid "Georgian" +msgstr "" + +#: conf/global_settings.py:100 +msgid "Kabyle" +msgstr "" + +#: conf/global_settings.py:101 +msgid "Kazakh" +msgstr "" + +#: conf/global_settings.py:102 +msgid "Khmer" +msgstr "" + +#: conf/global_settings.py:103 +msgid "Kannada" +msgstr "" + +#: conf/global_settings.py:104 +msgid "Korean" +msgstr "" + +#: conf/global_settings.py:105 +msgid "Luxembourgish" +msgstr "" + +#: conf/global_settings.py:106 +msgid "Lithuanian" +msgstr "" + +#: conf/global_settings.py:107 +msgid "Latvian" +msgstr "" + +#: conf/global_settings.py:108 +msgid "Macedonian" +msgstr "" + +#: conf/global_settings.py:109 +msgid "Malayalam" +msgstr "" + +#: conf/global_settings.py:110 +msgid "Mongolian" +msgstr "" + +#: conf/global_settings.py:111 +msgid "Marathi" +msgstr "" + +#: conf/global_settings.py:112 +msgid "Burmese" +msgstr "" + +#: conf/global_settings.py:113 +msgid "Norwegian Bokmål" +msgstr "" + +#: conf/global_settings.py:114 +msgid "Nepali" +msgstr "" + +#: conf/global_settings.py:115 +msgid "Dutch" +msgstr "" + +#: conf/global_settings.py:116 +msgid "Norwegian Nynorsk" +msgstr "" + +#: conf/global_settings.py:117 +msgid "Ossetic" +msgstr "" + +#: conf/global_settings.py:118 +msgid "Punjabi" +msgstr "" + +#: conf/global_settings.py:119 +msgid "Polish" +msgstr "" + +#: conf/global_settings.py:120 +msgid "Portuguese" +msgstr "" + +#: conf/global_settings.py:121 +msgid "Brazilian Portuguese" +msgstr "" + +#: conf/global_settings.py:122 +msgid "Romanian" +msgstr "" + +#: conf/global_settings.py:123 +msgid "Russian" +msgstr "" + +#: conf/global_settings.py:124 +msgid "Slovak" +msgstr "" + +#: conf/global_settings.py:125 +msgid "Slovenian" +msgstr "" + +#: conf/global_settings.py:126 +msgid "Albanian" +msgstr "" + +#: conf/global_settings.py:127 +msgid "Serbian" +msgstr "" + +#: conf/global_settings.py:128 +msgid "Serbian Latin" +msgstr "" + +#: conf/global_settings.py:129 +msgid "Swedish" +msgstr "" + +#: conf/global_settings.py:130 +msgid "Swahili" +msgstr "" + +#: conf/global_settings.py:131 +msgid "Tamil" +msgstr "" + +#: conf/global_settings.py:132 +msgid "Telugu" +msgstr "" + +#: conf/global_settings.py:133 +msgid "Thai" +msgstr "" + +#: conf/global_settings.py:134 +msgid "Turkish" +msgstr "" + +#: conf/global_settings.py:135 +msgid "Tatar" +msgstr "" + +#: conf/global_settings.py:136 +msgid "Udmurt" +msgstr "" + +#: conf/global_settings.py:137 +msgid "Ukrainian" +msgstr "" + +#: conf/global_settings.py:138 +msgid "Urdu" +msgstr "" + +#: conf/global_settings.py:139 +msgid "Vietnamese" +msgstr "" + +#: conf/global_settings.py:140 +msgid "Simplified Chinese" +msgstr "" + +#: conf/global_settings.py:141 +msgid "Traditional Chinese" +msgstr "" + +#: contrib/messages/apps.py:7 +msgid "Messages" +msgstr "" + +#: contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "" + +#: contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#: core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "" + +#: core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "" + +#: core/paginator.py:52 +msgid "That page contains no results" +msgstr "" + +#: core/validators.py:31 +msgid "Enter a valid value." +msgstr "" + +#: core/validators.py:102 forms/fields.py:658 +msgid "Enter a valid URL." +msgstr "" + +#: core/validators.py:154 +msgid "Enter a valid integer." +msgstr "" + +#: core/validators.py:165 +msgid "Enter a valid email address." +msgstr "" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: core/validators.py:239 +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: core/validators.py:246 +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: core/validators.py:255 core/validators.py:275 +msgid "Enter a valid IPv4 address." +msgstr "" + +#: core/validators.py:260 core/validators.py:276 +msgid "Enter a valid IPv6 address." +msgstr "" + +#: core/validators.py:270 core/validators.py:274 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: core/validators.py:304 +msgid "Enter only digits separated by commas." +msgstr "" + +#: core/validators.py:310 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: core/validators.py:342 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: core/validators.py:351 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: core/validators.py:361 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: core/validators.py:376 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: core/validators.py:395 forms/fields.py:290 forms/fields.py:325 +msgid "Enter a number." +msgstr "" + +#: core/validators.py:397 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#: core/validators.py:402 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#: core/validators.py:407 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#: core/validators.py:469 +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +#: core/validators.py:521 +msgid "Null characters are not allowed." +msgstr "" + +#: db/models/base.py:1156 forms/models.py:756 +msgid "and" +msgstr "" + +#: db/models/base.py:1158 +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#: db/models/fields/__init__.py:104 +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +#: db/models/fields/__init__.py:105 +msgid "This field cannot be null." +msgstr "" + +#: db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "" + +#: db/models/fields/__init__.py:107 +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: db/models/fields/__init__.py:128 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: db/models/fields/__init__.py:899 db/models/fields/__init__.py:1766 +msgid "Integer" +msgstr "" + +#: db/models/fields/__init__.py:903 db/models/fields/__init__.py:1764 +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +#: db/models/fields/__init__.py:978 db/models/fields/__init__.py:1832 +msgid "Big (8 byte) integer" +msgstr "" + +#: db/models/fields/__init__.py:990 +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +#: db/models/fields/__init__.py:991 +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "" + +#: db/models/fields/__init__.py:993 +msgid "Boolean (Either True or False)" +msgstr "" + +#: db/models/fields/__init__.py:1034 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: db/models/fields/__init__.py:1098 +msgid "Comma-separated integers" +msgstr "" + +#: db/models/fields/__init__.py:1147 +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: db/models/fields/__init__.py:1149 db/models/fields/__init__.py:1292 +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: db/models/fields/__init__.py:1152 +msgid "Date (without time)" +msgstr "" + +#: db/models/fields/__init__.py:1290 +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: db/models/fields/__init__.py:1294 +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +#: db/models/fields/__init__.py:1298 +msgid "Date (with time)" +msgstr "" + +#: db/models/fields/__init__.py:1446 +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +#: db/models/fields/__init__.py:1448 +msgid "Decimal number" +msgstr "" + +#: db/models/fields/__init__.py:1587 +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +#: db/models/fields/__init__.py:1590 +msgid "Duration" +msgstr "" + +#: db/models/fields/__init__.py:1640 +msgid "Email address" +msgstr "" + +#: db/models/fields/__init__.py:1663 +msgid "File path" +msgstr "" + +#: db/models/fields/__init__.py:1729 +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +#: db/models/fields/__init__.py:1731 +msgid "Floating point number" +msgstr "" + +#: db/models/fields/__init__.py:1848 +msgid "IPv4 address" +msgstr "" + +#: db/models/fields/__init__.py:1879 +msgid "IP address" +msgstr "" + +#: db/models/fields/__init__.py:1959 db/models/fields/__init__.py:1960 +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +#: db/models/fields/__init__.py:1962 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: db/models/fields/__init__.py:1997 +msgid "Positive integer" +msgstr "" + +#: db/models/fields/__init__.py:2010 +msgid "Positive small integer" +msgstr "" + +#: db/models/fields/__init__.py:2024 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: db/models/fields/__init__.py:2056 +msgid "Small integer" +msgstr "" + +#: db/models/fields/__init__.py:2063 +msgid "Text" +msgstr "" + +#: db/models/fields/__init__.py:2091 +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: db/models/fields/__init__.py:2093 +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: db/models/fields/__init__.py:2096 +msgid "Time" +msgstr "" + +#: db/models/fields/__init__.py:2222 +msgid "URL" +msgstr "" + +#: db/models/fields/__init__.py:2244 +msgid "Raw binary data" +msgstr "" + +#: db/models/fields/__init__.py:2294 +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +#: db/models/fields/__init__.py:2296 +msgid "Universally unique identifier" +msgstr "" + +#: db/models/fields/files.py:221 +msgid "File" +msgstr "" + +#: db/models/fields/files.py:360 +msgid "Image" +msgstr "" + +#: db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: db/models/fields/related.py:1007 +msgid "One-to-one relationship" +msgstr "" + +#: db/models/fields/related.py:1057 +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#: db/models/fields/related.py:1058 +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +#: db/models/fields/related.py:1100 +msgid "Many-to-many relationship" +msgstr "" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: forms/boundfield.py:146 +msgid ":?.!" +msgstr "" + +#: forms/fields.py:53 +msgid "This field is required." +msgstr "" + +#: forms/fields.py:245 +msgid "Enter a whole number." +msgstr "" + +#: forms/fields.py:396 forms/fields.py:1126 +msgid "Enter a valid date." +msgstr "" + +#: forms/fields.py:420 forms/fields.py:1127 +msgid "Enter a valid time." +msgstr "" + +#: forms/fields.py:442 +msgid "Enter a valid date/time." +msgstr "" + +#: forms/fields.py:471 +msgid "Enter a valid duration." +msgstr "" + +#: forms/fields.py:472 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: forms/fields.py:532 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: forms/fields.py:533 +msgid "No file was submitted." +msgstr "" + +#: forms/fields.py:534 +msgid "The submitted file is empty." +msgstr "" + +#: forms/fields.py:536 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +#: forms/fields.py:539 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: forms/fields.py:600 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: forms/fields.py:762 forms/fields.py:852 forms/models.py:1270 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: forms/fields.py:853 forms/fields.py:968 forms/models.py:1269 +msgid "Enter a list of values." +msgstr "" + +#: forms/fields.py:969 +msgid "Enter a complete value." +msgstr "" + +#: forms/fields.py:1185 +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +#: forms/forms.py:86 +msgid ":" +msgstr "" + +#: forms/forms.py:212 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: forms/formsets.py:91 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#: forms/formsets.py:338 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#: forms/formsets.py:345 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +#: forms/formsets.py:371 forms/formsets.py:373 +msgid "Order" +msgstr "" + +#: forms/formsets.py:375 +msgid "Delete" +msgstr "" + +#: forms/models.py:751 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: forms/models.py:755 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: forms/models.py:761 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +#: forms/models.py:770 +msgid "Please correct the duplicate values below." +msgstr "" + +#: forms/models.py:1091 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: forms/models.py:1158 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: forms/models.py:1272 +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#: forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +#: forms/widgets.py:383 +msgid "Clear" +msgstr "" + +#: forms/widgets.py:384 +msgid "Currently" +msgstr "" + +#: forms/widgets.py:385 +msgid "Change" +msgstr "" + +#: forms/widgets.py:699 +msgid "Unknown" +msgstr "" + +#: forms/widgets.py:700 +msgid "Yes" +msgstr "" + +#: forms/widgets.py:701 +msgid "No" +msgstr "" + +#: template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "" + +#: template/defaultfilters.py:817 template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "" + +#: template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "" + +#: template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "" + +#: template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "" + +#: template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "" + +#: utils/dateformat.py:62 +msgid "p.m." +msgstr "" + +#: utils/dateformat.py:63 +msgid "a.m." +msgstr "" + +#: utils/dateformat.py:68 +msgid "PM" +msgstr "" + +#: utils/dateformat.py:69 +msgid "AM" +msgstr "" + +#: utils/dateformat.py:150 +msgid "midnight" +msgstr "" + +#: utils/dateformat.py:152 +msgid "noon" +msgstr "" + +#: utils/dates.py:6 +msgid "Monday" +msgstr "" + +#: utils/dates.py:6 +msgid "Tuesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Wednesday" +msgstr "" + +#: utils/dates.py:6 +msgid "Thursday" +msgstr "" + +#: utils/dates.py:6 +msgid "Friday" +msgstr "" + +#: utils/dates.py:7 +msgid "Saturday" +msgstr "" + +#: utils/dates.py:7 +msgid "Sunday" +msgstr "" + +#: utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: utils/dates.py:11 +msgid "Sat" +msgstr "" + +#: utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: utils/dates.py:14 +msgid "January" +msgstr "" + +#: utils/dates.py:14 +msgid "February" +msgstr "" + +#: utils/dates.py:14 +msgid "March" +msgstr "" + +#: utils/dates.py:14 +msgid "April" +msgstr "" + +#: utils/dates.py:14 +msgid "May" +msgstr "" + +#: utils/dates.py:14 +msgid "June" +msgstr "" + +#: utils/dates.py:15 +msgid "July" +msgstr "" + +#: utils/dates.py:15 +msgid "August" +msgstr "" + +#: utils/dates.py:15 +msgid "September" +msgstr "" + +#: utils/dates.py:15 +msgid "October" +msgstr "" + +#: utils/dates.py:15 +msgid "November" +msgstr "" + +#: utils/dates.py:16 +msgid "December" +msgstr "" + +#: utils/dates.py:19 +msgid "jan" +msgstr "" + +#: utils/dates.py:19 +msgid "feb" +msgstr "" + +#: utils/dates.py:19 +msgid "mar" +msgstr "" + +#: utils/dates.py:19 +msgid "apr" +msgstr "" + +#: utils/dates.py:19 +msgid "may" +msgstr "" + +#: utils/dates.py:19 +msgid "jun" +msgstr "" + +#: utils/dates.py:20 +msgid "jul" +msgstr "" + +#: utils/dates.py:20 +msgid "aug" +msgstr "" + +#: utils/dates.py:20 +msgid "sep" +msgstr "" + +#: utils/dates.py:20 +msgid "oct" +msgstr "" + +#: utils/dates.py:20 +msgid "nov" +msgstr "" + +#: utils/dates.py:20 +msgid "dec" +msgstr "" + +#: utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: utils/dates.py:25 +msgctxt "abbrev. month" +msgid "March" +msgstr "" + +#: utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: utils/dates.py:39 +msgctxt "alt. month" +msgid "March" +msgstr "" + +#: utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: utils/dates.py:45 +msgctxt "alt. month" +msgid "September" +msgstr "" + +#: utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: utils/dates.py:48 +msgctxt "alt. month" +msgid "December" +msgstr "" + +#: utils/ipv6.py:8 +msgid "This is not a valid IPv6 address." +msgstr "" + +#: utils/text.py:67 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: utils/text.py:233 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: utils/text.py:252 utils/timesince.py:83 +msgid ", " +msgstr "" + +#: utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: utils/timesince.py:72 +msgid "0 minutes" +msgstr "" + +#: views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +#: views/csrf.py:120 +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +#: views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +#: views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +#: views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +#: views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: views/generic/dates.py:61 views/generic/dates.py:111 +#: views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: views/generic/dates.py:338 views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: views/generic/dates.py:623 +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#: views/generic/detail.py:54 +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +#: views/generic/list.py:67 +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#: views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: views/generic/list.py:154 +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +#: views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: views/static.py:42 +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#: views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: views/templates/default_urlconf.html:6 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#: views/templates/default_urlconf.html:345 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: views/templates/default_urlconf.html:367 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: views/templates/default_urlconf.html:368 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +#: views/templates/default_urlconf.html:383 +msgid "Django Documentation" +msgstr "" + +#: views/templates/default_urlconf.html:384 +msgid "Topics, references, & how-to's" +msgstr "" + +#: views/templates/default_urlconf.html:395 +msgid "Tutorial: A Polling App" +msgstr "" + +#: views/templates/default_urlconf.html:396 +msgid "Get started with Django" +msgstr "" + +#: views/templates/default_urlconf.html:407 +msgid "Django Community" +msgstr "" + +#: views/templates/default_urlconf.html:408 +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/en/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/en/formats.py new file mode 100644 index 0000000..74abad5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/en/formats.py @@ -0,0 +1,40 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'N j, Y' +TIME_FORMAT = 'P' +DATETIME_FORMAT = 'N j, Y, P' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'F j' +SHORT_DATE_FORMAT = 'm/d/Y' +SHORT_DATETIME_FORMAT = 'm/d/Y P' +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# Kept ISO formats as they are in first position +DATE_INPUT_FORMATS = [ + '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' +] +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' + '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' + '%m/%d/%Y %H:%M', # '10/25/2006 14:30' + '%m/%d/%Y', # '10/25/2006' + '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' + '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' + '%m/%d/%y %H:%M', # '10/25/06 14:30' + '%m/%d/%y', # '10/25/06' +] +DECIMAL_SEPARATOR = '.' +THOUSAND_SEPARATOR = ',' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en_AU/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/en_AU/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/en_AU/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/en_AU/formats.py new file mode 100644 index 0000000..c28d75e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/en_AU/formats.py @@ -0,0 +1,39 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j M Y' # '25 Oct 2006' +TIME_FORMAT = 'P' # '2:30 p.m.' +DATETIME_FORMAT = 'j M Y, P' # '25 Oct 2006, 2:30 p.m.' +YEAR_MONTH_FORMAT = 'F Y' # 'October 2006' +MONTH_DAY_FORMAT = 'j F' # '25 October' +SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006' +SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 p.m.' +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' + # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' + # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' + # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' + # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' +] +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' + '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' + '%d/%m/%Y %H:%M', # '25/10/2006 14:30' + '%d/%m/%Y', # '25/10/2006' + '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' + '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' + '%d/%m/%y %H:%M', # '25/10/06 14:30' + '%d/%m/%y', # '25/10/06' +] +DECIMAL_SEPARATOR = '.' +THOUSAND_SEPARATOR = ',' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/es/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/es/formats.py new file mode 100644 index 0000000..b7aca78 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/es/formats.py @@ -0,0 +1,30 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = r'j \d\e F \d\e Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i' +YEAR_MONTH_FORMAT = r'F \d\e Y' +MONTH_DAY_FORMAT = r'j \d\e F' +SHORT_DATE_FORMAT = 'd/m/Y' +SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + # '31/12/2009', '31/12/09' + '%d/%m/%Y', '%d/%m/%y' +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', + '%d/%m/%Y %H:%M:%S.%f', + '%d/%m/%Y %H:%M', + '%d/%m/%y %H:%M:%S', + '%d/%m/%y %H:%M:%S.%f', + '%d/%m/%y %H:%M', +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_AR/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/es_AR/formats.py new file mode 100644 index 0000000..e856c4a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/es_AR/formats.py @@ -0,0 +1,30 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = r'j N Y' +TIME_FORMAT = r'H:i' +DATETIME_FORMAT = r'j N Y H:i' +YEAR_MONTH_FORMAT = r'F Y' +MONTH_DAY_FORMAT = r'j \d\e F' +SHORT_DATE_FORMAT = r'd/m/Y' +SHORT_DATETIME_FORMAT = r'd/m/Y H:i' +FIRST_DAY_OF_WEEK = 0 # 0: Sunday, 1: Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', # '31/12/2009' + '%d/%m/%y', # '31/12/09' +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', + '%d/%m/%Y %H:%M:%S.%f', + '%d/%m/%Y %H:%M', + '%d/%m/%y %H:%M:%S', + '%d/%m/%y %H:%M:%S.%f', + '%d/%m/%y %H:%M', +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..2cae813 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,1241 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Carlos Muñoz , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" +"language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikáans" + +msgid "Arabic" +msgstr "Árabe" + +msgid "Asturian" +msgstr "Asturiano" + +msgid "Azerbaijani" +msgstr "Azerí" + +msgid "Bulgarian" +msgstr "Búlgaro" + +msgid "Belarusian" +msgstr "Bielorruso" + +msgid "Bengali" +msgstr "Bengalí" + +msgid "Breton" +msgstr "Bretón" + +msgid "Bosnian" +msgstr "Bosnio" + +msgid "Catalan" +msgstr "Catalán" + +msgid "Czech" +msgstr "Checo" + +msgid "Welsh" +msgstr "Galés" + +msgid "Danish" +msgstr "Danés" + +msgid "German" +msgstr "Alemán" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Griego" + +msgid "English" +msgstr "Inglés" + +msgid "Australian English" +msgstr "Inglés Australiano" + +msgid "British English" +msgstr "Inglés Británico" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Español" + +msgid "Argentinian Spanish" +msgstr "Español de Argentina" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Español de México" + +msgid "Nicaraguan Spanish" +msgstr "Español de Nicaragua" + +msgid "Venezuelan Spanish" +msgstr "Español venezolano" + +msgid "Estonian" +msgstr "Estonio" + +msgid "Basque" +msgstr "Vasco" + +msgid "Persian" +msgstr "Persa" + +msgid "Finnish" +msgstr "Finés" + +msgid "French" +msgstr "Francés" + +msgid "Frisian" +msgstr "Frisón" + +msgid "Irish" +msgstr "Irlandés" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Gallego" + +msgid "Hebrew" +msgstr "Hebreo" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Croata" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Húngaro" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonesio" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandés" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "Japonés" + +msgid "Georgian" +msgstr "Georgiano" + +msgid "Kazakh" +msgstr "Kazajo" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreano" + +msgid "Luxembourgish" +msgstr "Luxenburgués" + +msgid "Lithuanian" +msgstr "Lituano" + +msgid "Latvian" +msgstr "Letón" + +msgid "Macedonian" +msgstr "Macedonio" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Mongol" + +msgid "Marathi" +msgstr "Maratí" + +msgid "Burmese" +msgstr "Birmano" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "Nepalí" + +msgid "Dutch" +msgstr "Holandés" + +msgid "Norwegian Nynorsk" +msgstr "Nynorsk" + +msgid "Ossetic" +msgstr "Osetio" + +msgid "Punjabi" +msgstr "Panyabí" + +msgid "Polish" +msgstr "Polaco" + +msgid "Portuguese" +msgstr "Portugués" + +msgid "Brazilian Portuguese" +msgstr "Portugués brasileño" + +msgid "Romanian" +msgstr "Rumano" + +msgid "Russian" +msgstr "Ruso" + +msgid "Slovak" +msgstr "Eslovaco" + +msgid "Slovenian" +msgstr "Esloveno" + +msgid "Albanian" +msgstr "Albanés" + +msgid "Serbian" +msgstr "Serbio" + +msgid "Serbian Latin" +msgstr "Serbio latino" + +msgid "Swedish" +msgstr "Sueco" + +msgid "Swahili" +msgstr "Suajili" + +msgid "Tamil" +msgstr "Tamil" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Thai" +msgstr "Tailandés" + +msgid "Turkish" +msgstr "Turco" + +msgid "Tatar" +msgstr "Tártaro" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Ukrainian" +msgstr "Ucraniano" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vietnamita" + +msgid "Simplified Chinese" +msgstr "Chino simplificado" + +msgid "Traditional Chinese" +msgstr "Chino tradicional" + +msgid "Messages" +msgstr "Mensajes" + +msgid "Site Maps" +msgstr "Mapas del sitio" + +msgid "Static Files" +msgstr "Archivos estáticos" + +msgid "Syndication" +msgstr "Sindicación" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Ingrese un valor válido." + +msgid "Enter a valid URL." +msgstr "Ingrese una URL válida." + +msgid "Enter a valid integer." +msgstr "Ingrese un entero válido." + +msgid "Enter a valid email address." +msgstr "Ingrese una dirección de correo electrónico válida." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Ingrese un 'slug' válido, compuesto por letras, números, guiones bajos o " +"guiones." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Ingrese un 'slug' válido, compuesto por letras del conjunto Unicode, " +"números, guiones bajos o guiones." + +msgid "Enter a valid IPv4 address." +msgstr "Ingrese una dirección IPv4 válida." + +msgid "Enter a valid IPv6 address." +msgstr "Ingrese una dirección IPv6 válida." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Ingrese una dirección IPv4 o IPv6 válida." + +msgid "Enter only digits separated by commas." +msgstr "Ingrese solo números separados por comas." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Asegúrese de que este valor es %(limit_value)s (es %(show_value)s )." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Asegúrese de que este valor tenga como mínimo %(limit_value)d carácter " +"(tiene %(show_value)d)." +msgstr[1] "" +"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " +"(tiene %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Asegúrese de que este valor tenga como máximo %(limit_value)d carácter " +"(tiene %(show_value)d)." +msgstr[1] "" +"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " +"(tiene %(show_value)d)." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Asegúrese de que no hayan mas de %(max)s dígito en total." +msgstr[1] "Asegúrese de que no hayan mas de %(max)s dígitos en total." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Asegúrese de que no hayan más de %(max)s decimal." +msgstr[1] "Asegúrese de que no hayan más de %(max)s decimales." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Asegúrese de que no hayan más de %(max)s dígito antes del punto decimal." +msgstr[1] "" +"Asegúrese de que no hayan más de %(max)s dígitos antes del punto decimal" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "y" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Valor %(value)r no es una opción válida." + +msgid "This field cannot be null." +msgstr "Este campo no puede ser nulo." + +msgid "This field cannot be blank." +msgstr "Este campo no puede estar en blanco." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s debe ser único para %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Tipo de campo: %(field_type)s" + +msgid "Integer" +msgstr "Entero" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' debe ser un valor entero." + +msgid "Big (8 byte) integer" +msgstr "Entero grande (8 bytes)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' debe ser Verdadero o Falso" + +msgid "Boolean (Either True or False)" +msgstr "Booleano (Verdadero o Falso)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Cadena (máximo %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Enteros separados por comas" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' tiene un formato de fecha no válida. Este valor debe estar en el " +"formato AAAA-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"El valor '%(value)s' tiene un formato correcto (AAAA-MM-DD) pero es una " +"fecha invalida." + +msgid "Date (without time)" +msgstr "Fecha (sin hora)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el " +"formato AAAA-MM-DD HH: [TZ]: MM [ss [uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"El valor '%(value)s' tiene un formato correcto (AAAA-MM-DD HH: MM [:. Ss " +"[uuuuuu]] [TZ]) pero es una fecha/hora invalida." + +msgid "Date (with time)" +msgstr "Fecha (con hora)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "El valor '%(value)s' debe ser un número decimal." + +msgid "Decimal number" +msgstr "Número decimal" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' tiene un formato no válido. Este valor debe estar en el formato " +"[DD] [HH:[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Duración" + +msgid "Email address" +msgstr "Dirección de correo electrónico" + +msgid "File path" +msgstr "Ruta de archivo" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "El valor '%(value)s' debe ser un número real." + +msgid "Floating point number" +msgstr "Número de punto flotante" + +msgid "IPv4 address" +msgstr "Dirección IPv4" + +msgid "IP address" +msgstr "Dirección IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "El valor '%(value)s' debe ser Nulo, Verdadero o Falso" + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (Verdadero, Falso o Nulo)" + +msgid "Positive integer" +msgstr "Entero positivo" + +msgid "Positive small integer" +msgstr "Entero positivo pequeño" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (hasta %(max_length)s)" + +msgid "Small integer" +msgstr "Entero pequeño" + +msgid "Text" +msgstr "Texto" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"El valor '%(value)s' tiene un formato no válido. Este debe estar en el " +"formato HH:MM[:ss[.uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"El valor '%(value)s' tiene un formato correcto (HH:MM[:ss[.uuuuuu]]) pero " +"tiene la hora invalida." + +msgid "Time" +msgstr "Hora" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Datos de binarios brutos" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' no es un UUID válido." + +msgid "File" +msgstr "Archivo" + +msgid "Image" +msgstr "Imagen" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "La instancia del %(model)s con %(field)s %(value)r no existe." + +msgid "Foreign Key (type determined by related field)" +msgstr "Llave foránea (tipo determinado por el campo relacionado)" + +msgid "One-to-one relationship" +msgstr "Relación uno-a-uno" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Relación muchos-a-muchos" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Este campo es obligatorio." + +msgid "Enter a whole number." +msgstr "Ingrese un número entero." + +msgid "Enter a number." +msgstr "Ingrese un número." + +msgid "Enter a valid date." +msgstr "Ingrese una fecha válida." + +msgid "Enter a valid time." +msgstr "Ingrese una hora válida." + +msgid "Enter a valid date/time." +msgstr "Ingrese una fecha/hora válida." + +msgid "Enter a valid duration." +msgstr "Ingrese una duración válida." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"No se ha enviado ningún fichero. Compruebe el tipo de codificación en el " +"formulario." + +msgid "No file was submitted." +msgstr "No se ha enviado ningún fichero." + +msgid "The submitted file is empty." +msgstr "El fichero enviado está vacío." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Asegúrese de que este nombre de archivo tenga como máximo %(max)d carácter " +"(tiene %(length)d)." +msgstr[1] "" +"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " +"(tiene %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Por favor envíe un fichero o marque la casilla de limpiar, pero no ambos." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se " +"trataba de una imagen corrupta." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Escoja una opción válida. %(value)s no es una de las opciones disponibles." + +msgid "Enter a list of values." +msgstr "Ingrese una lista de valores." + +msgid "Enter a complete value." +msgstr "Ingrese un valor completo." + +msgid "Enter a valid UUID." +msgstr "Ingrese un UUID válido." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Campo oculto %(name)s) *%(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Los datos de ManagementForm faltan o han sido manipulados" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Por favor, envíe %d o menos formularios." +msgstr[1] "Por favor, envíe %d o menos formularios." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Por favor, envíe %d o mas formularios." +msgstr[1] "Por favor, envíe %d o mas formularios." + +msgid "Order" +msgstr "Orden" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Por favor, corrija el dato duplicado para %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Por favor corrija el dato duplicado para %(field)s, este debe ser único." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Por favor corrija los datos duplicados para %(field_name)s este debe ser " +"único para %(lookup)s en %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Por favor, corrija los valores duplicados abajo." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s no puede interpretarse en el huso horario %(current_timezone)s; " +"puede ser ambiguo o puede no existir." + +msgid "Clear" +msgstr "Limpiar" + +msgid "Currently" +msgstr "Actualmente" + +msgid "Change" +msgstr "Cambiar" + +msgid "Unknown" +msgstr "Desconocido" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "yes,no,maybe" +msgstr "sí, no, quizás" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "medianoche" + +msgid "noon" +msgstr "mediodía" + +msgid "Monday" +msgstr "Lunes" + +msgid "Tuesday" +msgstr "Martes" + +msgid "Wednesday" +msgstr "Miércoles" + +msgid "Thursday" +msgstr "Jueves" + +msgid "Friday" +msgstr "Viernes" + +msgid "Saturday" +msgstr "Sábado" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Mon" +msgstr "Lun" + +msgid "Tue" +msgstr "Mar" + +msgid "Wed" +msgstr "Mié" + +msgid "Thu" +msgstr "Jue" + +msgid "Fri" +msgstr "Vie" + +msgid "Sat" +msgstr "Sáb" + +msgid "Sun" +msgstr "Dom" + +msgid "January" +msgstr "Enero" + +msgid "February" +msgstr "Febrero" + +msgid "March" +msgstr "Marzo" + +msgid "April" +msgstr "Abril" + +msgid "May" +msgstr "Mayo" + +msgid "June" +msgstr "Junio" + +msgid "July" +msgstr "Julio" + +msgid "August" +msgstr "Agosto" + +msgid "September" +msgstr "Septiembre" + +msgid "October" +msgstr "Octubre" + +msgid "November" +msgstr "Noviembre" + +msgid "December" +msgstr "Diciembre" + +msgid "jan" +msgstr "ene" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "abr" + +msgid "may" +msgstr "may" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ago" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "oct" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dic" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Ene." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Marzo" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Abril" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mayo" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Junio" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julio" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ago." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sep." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Oct." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dic." + +msgctxt "alt. month" +msgid "January" +msgstr "Enero" + +msgctxt "alt. month" +msgid "February" +msgstr "Febrero" + +msgctxt "alt. month" +msgid "March" +msgstr "Marzo" + +msgctxt "alt. month" +msgid "April" +msgstr "Abril" + +msgctxt "alt. month" +msgid "May" +msgstr "Mayo" + +msgctxt "alt. month" +msgid "June" +msgstr "Junio" + +msgctxt "alt. month" +msgid "July" +msgstr "Julio" + +msgctxt "alt. month" +msgid "August" +msgstr "Agosto" + +msgctxt "alt. month" +msgid "September" +msgstr "Septiembre" + +msgctxt "alt. month" +msgid "October" +msgstr "Octubre" + +msgctxt "alt. month" +msgid "November" +msgstr "Noviembre" + +msgctxt "alt. month" +msgid "December" +msgstr "Diciembre" + +msgid "This is not a valid IPv6 address." +msgstr "Esta no es una dirección IPv6 válida." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "o" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d año" +msgstr[1] "%d años" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mes" +msgstr[1] "%d meses" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d día" +msgstr[1] "%d días" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +msgid "0 minutes" +msgstr "0 minutos" + +msgid "Forbidden" +msgstr "Prohibido" + +msgid "CSRF verification failed. Request aborted." +msgstr "Verificación CSRF fallida. Solicitud abortada." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Estás viendo este mensaje porque este sitio web es HTTPS y requiere que tu " +"navegador envíe una 'Referer header' y no se envió ninguna. Esta cabecera se " +"necesita por razones de seguridad, para asegurarse de que tu navegador no ha " +"sido comprometido por terceras partes." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Si has configurado tu navegador desactivando las cabeceras 'Referer', por " +"favor vuélvelas a activar, al menos para esta web, o para conexiones HTTPS, " +"o para peticiones 'same-origin'." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Estás viendo este mensaje porqué esta web requiere una cookie CSRF cuando se " +"envían formularios. Esta cookie se necesita por razones de seguridad, para " +"asegurar que tu navegador no ha sido comprometido por terceras partes." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Si has inhabilitado las cookies en tu navegador, por favor habilítalas " +"nuevamente al menos para este sitio, o para peticiones 'same-origin'." + +msgid "More information is available with DEBUG=True." +msgstr "Se puede ver más información si se establece DEBUG=True." + +msgid "No year specified" +msgstr "No se ha indicado el año" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "No se ha indicado el mes" + +msgid "No day specified" +msgstr "No se ha indicado el día" + +msgid "No week specified" +msgstr "No se ha indicado la semana" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "No %(verbose_name_plural)s disponibles" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Los futuros %(verbose_name_plural)s no están disponibles porque " +"%(class_name)s.allow_future es Falso." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Fecha '%(datestr)s' no válida, el formato válido es '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "La página no es la \"ultima\", ni puede ser convertida a un entero." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Página inválida (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Lista vacía y '%(class_name)s.allow_empty' es Falso." + +msgid "Directory indexes are not allowed here." +msgstr "Los índices de directorio no están permitidos." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" no existe" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Índice de %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/formats.py new file mode 100644 index 0000000..cefbe26 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/es_CO/formats.py @@ -0,0 +1,26 @@ +# This file is distributed under the same license as the Django package. +# +DATE_FORMAT = r'j \d\e F \d\e Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i' +YEAR_MONTH_FORMAT = r'F \d\e Y' +MONTH_DAY_FORMAT = r'j \d\e F' +SHORT_DATE_FORMAT = 'd/m/Y' +SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +FIRST_DAY_OF_WEEK = 1 +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' + '%Y%m%d', # '20061025' + +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', + '%d/%m/%Y %H:%M:%S.%f', + '%d/%m/%Y %H:%M', + '%d/%m/%y %H:%M:%S', + '%d/%m/%y %H:%M:%S.%f', + '%d/%m/%y %H:%M', +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_MX/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/es_MX/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_NI/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/es_NI/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/es_PR/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/es_PR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/et/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..9102e8f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,1264 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# eallik , 2011 +# Jannis Leidel , 2011 +# Janno Liivak , 2013-2015 +# madisvain , 2011 +# Martin Pajuste , 2014-2015 +# Martin Pajuste , 2016-2017,2019 +# Marti Raudsepp , 2014,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 16:27+0000\n" +"Last-Translator: Martin Pajuste \n" +"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "afrikaani" + +msgid "Arabic" +msgstr "araabia" + +msgid "Asturian" +msgstr "astuuria" + +msgid "Azerbaijani" +msgstr "aserbaidžaani" + +msgid "Bulgarian" +msgstr "bulgaaria" + +msgid "Belarusian" +msgstr "valgevene" + +msgid "Bengali" +msgstr "bengali" + +msgid "Breton" +msgstr "bretooni" + +msgid "Bosnian" +msgstr "bosnia" + +msgid "Catalan" +msgstr "katalaani" + +msgid "Czech" +msgstr "tšehhi" + +msgid "Welsh" +msgstr "uelsi" + +msgid "Danish" +msgstr "taani" + +msgid "German" +msgstr "saksa" + +msgid "Lower Sorbian" +msgstr " alamsorbi" + +msgid "Greek" +msgstr "kreeka" + +msgid "English" +msgstr "inglise" + +msgid "Australian English" +msgstr "austraalia inglise" + +msgid "British English" +msgstr "briti inglise" + +msgid "Esperanto" +msgstr "esperanto" + +msgid "Spanish" +msgstr "hispaania" + +msgid "Argentinian Spanish" +msgstr "argentiina hispaani" + +msgid "Colombian Spanish" +msgstr "kolumbia hispaania" + +msgid "Mexican Spanish" +msgstr "mehhiko hispaania" + +msgid "Nicaraguan Spanish" +msgstr "nikaraagua hispaania" + +msgid "Venezuelan Spanish" +msgstr "venetsueela hispaania" + +msgid "Estonian" +msgstr "eesti" + +msgid "Basque" +msgstr "baski" + +msgid "Persian" +msgstr "pärsia" + +msgid "Finnish" +msgstr "soome" + +msgid "French" +msgstr "prantsuse" + +msgid "Frisian" +msgstr "friisi" + +msgid "Irish" +msgstr "iiri" + +msgid "Scottish Gaelic" +msgstr "šoti gaeli" + +msgid "Galician" +msgstr "galiitsia" + +msgid "Hebrew" +msgstr "heebrea" + +msgid "Hindi" +msgstr "hindi" + +msgid "Croatian" +msgstr "horvaatia" + +msgid "Upper Sorbian" +msgstr "ülemsorbi" + +msgid "Hungarian" +msgstr "ungari" + +msgid "Armenian" +msgstr "armeenia" + +msgid "Interlingua" +msgstr "interlingua" + +msgid "Indonesian" +msgstr "indoneesi" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islandi" + +msgid "Italian" +msgstr "itaalia" + +msgid "Japanese" +msgstr "jaapani" + +msgid "Georgian" +msgstr "gruusia" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "kasahhi" + +msgid "Khmer" +msgstr "khmeri" + +msgid "Kannada" +msgstr "kannada" + +msgid "Korean" +msgstr "korea" + +msgid "Luxembourgish" +msgstr "letseburgi" + +msgid "Lithuanian" +msgstr "leedu" + +msgid "Latvian" +msgstr "läti" + +msgid "Macedonian" +msgstr "makedoonia" + +msgid "Malayalam" +msgstr "malaia" + +msgid "Mongolian" +msgstr "mongoolia" + +msgid "Marathi" +msgstr "marathi" + +msgid "Burmese" +msgstr "birma" + +msgid "Norwegian Bokmål" +msgstr "norra bokmål" + +msgid "Nepali" +msgstr "nepali" + +msgid "Dutch" +msgstr "hollandi" + +msgid "Norwegian Nynorsk" +msgstr "norra (nynorsk)" + +msgid "Ossetic" +msgstr "osseetia" + +msgid "Punjabi" +msgstr "pandžab" + +msgid "Polish" +msgstr "poola" + +msgid "Portuguese" +msgstr "portugali" + +msgid "Brazilian Portuguese" +msgstr "brasiilia portugali" + +msgid "Romanian" +msgstr "rumeenia" + +msgid "Russian" +msgstr "vene" + +msgid "Slovak" +msgstr "slovaki" + +msgid "Slovenian" +msgstr "sloveeni" + +msgid "Albanian" +msgstr "albaania" + +msgid "Serbian" +msgstr "serbia" + +msgid "Serbian Latin" +msgstr "serbia (ladina)" + +msgid "Swedish" +msgstr "rootsi" + +msgid "Swahili" +msgstr "suahiili" + +msgid "Tamil" +msgstr "tamiili" + +msgid "Telugu" +msgstr "telugu" + +msgid "Thai" +msgstr "tai" + +msgid "Turkish" +msgstr "türgi" + +msgid "Tatar" +msgstr "tatari" + +msgid "Udmurt" +msgstr "udmurdi" + +msgid "Ukrainian" +msgstr "ukrania" + +msgid "Urdu" +msgstr "urdu" + +msgid "Vietnamese" +msgstr "vietnami" + +msgid "Simplified Chinese" +msgstr "lihtsustatud hiina" + +msgid "Traditional Chinese" +msgstr "traditsiooniline hiina" + +msgid "Messages" +msgstr "Sõnumid" + +msgid "Site Maps" +msgstr "Saidikaardid" + +msgid "Static Files" +msgstr "Staatilised failid" + +msgid "Syndication" +msgstr "Sündikeerimine" + +msgid "That page number is not an integer" +msgstr "See lehe number ei ole täisarv" + +msgid "That page number is less than 1" +msgstr "See lehe number on väiksem kui 1" + +msgid "That page contains no results" +msgstr "See leht ei sisalda tulemusi" + +msgid "Enter a valid value." +msgstr "Sisestage korrektne väärtus." + +msgid "Enter a valid URL." +msgstr "Sisestage korrektne URL." + +msgid "Enter a valid integer." +msgstr "Sisestage korrektne täisarv." + +msgid "Enter a valid email address." +msgstr "Sisestage korrektne e-posti aadress." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"See väärtus võib sisaldada ainult tähti, numbreid, alljooni ja sidekriipse." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Sisesta korrektne 'nälk', mis koosneb Unicode tähtedest, numbritest, ala- ja " +"sidekriipsudest." + +msgid "Enter a valid IPv4 address." +msgstr "Sisestage korrektne IPv4 aadress." + +msgid "Enter a valid IPv6 address." +msgstr "Sisestage korrektne IPv6 aadress." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Sisestage korrektne IPv4 või IPv6 aadress." + +msgid "Enter only digits separated by commas." +msgstr "Sisestage ainult komaga eraldatud numbreid." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Veendu, et see väärtus on %(limit_value)s (hetkel on %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Veendu, et see väärtus on väiksem või võrdne kui %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Veendu, et see väärtus on suurem või võrdne kui %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Väärtuses peab olema vähemalt %(limit_value)d tähemärk (praegu on " +"%(show_value)d)." +msgstr[1] "" +"Väärtuses peab olema vähemalt %(limit_value)d tähemärki (praegu on " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärk (praegu on " +"%(show_value)d)." +msgstr[1] "" +"Väärtuses võib olla kõige rohkem %(limit_value)d tähemärki (praegu on " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Sisestage arv." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." +msgstr[1] "Veenduge, et kogu numbrikohtade arv ei oleks suurem kui %(max)s." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." +msgstr[1] "Veenduge, et komakohtade arv ei oleks suurem kui %(max)s." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." +msgstr[1] "" +"Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %(max)s." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Faililaiend '%(extension)s' ei ole lubatud. Lubatud laiendid on: " +"'%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Tühjad tähemärgid ei ole lubatud." + +msgid "and" +msgstr "ja" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s väljaga %(field_labels)s on juba olemas." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Väärtus %(value)r ei ole kehtiv valik." + +msgid "This field cannot be null." +msgstr "See lahter ei tohi olla tühi." + +msgid "This field cannot be blank." +msgstr "See väli ei saa olla tühi." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Sellise %(field_label)s-väljaga %(model_name)s on juba olemas." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s peab olema unikaalne %(date_field_label)s %(lookup_type)s " +"suhtes." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Lahter tüüpi: %(field_type)s" + +msgid "Integer" +msgstr "Täisarv" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' väärtus peab olema täisarv." + +msgid "Big (8 byte) integer" +msgstr "Suur (8 baiti) täisarv" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' väärtus peab olema kas Tõene või Väär." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Tõeväärtus (Kas tõene või väär)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (kuni %(max_length)s märki)" + +msgid "Comma-separated integers" +msgstr "Komaga eraldatud täisarvud" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' väärtusel on vale kuupäevaformaat. See peab olema kujul AAAA-KK-" +"PP." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' väärtusel on õige formaat (AAAA-KK-PP), kuid kuupäev on vale." + +msgid "Date (without time)" +msgstr "Kuupäev (kellaajata)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' väärtusel on vale formaat. Peab olema formaadis AAAA-KK-PP HH:" +"MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' väärtusel on õige formaat (AAAA-KK-PP HH:MM[:ss[.uuuuuu]][TZ]), " +"kuid kuupäev/kellaaeg on vale." + +msgid "Date (with time)" +msgstr "Kuupäev (kellaajaga)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' väärtus peab olema kümnendarv." + +msgid "Decimal number" +msgstr "Kümnendmurd" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' väärtusel on vale formaat. Peab olema formaadis [DD] [HH:" +"[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Kestus" + +msgid "Email address" +msgstr "E-posti aadress" + +msgid "File path" +msgstr "Faili asukoht" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' väärtus peab olema ujukomaarv." + +msgid "Floating point number" +msgstr "Ujukomaarv" + +msgid "IPv4 address" +msgstr "IPv4 aadress" + +msgid "IP address" +msgstr "IP aadress" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' väärtus peab olema kas Puudub, Tõene või Väär." + +msgid "Boolean (Either True, False or None)" +msgstr "Tõeväärtus (Kas tõene, väär või tühi)" + +msgid "Positive integer" +msgstr "Positiivne täisarv" + +msgid "Positive small integer" +msgstr "Positiivne väikene täisarv" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Nälk (kuni %(max_length)s märki)" + +msgid "Small integer" +msgstr "Väike täisarv" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' väärtusel on vale formaat. Peab olema formaadis HH:MM[:ss[." +"uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' väärtusel on õige formaat (HH:MM[:ss[.uuuuuu]]), kuid kellaaeg " +"on vale." + +msgid "Time" +msgstr "Aeg" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Töötlemata binaarandmed" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' ei ole korrektne UUID." + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "Fail" + +msgid "Image" +msgstr "Pilt" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s isendit %(field)s %(value)r ei leidu." + +msgid "Foreign Key (type determined by related field)" +msgstr "Välisvõti (tüübi määrab seotud väli) " + +msgid "One-to-one relationship" +msgstr "Üks-ühele seos" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s seos" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s seosed" + +msgid "Many-to-many relationship" +msgstr "Mitu-mitmele seos" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "See lahter on nõutav." + +msgid "Enter a whole number." +msgstr "Sisestage täisarv." + +msgid "Enter a valid date." +msgstr "Sisestage korrektne kuupäev." + +msgid "Enter a valid time." +msgstr "Sisestage korrektne kellaaeg." + +msgid "Enter a valid date/time." +msgstr "Sisestage korrektne kuupäev ja kellaaeg." + +msgid "Enter a valid duration." +msgstr "Sisestage korrektne kestus." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Päevade arv peab jääma vahemikku {min_days} kuni {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ühtegi faili ei saadetud. Kontrollige vormi kodeeringutüüpi." + +msgid "No file was submitted." +msgstr "Ühtegi faili ei saadetud." + +msgid "The submitted file is empty." +msgstr "Saadetud fail on tühi." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Veenduge, et faili nimes poleks rohkem kui %(max)d märk (praegu on " +"%(length)d)." +msgstr[1] "" +"Veenduge, et faili nimes poleks rohkem kui %(max)d märki (praegu on " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Palun laadige fail või märgistage 'tühjenda' kast, mitte mõlemat." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Laadige korrektne pilt. Fail, mille laadisite, ei olnud kas pilt või oli " +"fail vigane." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Valige korrektne väärtus. %(value)s ei ole valitav." + +msgid "Enter a list of values." +msgstr "Sisestage väärtuste nimekiri." + +msgid "Enter a complete value." +msgstr "Sisestage täielik väärtus." + +msgid "Enter a valid UUID." +msgstr "Sisestage korrektne UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Peidetud väli %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm andmed on kadunud või nendega on keegi midagi teinud" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Palun kinnitage %d või vähem vormi." +msgstr[1] "Palun kinnitage %d või vähem vormi." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Palun kinnitage %d või rohkem vormi." +msgstr[1] "Palun kinnitage %d või rohkem vormi." + +msgid "Order" +msgstr "Järjestus" + +msgid "Delete" +msgstr "Kustuta" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Palun parandage duplikaat-andmed lahtris %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Palun parandage duplikaat-andmed lahtris %(field)s, mis peab olema unikaalne." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Palun parandage allolevad duplikaat-väärtused" + +msgid "The inline value did not match the parent instance." +msgstr "Pesastatud väärtus ei sobi ülemobjektiga." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Valige korrektne väärtus. Valitud väärtus ei ole valitav." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" ei ole korrektne väärtus." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s ei saanud tõlgendada ajavööndis %(current_timezone)s; see on " +"kas puudu või mitmetähenduslik." + +msgid "Clear" +msgstr "Tühjenda" + +msgid "Currently" +msgstr "Hetkel" + +msgid "Change" +msgstr "Muuda" + +msgid "Unknown" +msgstr "Tundmatu" + +msgid "Yes" +msgstr "Jah" + +msgid "No" +msgstr "Ei" + +msgid "yes,no,maybe" +msgstr "jah,ei,võib-olla" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bait" +msgstr[1] "%(size)d baiti" + +#, python-format +msgid "%s KB" +msgstr "%s kB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.l." + +msgid "a.m." +msgstr "e.l." + +msgid "PM" +msgstr "PL" + +msgid "AM" +msgstr "EL" + +msgid "midnight" +msgstr "südaöö" + +msgid "noon" +msgstr "keskpäev" + +msgid "Monday" +msgstr "esmaspäev" + +msgid "Tuesday" +msgstr "teisipäev" + +msgid "Wednesday" +msgstr "kolmapäev" + +msgid "Thursday" +msgstr "neljapäev" + +msgid "Friday" +msgstr "reede" + +msgid "Saturday" +msgstr "laupäev" + +msgid "Sunday" +msgstr "pühapäev" + +msgid "Mon" +msgstr "esmasp." + +msgid "Tue" +msgstr "teisip." + +msgid "Wed" +msgstr "kolmap." + +msgid "Thu" +msgstr "neljap." + +msgid "Fri" +msgstr "reede" + +msgid "Sat" +msgstr "laup." + +msgid "Sun" +msgstr "pühap." + +msgid "January" +msgstr "jaanuar" + +msgid "February" +msgstr "veebruar" + +msgid "March" +msgstr "märts" + +msgid "April" +msgstr "aprill" + +msgid "May" +msgstr "mai" + +msgid "June" +msgstr "juuni" + +msgid "July" +msgstr "juuli" + +msgid "August" +msgstr "august" + +msgid "September" +msgstr "september" + +msgid "October" +msgstr "oktoober" + +msgid "November" +msgstr "november" + +msgid "December" +msgstr "detsember" + +msgid "jan" +msgstr "jaan" + +msgid "feb" +msgstr "veeb" + +msgid "mar" +msgstr "märts" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "mai" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "aug" + +msgid "sep" +msgstr "sept" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dets" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "jaan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "veeb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "mär." + +msgctxt "abbrev. month" +msgid "April" +msgstr "apr." + +msgctxt "abbrev. month" +msgid "May" +msgstr "mai" + +msgctxt "abbrev. month" +msgid "June" +msgstr "juuni" + +msgctxt "abbrev. month" +msgid "July" +msgstr "juuli" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "aug." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "dets." + +msgctxt "alt. month" +msgid "January" +msgstr "jaanuar" + +msgctxt "alt. month" +msgid "February" +msgstr "veebruar" + +msgctxt "alt. month" +msgid "March" +msgstr "märts" + +msgctxt "alt. month" +msgid "April" +msgstr "aprill" + +msgctxt "alt. month" +msgid "May" +msgstr "mai" + +msgctxt "alt. month" +msgid "June" +msgstr "juuni" + +msgctxt "alt. month" +msgid "July" +msgstr "juuli" + +msgctxt "alt. month" +msgid "August" +msgstr "august" + +msgctxt "alt. month" +msgid "September" +msgstr "september" + +msgctxt "alt. month" +msgid "October" +msgstr "oktoober" + +msgctxt "alt. month" +msgid "November" +msgstr "november" + +msgctxt "alt. month" +msgid "December" +msgstr "detsember" + +msgid "This is not a valid IPv6 address." +msgstr "See ei ole korrektne IPv6 aadress." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "või" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d aasta" +msgstr[1] "%d aastat" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d kuu" +msgstr[1] "%d kuud" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d nädal" +msgstr[1] "%d nädalat" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d päev" +msgstr[1] "%d päeva" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d tund" +msgstr[1] "%d tundi" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minutit" + +msgid "0 minutes" +msgstr "0 minutit" + +msgid "Forbidden" +msgstr "Keelatud" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF verifitseerimine ebaõnnestus. Päring katkestati." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Näete seda sõnumit, kuna käesolev HTTPS leht nõuab 'Viitaja päise' saatmist " +"teie brauserile, kuid seda ei saadetud. Seda päist on vaja " +"turvakaalutlustel, kindlustamaks et teie brauserit ei ole kolmandate " +"osapoolte poolt üle võetud." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Kui olete oma brauseri seadistustes välja lülitanud 'Viitaja' päised siis " +"lülitage need taas sisse vähemalt antud lehe jaoks või HTTPS üheduste jaoks " +"või 'sama-allika' päringute jaoks." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Näete seda teadet, kuna see leht vajab CSRF küpsist vormide postitamiseks. " +"Seda küpsist on vaja turvakaalutlustel, kindlustamaks et teie brauserit ei " +"ole kolmandate osapoolte poolt üle võetud." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Kui olete oma brauseris küpsised keelanud, siis palun lubage need vähemalt " +"selle lehe jaoks või 'sama-allika' päringute jaoks." + +msgid "More information is available with DEBUG=True." +msgstr "Saadaval on rohkem infot kasutades DEBUG=True" + +msgid "No year specified" +msgstr "Aasta on valimata" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Kuu on valimata" + +msgid "No day specified" +msgstr "Päev on valimata" + +msgid "No week specified" +msgstr "Nädal on valimata" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ei leitud %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Tulevane %(verbose_name_plural)s pole saadaval, sest %(class_name)s." +"allow_future on False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Vigane kuupäeva-string '%(datestr)s' lähtudes formaadist '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Päringule vastavat %(verbose_name)s ei leitud" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Lehekülg ei ole 'last', ka ei saa teda konvertida täisarvuks." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Vigane leht (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Tühi list ja '%(class_name)s.allow_empty' on False." + +msgid "Directory indexes are not allowed here." +msgstr "Kausta sisuloendid ei ole siin lubatud." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ei eksisteeri" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s sisuloend" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Näete seda lehte, kuna teil on määratud DEBUG=True Django seadete failis ja te ei ole ühtki URLi seadistanud." + +msgid "Django Documentation" +msgstr "Django dokumentatsioon" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3a88f99 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..a18089d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,1277 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aitzol Naberan , 2013,2016 +# Ander Martínez , 2013-2014 +# Eneko Illarramendi , 2017-2019 +# Jannis Leidel , 2011 +# jazpillaga , 2011 +# julen, 2011-2012 +# julen, 2013,2015 +# totorika93 , 2012 +# Unai Zalakain , 2013 +# Urtzi Odriozola , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-22 10:02+0000\n" +"Last-Translator: Eneko Illarramendi \n" +"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arabiera" + +msgid "Asturian" +msgstr "Asturiera" + +msgid "Azerbaijani" +msgstr "Azerbaijanera" + +msgid "Bulgarian" +msgstr "Bulgariera" + +msgid "Belarusian" +msgstr "Bielorrusiera" + +msgid "Bengali" +msgstr "Bengalera" + +msgid "Breton" +msgstr "Bretoia" + +msgid "Bosnian" +msgstr "Bosniera" + +msgid "Catalan" +msgstr "Katalana" + +msgid "Czech" +msgstr "Txekiera" + +msgid "Welsh" +msgstr "Galesa" + +msgid "Danish" +msgstr "Daniera" + +msgid "German" +msgstr "Alemana" + +msgid "Lower Sorbian" +msgstr "Behe-sorbiera" + +msgid "Greek" +msgstr "Greziera" + +msgid "English" +msgstr "Ingelesa" + +msgid "Australian English" +msgstr "Australiar ingelesa" + +msgid "British English" +msgstr "Ingelesa" + +msgid "Esperanto" +msgstr "Esperantoa" + +msgid "Spanish" +msgstr "Gaztelania" + +msgid "Argentinian Spanish" +msgstr "Gaztelania (Argentina)" + +msgid "Colombian Spanish" +msgstr "Gaztelania (Kolonbia)" + +msgid "Mexican Spanish" +msgstr "Gaztelania (Mexiko)" + +msgid "Nicaraguan Spanish" +msgstr "Gaztelania (Nikaragua)" + +msgid "Venezuelan Spanish" +msgstr "Gaztelania (Venezuela)" + +msgid "Estonian" +msgstr "Estoniera" + +msgid "Basque" +msgstr "Euskara" + +msgid "Persian" +msgstr "Persiera" + +msgid "Finnish" +msgstr "Finlandiera" + +msgid "French" +msgstr "Frantsesa" + +msgid "Frisian" +msgstr "Frisiera" + +msgid "Irish" +msgstr "Irlandako gaelikoa" + +msgid "Scottish Gaelic" +msgstr "Eskoziako gaelikoa" + +msgid "Galician" +msgstr "Galiziera" + +msgid "Hebrew" +msgstr "Hebreera" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Kroaziera" + +msgid "Upper Sorbian" +msgstr "Goi-sorbiera" + +msgid "Hungarian" +msgstr "Hungariera" + +msgid "Armenian" +msgstr "Armeniera" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonesiera" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandiera" + +msgid "Italian" +msgstr "Italiera" + +msgid "Japanese" +msgstr "Japoniera" + +msgid "Georgian" +msgstr "Georgiera" + +msgid "Kabyle" +msgstr "Kabylera" + +msgid "Kazakh" +msgstr "Kazakhera" + +msgid "Khmer" +msgstr "Khmerera" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreera" + +msgid "Luxembourgish" +msgstr "Luxenburgera" + +msgid "Lithuanian" +msgstr "Lituaniera" + +msgid "Latvian" +msgstr "Letoniera" + +msgid "Macedonian" +msgstr "Mazedoniera" + +msgid "Malayalam" +msgstr "Malabarera" + +msgid "Mongolian" +msgstr "Mongoliera" + +msgid "Marathi" +msgstr "Marathera" + +msgid "Burmese" +msgstr "Birmaniera" + +msgid "Norwegian Bokmål" +msgstr "Bokmåla (Norvegia)" + +msgid "Nepali" +msgstr "Nepalera" + +msgid "Dutch" +msgstr "Nederlandera" + +msgid "Norwegian Nynorsk" +msgstr "Nynorsk (Norvegia)" + +msgid "Ossetic" +msgstr "Osetiera" + +msgid "Punjabi" +msgstr "Punjabera" + +msgid "Polish" +msgstr "Poloniera" + +msgid "Portuguese" +msgstr "Portugesa" + +msgid "Brazilian Portuguese" +msgstr "Portugesa (Brazil)" + +msgid "Romanian" +msgstr "Errumaniera" + +msgid "Russian" +msgstr "Errusiera" + +msgid "Slovak" +msgstr "Eslovakiera" + +msgid "Slovenian" +msgstr "Esloveniera" + +msgid "Albanian" +msgstr "Albaniera" + +msgid "Serbian" +msgstr "Serbiera" + +msgid "Serbian Latin" +msgstr "Serbiera" + +msgid "Swedish" +msgstr "Suediera" + +msgid "Swahili" +msgstr "Swahilia" + +msgid "Tamil" +msgstr "Tamilera" + +msgid "Telugu" +msgstr "Telugua" + +msgid "Thai" +msgstr "Thailandiera" + +msgid "Turkish" +msgstr "Turkiera" + +msgid "Tatar" +msgstr "Tatarera" + +msgid "Udmurt" +msgstr "Udmurtera" + +msgid "Ukrainian" +msgstr "Ukrainera" + +msgid "Urdu" +msgstr "Urdua" + +msgid "Vietnamese" +msgstr "Vietnamera" + +msgid "Simplified Chinese" +msgstr "Txinera (sinpletua)" + +msgid "Traditional Chinese" +msgstr "Txinera (tradizionala)" + +msgid "Messages" +msgstr "Mezuak" + +msgid "Site Maps" +msgstr "Sitemap-ak" + +msgid "Static Files" +msgstr "Fitxategi estatikoak" + +msgid "Syndication" +msgstr "Sindikazioa" + +msgid "That page number is not an integer" +msgstr "Orrialde hori ez da zenbaki bat" + +msgid "That page number is less than 1" +msgstr "Orrialde zenbaki hori 1 baino txikiagoa da" + +msgid "That page contains no results" +msgstr "Orrialde horrek ez du emaitzarik" + +msgid "Enter a valid value." +msgstr "Idatzi baleko balio bat." + +msgid "Enter a valid URL." +msgstr "Idatzi baleko URL bat." + +msgid "Enter a valid integer." +msgstr "Idatzi baleko zenbaki bat." + +msgid "Enter a valid email address." +msgstr "Idatzi baleko helbide elektroniko bat." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Idatzi hizki, zenbaki, azpimarra edo marratxoz osatutako baleko 'slug' bat." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Idatzi Unicode hizki, zenbaki, azpimarra edo marratxoz osatutako baleko " +"'slug' bat." + +msgid "Enter a valid IPv4 address." +msgstr "Idatzi baleko IPv4 sare-helbide bat." + +msgid "Enter a valid IPv6 address." +msgstr "Idatzi baleko IPv6 sare-helbide bat." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Idatzi baleko IPv4 edo IPv6 sare-helbide bat." + +msgid "Enter only digits separated by commas." +msgstr "Idatzi komaz bereizitako digitoak soilik." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Ziurtatu balio hau gutxienez %(limit_value)s dela (orain %(show_value)s da)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Ziurtatu balio hau %(limit_value)s baino txikiagoa edo berdina dela." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Ziurtatu balio hau %(limit_value)s baino handiagoa edo berdina dela." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Ziurtatu balio honek gutxienez karaktere %(limit_value)d duela " +"(%(show_value)d ditu)." +msgstr[1] "" +"Ziurtatu balio honek gutxienez %(limit_value)d karaktere dituela " +"(%(show_value)d ditu)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Ziurtatu balio honek gehienez karaktere %(limit_value)d duela " +"(%(show_value)d ditu)." +msgstr[1] "" +"Ziurtatu balio honek gehienez %(limit_value)d karaktere dituela " +"(%(show_value)d ditu)." + +msgid "Enter a number." +msgstr "Idatzi zenbaki bat." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Ziurtatu digitu %(max)s baino gehiago ez dagoela guztira." +msgstr[1] "Ziurtatu %(max)s digitu baino gehiago ez dagoela guztira." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren atzetik." +msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren atzetik." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Ziurtatu ez dagoela digitu %(max)s baino gehiago komaren aurretik." +msgstr[1] "Ziurtatu ez dagoela %(max)s digitu baino gehiago komaren aurretik." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"'%(extension)s' fitxategi-luzapena ez da balekoa. Hauek dira onartutako " +"fitxategi-luzapenak: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Null karaktereak ez daude baimenduta." + +msgid "and" +msgstr "eta" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(field_labels)s hauek dauzkan %(model_name)s dagoeneko existitzen da." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r balioa ez da baleko aukera bat." + +msgid "This field cannot be null." +msgstr "Eremu hau ezin daiteke hutsa izan (null)." + +msgid "This field cannot be blank." +msgstr "Eremu honek ezin du hutsik egon." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(field_label)s hori daukan %(model_name)s dagoeneko existitzen da." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Eremuaren mota: %(field_type)s" + +msgid "Integer" +msgstr "Zenbaki osoa" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' balioak integer bat izan behar du." + +msgid "Big (8 byte) integer" +msgstr "Zenbaki osoa (handia 8 byte)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' balioak True edo False izan behar du." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' balioak True, False edo None izan behar du." + +msgid "Boolean (Either True or False)" +msgstr "Boolearra (True edo False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String-a (%(max_length)s gehienez)" + +msgid "Comma-separated integers" +msgstr "Komaz bereiztutako zenbaki osoak" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' balioak ez dauka data formatu zuzena. Formatu zuzena UUUU-HH-EE " +"da." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' balioak formatu zuzena (UUUU-HH-EE) dauka, baina ez da data " +"zuzen bat." + +msgid "Date (without time)" +msgstr "Data (ordurik gabe)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' balioak ez dauka formatu zuzena. Formatu zuzena UUUU-HH-EE OO:" +"MM[:ss[.uuuuuu]][TZ] da." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' balioak formatu zuzena dauka (UUUU-HH-EE OO:MM[:ss[.uuuuuu]]" +"[TZ]),\n" +"baina ez da data/ordu zuzena." + +msgid "Date (with time)" +msgstr "Data (orduarekin)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' balioak zenbaki hamartarra izan behar du." + +msgid "Decimal number" +msgstr "Zenbaki hamartarra" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' balioak ez dauka foramtu zuzena. [EE] [OO:[MM:]]ss[.uuuuuu] " +"formatuan egon behar da." + +msgid "Duration" +msgstr "Iraupena" + +msgid "Email address" +msgstr "Helbide elektronikoa" + +msgid "File path" +msgstr "Fitxategiaren bidea" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' balioak float bat izan behar du." + +msgid "Floating point number" +msgstr "Koma higikorreko zenbakia (float)" + +msgid "IPv4 address" +msgstr "IPv4 sare-helbidea" + +msgid "IP address" +msgstr "IP helbidea" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' balioak None, True, edo False izan behar du." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolearra (True, False edo None)" + +msgid "Positive integer" +msgstr "Osoko positiboa" + +msgid "Positive small integer" +msgstr "Osoko positibo txikia" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (gehienez %(max_length)s)" + +msgid "Small integer" +msgstr "Osoko txikia" + +msgid "Text" +msgstr "Testua" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' balioak ez dauka formatu zuzena. OO:MM[:ss[.uuuuuu]] formatuan " +"egon behar du." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' balioak formatu zuzena dauka (OO:MM[:ss[.uuuuuu]]) baina ez da " +"ordu \n" +"zuzena" + +msgid "Time" +msgstr "Ordua" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Datu bitar gordinak" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' ez da baleko UUID bat." + +msgid "Universally unique identifier" +msgstr "\"Universally unique identifier\"" + +msgid "File" +msgstr "Fitxategia" + +msgid "Image" +msgstr "Irudia" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" +"%(field)s %(value)r edukidun %(model)s modeloko instantziarik ez da " +"exiistitzen." + +msgid "Foreign Key (type determined by related field)" +msgstr "1-N (mota erlazionatutako eremuaren arabera)" + +msgid "One-to-one relationship" +msgstr "Bat-bat erlazioa" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s erlazioa" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s erlazioak" + +msgid "Many-to-many relationship" +msgstr "M:N erlazioa" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Eremu hau beharrezkoa da." + +msgid "Enter a whole number." +msgstr "Idatzi zenbaki oso bat." + +msgid "Enter a valid date." +msgstr "Idatzi baleko data bat." + +msgid "Enter a valid time." +msgstr "Idatzi baleko ordu bat." + +msgid "Enter a valid date/time." +msgstr "Idatzi baleko data/ordu bat." + +msgid "Enter a valid duration." +msgstr "Idatzi baleko iraupen bat." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Egun kopuruak {min_days} eta {max_days} artean egon behar du." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ez da fitxategirik bidali. Egiaztatu formularioaren kodeketa-mota." + +msgid "No file was submitted." +msgstr "Ez da fitxategirik bidali." + +msgid "The submitted file is empty." +msgstr "Bidalitako fitxategia hutsik dago." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Ziurtatu fitxategi izen honek gehienez karaktere %(max)d duela (%(length)d " +"ditu)." +msgstr[1] "" +"Ziurtatu fitxategi izen honek gehienez %(max)d karaktere dituela (%(length)d " +"ditu)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Mesedez, igo fitxategi bat edo egin klik garbitu botoian, ez biak." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Igo baleko irudi bat. Zuk igotako fitxategia ez da irudi bat edo akatsen bat " +"du." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Hautatu baleko aukera bat. %(value)s ez dago erabilgarri." + +msgid "Enter a list of values." +msgstr "Idatzi balio-zerrenda bat." + +msgid "Enter a complete value." +msgstr "Sartu balio osoa." + +msgid "Enter a valid UUID." +msgstr "Idatzi baleko UUID bat." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(%(name)s eremu ezkutua) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm daturik ez dago edo ez da balekoa." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Bidali formulario %d edo gutxiago, mesedez." +msgstr[1] "Bidali %d formulario edo gutxiago, mesedez." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Gehitu formulario %d edo gehiago" +msgstr[1] "Bidali %d formulario edo gehiago, mesedez." + +msgid "Order" +msgstr "Ordena" + +msgid "Delete" +msgstr "Ezabatu" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Zuzendu bikoiztketa %(field)s eremuan." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Zuzendu bikoizketa %(field)s eremuan. Bakarra izan behar da." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Zuzendu bakarra izan behar den%(field_name)s eremuarentzako bikoiztutako " +"data %(lookup)s egiteko %(date_field)s eremuan" + +msgid "Please correct the duplicate values below." +msgstr "Zuzendu hurrengo balio bikoiztuak." + +msgid "The inline value did not match the parent instance." +msgstr "Barneko balioa eta gurasoaren instantzia ez datoz bat." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Hautatu aukera zuzen bat. Hautatutakoa ez da zuzena." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" ez da balio egokia." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s ezin da interpretatu %(current_timezone)s ordu-eremuan;\n" +"baliteke ez existitzea edo anbiguoa izatea" + +msgid "Clear" +msgstr "Garbitu" + +msgid "Currently" +msgstr "Orain" + +msgid "Change" +msgstr "Aldatu" + +msgid "Unknown" +msgstr "Ezezaguna" + +msgid "Yes" +msgstr "Bai" + +msgid "No" +msgstr "Ez" + +msgid "yes,no,maybe" +msgstr "bai,ez,agian" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "byte %(size)d " +msgstr[1] "%(size)d byte" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "gauerdia" + +msgid "noon" +msgstr "eguerdia" + +msgid "Monday" +msgstr "astelehena" + +msgid "Tuesday" +msgstr "asteartea" + +msgid "Wednesday" +msgstr "asteazkena" + +msgid "Thursday" +msgstr "osteguna" + +msgid "Friday" +msgstr "ostirala" + +msgid "Saturday" +msgstr "larunbata" + +msgid "Sunday" +msgstr "igandea" + +msgid "Mon" +msgstr "al" + +msgid "Tue" +msgstr "ar" + +msgid "Wed" +msgstr "az" + +msgid "Thu" +msgstr "og" + +msgid "Fri" +msgstr "ol" + +msgid "Sat" +msgstr "lr" + +msgid "Sun" +msgstr "ig" + +msgid "January" +msgstr "urtarrila" + +msgid "February" +msgstr "otsaila" + +msgid "March" +msgstr "martxoa" + +msgid "April" +msgstr "apirila" + +msgid "May" +msgstr "maiatza" + +msgid "June" +msgstr "ekaina" + +msgid "July" +msgstr "uztaila" + +msgid "August" +msgstr "abuztua" + +msgid "September" +msgstr "iraila" + +msgid "October" +msgstr "urria" + +msgid "November" +msgstr "azaroa" + +msgid "December" +msgstr "abendua" + +msgid "jan" +msgstr "urt" + +msgid "feb" +msgstr "ots" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "api" + +msgid "may" +msgstr "mai" + +msgid "jun" +msgstr "eka" + +msgid "jul" +msgstr "uzt" + +msgid "aug" +msgstr "abu" + +msgid "sep" +msgstr "ira" + +msgid "oct" +msgstr "urr" + +msgid "nov" +msgstr "aza" + +msgid "dec" +msgstr "abe" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "urt." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "ots." + +msgctxt "abbrev. month" +msgid "March" +msgstr "mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "api." + +msgctxt "abbrev. month" +msgid "May" +msgstr "mai." + +msgctxt "abbrev. month" +msgid "June" +msgstr "eka." + +msgctxt "abbrev. month" +msgid "July" +msgstr "uzt." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "abu." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "ira." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "urr." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "aza." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "abe." + +msgctxt "alt. month" +msgid "January" +msgstr "urtarrila" + +msgctxt "alt. month" +msgid "February" +msgstr "otsaila" + +msgctxt "alt. month" +msgid "March" +msgstr "martxoa" + +msgctxt "alt. month" +msgid "April" +msgstr "apirila" + +msgctxt "alt. month" +msgid "May" +msgstr "maiatza" + +msgctxt "alt. month" +msgid "June" +msgstr "ekaina" + +msgctxt "alt. month" +msgid "July" +msgstr "uztaila" + +msgctxt "alt. month" +msgid "August" +msgstr "abuztua" + +msgctxt "alt. month" +msgid "September" +msgstr "iraila" + +msgctxt "alt. month" +msgid "October" +msgstr "urria" + +msgctxt "alt. month" +msgid "November" +msgstr "azaroa" + +msgctxt "alt. month" +msgid "December" +msgstr "abendua" + +msgid "This is not a valid IPv6 address." +msgstr "Hau ez da baleko IPv6 helbide bat." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "edo" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "urte %d" +msgstr[1] "%d urte" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "hilabete %d" +msgstr[1] "%d hilabete" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "aste %d" +msgstr[1] "%d aste" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "egun %d" +msgstr[1] "%d egun" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "ordu %d" +msgstr[1] "%d ordu" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "minutu %d" +msgstr[1] "%d minutu" + +msgid "0 minutes" +msgstr "0 minutu" + +msgid "Forbidden" +msgstr "Debekatuta" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF egiaztapenak huts egin du. Eskaera abortatu da." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Mezu hau ikusten ari zara HTTPS gune honek, zure nabigatzaileak 'Referer " +"header' bat bidaltzea behar duelako, baina ez du batere bidali. Goiburuko " +"hau zure nabigatzailea beste norbaitek ordeztu ez duela ziurtatzeko eskatzen " +"da." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Zure nabigatzailera 'Refere' goiburukoak desgaitzeko konfiguratu baldin " +"baduzu, mesedez, gune honetarako, HTTPS konexio edo 'same-origin' " +"eskaeretarako gaitu berriro." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +" etiketa erabiltzen ari " +"bazara edo 'Referrer-Policy: no-referrer' goiburukoa, mesedez ezabatu " +"itzazu. CSRF babesak 'Referer' goiburukoa behar du egiaztapen zorrotza " +"egiteko. Pribatutasunaz kezkatuta bazaude, erabili bezalako alternatibak hirugarrenen webgune loturentzat." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Formularioa bidaltzean gune honek CSRF cookie bat behar duelako ikusten duzu " +"mezu hau. Cookie hau beharrezkoa da segurtasun arrazoiengatik, zure " +"nabigatzailea beste batek ordezkatzen ez duela ziurtatzeko." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Nabigatzailea cookiak desgaitzeko konfiguratu baldin baduzu, mesedez " +"aktibatu behintzat gune honetarako, edo 'same-origin' eskaeretarako." + +msgid "More information is available with DEBUG=True." +msgstr "Informazio gehiago erabilgarri dago DEBUG=True ezarrita." + +msgid "No year specified" +msgstr "Ez da urterik zehaztu" + +msgid "Date out of range" +msgstr "Data baliozko tartetik kanpo" + +msgid "No month specified" +msgstr "Ez da hilabeterik zehaztu" + +msgid "No day specified" +msgstr "Ez da egunik zehaztu" + +msgid "No week specified" +msgstr "Ez da asterik zehaztu" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ez dago %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Etorkizuneko %(verbose_name_plural)s ez dago aukeran %(class_name)s." +"allow_future False delako" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "%(datestr)s data string okerra '%(format)s' formaturako" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Bilaketarekin bat datorren %(verbose_name)s-rik ez dago" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Orria ez da azkena, hortaz ezin da osokora (int) biurtu." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Orri baliogabea (%(page_number)s):%(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Zerrenda hutsa eta '%(class_name)s.allow_empty' False da" + +msgid "Directory indexes are not allowed here." +msgstr "Direktorio zerrendak ez daude baimenduak." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ez da existitzen" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s zerrenda" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: epeekin perfekzionistak direnentzat Web frameworka." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Ikusi Django %(version)s-ren argitaratze " +"oharrak" + +msgid "The install worked successfully! Congratulations!" +msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Zure settings fitxategian DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako ari zara " +"ikusten orrialde hau." + +msgid "Django Documentation" +msgstr "Django dokumentazioa" + +msgid "Topics, references, & how-to's" +msgstr "Gaiak, erreferentziak, & laguntzak" + +msgid "Tutorial: A Polling App" +msgstr "Tutoriala: Galdetegi aplikazioa" + +msgid "Get started with Django" +msgstr "Hasi Djangorekin" + +msgid "Django Community" +msgstr "Django Komunitatea" + +msgid "Connect, get help, or contribute" +msgstr "Konektatu, lortu laguntza edo lagundu" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..4cef64f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,1267 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017-2018 +# Antti Kaihola , 2011 +# Jannis Leidel , 2011 +# Lasse Liehu , 2015 +# Mika Mäkelä , 2018 +# Klaus Dahlén , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:44+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "afrikaans" + +msgid "Arabic" +msgstr "arabia" + +msgid "Asturian" +msgstr "asturian kieli" + +msgid "Azerbaijani" +msgstr "azeri" + +msgid "Bulgarian" +msgstr "bulgaria" + +msgid "Belarusian" +msgstr "valkovenäjän kieli" + +msgid "Bengali" +msgstr "bengali" + +msgid "Breton" +msgstr "bretoni" + +msgid "Bosnian" +msgstr "bosnia" + +msgid "Catalan" +msgstr "katalaani" + +msgid "Czech" +msgstr "tšekki" + +msgid "Welsh" +msgstr "wales" + +msgid "Danish" +msgstr "tanska" + +msgid "German" +msgstr "saksa" + +msgid "Lower Sorbian" +msgstr "Alasorbi" + +msgid "Greek" +msgstr "kreikka" + +msgid "English" +msgstr "englanti" + +msgid "Australian English" +msgstr "australianenglanti" + +msgid "British English" +msgstr "brittienglanti" + +msgid "Esperanto" +msgstr "esperanto" + +msgid "Spanish" +msgstr "espanja" + +msgid "Argentinian Spanish" +msgstr "Argentiinan espanja" + +msgid "Colombian Spanish" +msgstr "Kolumbian espanja" + +msgid "Mexican Spanish" +msgstr "Meksikon espanja" + +msgid "Nicaraguan Spanish" +msgstr "Nicaraguan espanja" + +msgid "Venezuelan Spanish" +msgstr "Venezuelan espanja" + +msgid "Estonian" +msgstr "viro" + +msgid "Basque" +msgstr "baski" + +msgid "Persian" +msgstr "persia" + +msgid "Finnish" +msgstr "suomi" + +msgid "French" +msgstr "ranska" + +msgid "Frisian" +msgstr "friisi" + +msgid "Irish" +msgstr "irlanti" + +msgid "Scottish Gaelic" +msgstr "Skottilainen gaeli" + +msgid "Galician" +msgstr "galicia" + +msgid "Hebrew" +msgstr "heprea" + +msgid "Hindi" +msgstr "hindi" + +msgid "Croatian" +msgstr "kroatia" + +msgid "Upper Sorbian" +msgstr "Yläsorbi" + +msgid "Hungarian" +msgstr "unkari" + +msgid "Armenian" +msgstr "" + +msgid "Interlingua" +msgstr "interlingua" + +msgid "Indonesian" +msgstr "indonesia" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islanti" + +msgid "Italian" +msgstr "italia" + +msgid "Japanese" +msgstr "japani" + +msgid "Georgian" +msgstr "georgia" + +msgid "Kabyle" +msgstr "Kabyle" + +msgid "Kazakh" +msgstr "kazakin kieli" + +msgid "Khmer" +msgstr "khmer" + +msgid "Kannada" +msgstr "kannada" + +msgid "Korean" +msgstr "korea" + +msgid "Luxembourgish" +msgstr "luxemburgin kieli" + +msgid "Lithuanian" +msgstr "liettua" + +msgid "Latvian" +msgstr "latvia" + +msgid "Macedonian" +msgstr "makedonia" + +msgid "Malayalam" +msgstr "malajalam" + +msgid "Mongolian" +msgstr "mongolia" + +msgid "Marathi" +msgstr "marathi" + +msgid "Burmese" +msgstr "burman kieli" + +msgid "Norwegian Bokmål" +msgstr "norja (bokmål)" + +msgid "Nepali" +msgstr "nepalin kieli" + +msgid "Dutch" +msgstr "hollanti" + +msgid "Norwegian Nynorsk" +msgstr "norja (uusnorja)" + +msgid "Ossetic" +msgstr "osseetin kieli" + +msgid "Punjabi" +msgstr "punjabin kieli" + +msgid "Polish" +msgstr "puola" + +msgid "Portuguese" +msgstr "portugali" + +msgid "Brazilian Portuguese" +msgstr "brasilian portugali" + +msgid "Romanian" +msgstr "romania" + +msgid "Russian" +msgstr "venäjä" + +msgid "Slovak" +msgstr "slovakia" + +msgid "Slovenian" +msgstr "slovenia" + +msgid "Albanian" +msgstr "albaani" + +msgid "Serbian" +msgstr "serbia" + +msgid "Serbian Latin" +msgstr "serbian latina" + +msgid "Swedish" +msgstr "ruotsi" + +msgid "Swahili" +msgstr "swahili" + +msgid "Tamil" +msgstr "tamili" + +msgid "Telugu" +msgstr "telugu" + +msgid "Thai" +msgstr "thain kieli" + +msgid "Turkish" +msgstr "turkki" + +msgid "Tatar" +msgstr "tataarin kieli" + +msgid "Udmurt" +msgstr "udmurtti" + +msgid "Ukrainian" +msgstr "ukraina" + +msgid "Urdu" +msgstr "urdu" + +msgid "Vietnamese" +msgstr "vietnam" + +msgid "Simplified Chinese" +msgstr "kiina (yksinkertaistettu)" + +msgid "Traditional Chinese" +msgstr "kiina (perinteinen)" + +msgid "Messages" +msgstr "Viestit" + +msgid "Site Maps" +msgstr "Sivukartat" + +msgid "Static Files" +msgstr "Staattiset tiedostot" + +msgid "Syndication" +msgstr "Syndikointi" + +msgid "That page number is not an integer" +msgstr "Annettu sivunumero ei ole kokonaisluku" + +msgid "That page number is less than 1" +msgstr "Annettu sivunumero on alle 1" + +msgid "That page contains no results" +msgstr "Annetulla sivulla ei ole tuloksia" + +msgid "Enter a valid value." +msgstr "Syötä oikea arvo." + +msgid "Enter a valid URL." +msgstr "Syötä oikea URL-osoite." + +msgid "Enter a valid integer." +msgstr "Syötä kelvollinen kokonaisluku." + +msgid "Enter a valid email address." +msgstr "Syötä kelvollinen sähköpostiosoite." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja " +"tavuviivoja (_ -)." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Tässä voidaan käyttää vain Unicode-kirjaimia, numeroita sekä ala- ja " +"tavuviivoja." + +msgid "Enter a valid IPv4 address." +msgstr "Syötä kelvollinen IPv4-osoite." + +msgid "Enter a valid IPv6 address." +msgstr "Syötä kelvollinen IPv6-osoite." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." + +msgid "Enter only digits separated by commas." +msgstr "Vain pilkulla erotetut kokonaisluvut kelpaavat tässä." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Tämän arvon on oltava %(limit_value)s (nyt %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Tämän arvon on oltava enintään %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Tämän luvun on oltava vähintään %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Varmista, että tämä arvo on vähintään %(limit_value)d merkin pituinen (tällä " +"hetkellä %(show_value)d)." +msgstr[1] "" +"Varmista, että tämä arvo on vähintään %(limit_value)d merkkiä pitkä (tällä " +"hetkellä %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Varmista, että tämä arvo on enintään %(limit_value)d merkin pituinen (tällä " +"hetkellä %(show_value)d)." +msgstr[1] "" +"Varmista, että tämä arvo on enintään %(limit_value)d merkkiä pitkä (tällä " +"hetkellä %(show_value)d)." + +msgid "Enter a number." +msgstr "Syötä luku." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Tässä luvussa voi olla yhteensä enintään %(max)s numero." +msgstr[1] "Tässä luvussa voi olla yhteensä enintään %(max)s numeroa." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Tässä luvussa saa olla enintään %(max)s desimaali." +msgstr[1] "Tässä luvussa saa olla enintään %(max)s desimaalia." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Tässä luvussa saa olla enintään %(max)s numero ennen desimaalipilkkua." +msgstr[1] "" +"Tässä luvussa saa olla enintään %(max)s numeroa ennen desimaalipilkkua." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Pääte \"%(extension)s\" ei ole sallittu. Sallittuja päätteitä ovat " +"\"%(allowed_extensions)s\"." + +msgid "Null characters are not allowed." +msgstr "Tyhjiä merkkejä (null) ei sallita." + +msgid "and" +msgstr "ja" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s jolla on nämä %(field_labels)s on jo olemassa." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Arvo %(value)r ei kelpaa." + +msgid "This field cannot be null." +msgstr "Tämän kentän arvo ei voi olla \"null\"." + +msgid "This field cannot be blank." +msgstr "Tämä kenttä ei voi olla tyhjä." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s jolla on tämä %(field_label)s, on jo olemassa." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"\"%(field_label)s\"-kentän on oltava uniikki suhteessa: %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Kenttä tyyppiä: %(field_type)s" + +msgid "Integer" +msgstr "Kokonaisluku" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "%(value)s-arvo tulee olla kokonaisluku." + +msgid "Big (8 byte) integer" +msgstr "Suuri (8-tavuinen) kokonaisluku" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "%(value)s-arvo pitää olla joko tosi tai epätosi." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "%(value)s-arvo pitää olla joko tosi, epätosi tai ei mitään." + +msgid "Boolean (Either True or False)" +msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Merkkijono (enintään %(max_length)s merkkiä)" + +msgid "Comma-separated integers" +msgstr "Pilkulla erotetut kokonaisluvut" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"%(value)s-arvo on väärässä päivämäärämuodossa. Sen tulee olla VVVV-KK-PP -" +"muodossa." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"%(value)s-arvo on oikeassa päivämäärämuodossa (VVVV-KK-PP), muttei ole " +"kelvollinen päivämäärä." + +msgid "Date (without time)" +msgstr "Päivämäärä (ilman kellonaikaa)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"%(value)s-arvon muoto ei kelpaa. Se tulee olla VVVV-KK-PP TT:MM[:ss[.uuuuuu]]" +"[TZ] -muodossa." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"%(value)s-arvon muoto on oikea (VVVV-KK-PP TT:MM[:ss[.uuuuuu]][TZ]), mutta " +"päivämäärä/aika ei ole kelvollinen." + +msgid "Date (with time)" +msgstr "Päivämäärä ja kellonaika" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "%(value)s-arvo tulee olla desimaaliluku." + +msgid "Decimal number" +msgstr "Desimaaliluku" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "%(value)s-arvo pitää olla muodossa [PP] TT:MM[:ss[.uuuuuu]]." + +msgid "Duration" +msgstr "Kesto" + +msgid "Email address" +msgstr "Sähköpostiosoite" + +msgid "File path" +msgstr "Tiedostopolku" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "%(value)s-arvo tulee olla liukuluku." + +msgid "Floating point number" +msgstr "Liukuluku" + +msgid "IPv4 address" +msgstr "IPv4-osoite" + +msgid "IP address" +msgstr "IP-osoite" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "%(value)s-arvo tulee olla joko ei mitään, tosi tai epätosi." + +msgid "Boolean (Either True, False or None)" +msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)" + +msgid "Positive integer" +msgstr "Positiivinen kokonaisluku" + +msgid "Positive small integer" +msgstr "Pieni positiivinen kokonaisluku" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Lyhytnimi (enintään %(max_length)s merkkiä)" + +msgid "Small integer" +msgstr "Pieni kokonaisluku" + +msgid "Text" +msgstr "Tekstiä" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "%(value)s-arvo pitää olla muodossa TT:MM[:ss[.uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"%(value)s-arvo on oikeassa muodossa (TT:MM[:ss[.uuuuuu]]), mutta kellonaika " +"ei kelpaa." + +msgid "Time" +msgstr "Kellonaika" + +msgid "URL" +msgstr "URL-osoite" + +msgid "Raw binary data" +msgstr "Raaka binaaridata" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "%(value)s ei ole kelvollinen UUID." + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "Tiedosto" + +msgid "Image" +msgstr "Kuva" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s-tietuetta %(field)s-kentällä %(value)r ei ole olemassa." + +msgid "Foreign Key (type determined by related field)" +msgstr "Vierasavain (tyyppi määräytyy liittyvän kentän mukaan)" + +msgid "One-to-one relationship" +msgstr "Yksi-yhteen relaatio" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s -suhde" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s -suhteet" + +msgid "Many-to-many relationship" +msgstr "Moni-moneen relaatio" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Tämä kenttä vaaditaan." + +msgid "Enter a whole number." +msgstr "Syötä kokonaisluku." + +msgid "Enter a valid date." +msgstr "Syötä oikea päivämäärä." + +msgid "Enter a valid time." +msgstr "Syötä oikea kellonaika." + +msgid "Enter a valid date/time." +msgstr "Syötä oikea pvm/kellonaika." + +msgid "Enter a valid duration." +msgstr "Syötä oikea kesto." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Päivien määrä täytyy olla välillä {min_days} ja {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)." + +msgid "No file was submitted." +msgstr "Yhtään tiedostoa ei ole lähetetty." + +msgid "The submitted file is empty." +msgstr "Lähetetty tiedosto on tyhjä." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Varmista, että tämä tiedostonimi on enintään %(max)d merkin pituinen (tällä " +"hetkellä %(length)d)." +msgstr[1] "" +"Varmista, että tämä tiedostonimi on enintään %(max)d merkkiä pitkä (tällä " +"hetkellä %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Voit joko lähettää tai poistaa tiedoston, muttei kumpaakin samalla." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Valitse oikea vaihtoehto. %(value)s ei ole vaihtoehtojen joukossa." + +msgid "Enter a list of values." +msgstr "Syötä lista." + +msgid "Enter a complete value." +msgstr "Syötä kokonainen arvo." + +msgid "Enter a valid UUID." +msgstr "Syötä oikea UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Piilokenttä %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm-tiedot puuttuvat tai niitä on muutettu" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Lähetä enintään %d lomake." +msgstr[1] "Lähetä enintään %d lomaketta." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Lähetä vähintään %d lomake." +msgstr[1] "Lähetä vähintään %d lomaketta." + +msgid "Order" +msgstr "Järjestys" + +msgid "Delete" +msgstr "Poista" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Korjaa kaksoisarvo kentälle %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Ole hyvä ja korjaa uniikin kentän %(field)s kaksoisarvo." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Korjaa allaolevat kaksoisarvot." + +msgid "The inline value did not match the parent instance." +msgstr "Liittyvä arvo ei vastannut vanhempaa instanssia." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Valitse oikea vaihtoehto. Valintasi ei löydy vaihtoehtojen joukosta." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" ei ole kelvollinen arvo." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s -arvoa ei pystytty lukemaan aikavyöhykkeellä " +"%(current_timezone)s; se saattaa olla moniarvoinen tai määrittämätön." + +msgid "Clear" +msgstr "Poista" + +msgid "Currently" +msgstr "Tällä hetkellä" + +msgid "Change" +msgstr "Muokkaa" + +msgid "Unknown" +msgstr "Tuntematon" + +msgid "Yes" +msgstr "Kyllä" + +msgid "No" +msgstr "Ei" + +msgid "yes,no,maybe" +msgstr "kyllä,ei,ehkä" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d tavu" +msgstr[1] "%(size)d tavua" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "ip" + +msgid "a.m." +msgstr "ap" + +msgid "PM" +msgstr "IP" + +msgid "AM" +msgstr "AP" + +msgid "midnight" +msgstr "keskiyö" + +msgid "noon" +msgstr "keskipäivä" + +msgid "Monday" +msgstr "maanantai" + +msgid "Tuesday" +msgstr "tiistai" + +msgid "Wednesday" +msgstr "keskiviikko" + +msgid "Thursday" +msgstr "torstai" + +msgid "Friday" +msgstr "perjantai" + +msgid "Saturday" +msgstr "lauantai" + +msgid "Sunday" +msgstr "sunnuntai" + +msgid "Mon" +msgstr "ma" + +msgid "Tue" +msgstr "ti" + +msgid "Wed" +msgstr "ke" + +msgid "Thu" +msgstr "to" + +msgid "Fri" +msgstr "pe" + +msgid "Sat" +msgstr "la" + +msgid "Sun" +msgstr "su" + +msgid "January" +msgstr "tammikuu" + +msgid "February" +msgstr "helmikuu" + +msgid "March" +msgstr "maaliskuu" + +msgid "April" +msgstr "huhtikuu" + +msgid "May" +msgstr "toukokuu" + +msgid "June" +msgstr "kesäkuu" + +msgid "July" +msgstr "heinäkuu" + +msgid "August" +msgstr "elokuu" + +msgid "September" +msgstr "syyskuu" + +msgid "October" +msgstr "lokakuu" + +msgid "November" +msgstr "marraskuu" + +msgid "December" +msgstr "joulukuu" + +msgid "jan" +msgstr "tam" + +msgid "feb" +msgstr "hel" + +msgid "mar" +msgstr "maa" + +msgid "apr" +msgstr "huh" + +msgid "may" +msgstr "tou" + +msgid "jun" +msgstr "kes" + +msgid "jul" +msgstr "hei" + +msgid "aug" +msgstr "elo" + +msgid "sep" +msgstr "syy" + +msgid "oct" +msgstr "lok" + +msgid "nov" +msgstr "mar" + +msgid "dec" +msgstr "jou" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "tammi" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "helmi" + +msgctxt "abbrev. month" +msgid "March" +msgstr "maalis" + +msgctxt "abbrev. month" +msgid "April" +msgstr "huhti" + +msgctxt "abbrev. month" +msgid "May" +msgstr "touko" + +msgctxt "abbrev. month" +msgid "June" +msgstr "kesä" + +msgctxt "abbrev. month" +msgid "July" +msgstr "heinä" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "elo" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "syys" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "loka" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "marras" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "joulu" + +msgctxt "alt. month" +msgid "January" +msgstr "tammikuuta" + +msgctxt "alt. month" +msgid "February" +msgstr "helmikuuta" + +msgctxt "alt. month" +msgid "March" +msgstr "maaliskuuta" + +msgctxt "alt. month" +msgid "April" +msgstr "huhtikuuta" + +msgctxt "alt. month" +msgid "May" +msgstr "toukokuuta" + +msgctxt "alt. month" +msgid "June" +msgstr "kesäkuuta" + +msgctxt "alt. month" +msgid "July" +msgstr "heinäkuuta" + +msgctxt "alt. month" +msgid "August" +msgstr "elokuuta" + +msgctxt "alt. month" +msgid "September" +msgstr "syyskuuta" + +msgctxt "alt. month" +msgid "October" +msgstr "lokakuuta" + +msgctxt "alt. month" +msgid "November" +msgstr "marraskuuta" + +msgctxt "alt. month" +msgid "December" +msgstr "joulukuuta" + +msgid "This is not a valid IPv6 address." +msgstr "Tämä ei ole kelvollinen IPv6-osoite." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "tai" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d vuosi" +msgstr[1] "%d vuotta" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d kuukausi" +msgstr[1] "%d kuukautta" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d viikko" +msgstr[1] "%d viikkoa" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d päivä" +msgstr[1] "%d päivää" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d tunti" +msgstr[1] "%d tuntia" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuutti" +msgstr[1] "%d minuuttia" + +msgid "0 minutes" +msgstr "0 minuuttia" + +msgid "Forbidden" +msgstr "Kielletty" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF-vahvistus epäonnistui. Pyyntö hylätty." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Näet tämän viestin, koska tämä HTTPS-sivusto vaatii selaintasi lähettämään " +"Referer-otsakkeen, mutta sitä ei vastaanotettu. Otsake vaaditaan " +"turvallisuussyistä, varmistamaan etteivät kolmannet osapuolet ole ottaneet " +"selaintasi haltuun." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Jos olet konfiguroinut selaimesi olemaan lähettämättä Referer-otsaketta, ole " +"hyvä ja kytke otsake takaisin päälle ainakin tälle sivulle, HTTPS-" +"yhteyksille tai saman lähteen (\"same-origin\") pyynnöille." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Jos käytät -tagia tai " +"\"Referrer-Policy: no-referrer\" -otsaketta, ole hyvä ja poista ne. CSRF-" +"suojaus vaatii Referer-otsakkeen tehdäkseen tarkan referer-tarkistuksen. Jos " +"vaadit yksityisyyttä, käytä vaihtoehtoja kuten linkittääksesi kolmannen osapuolen sivuille." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Näet tämän viestin, koska tämä sivusto vaatii CSRF-evästeen " +"vastaanottaessaan lomaketietoja. Eväste vaaditaan turvallisuussyistä, " +"varmistamaan etteivät kolmannet osapuolet ole ottaneet selaintasi haltuun." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Jos olet konfiguroinut selaimesi olemaan vastaanottamatta tai lähettämättä " +"evästeitä, ole hyvä ja kytke evästeet takaisin päälle ainakin tälle sivulle " +"tai saman lähteen (\"same-origin\") pyynnöille." + +msgid "More information is available with DEBUG=True." +msgstr "Lisätietoja `DEBUG=True`-konfiguraatioasetuksella." + +msgid "No year specified" +msgstr "Vuosi puuttuu" + +msgid "Date out of range" +msgstr "Päivämäärä ei alueella" + +msgid "No month specified" +msgstr "Kuukausi puuttuu" + +msgid "No day specified" +msgstr "Päivä puuttuu" + +msgid "No week specified" +msgstr "Viikko puuttuu" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s: yhtään kohdetta ei löydy" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s: tulevia kohteita ei löydy, koska %(class_name)s." +"allow_future:n arvo on False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Päivämäärä '%(datestr)s' ei ole muotoa '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Hakua vastaavaa %(verbose_name)s -kohdetta ei löytynyt" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Sivunumero ei ole 'last' (viimeinen) eikä näytä luvulta." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Epäkelpo sivu (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Lista on tyhjä, ja '%(class_name)s.allow_empty':n arvo on False." + +msgid "Directory indexes are not allowed here." +msgstr "Hakemistolistauksia ei sallita täällä." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ei ole olemassa" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Hakemistolistaus: %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Katso Django %(version)s julkaisutiedot" + +msgid "The install worked successfully! Congratulations!" +msgstr "Asennus toimi! Onneksi olkoon!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Näet tämän viestin, koska asetuksissasi on DEBUG = True etkä ole konfiguroinut yhtään URL-osoitetta." + +msgid "Django Documentation" +msgstr "Django-dokumentaatio" + +msgid "Topics, references, & how-to's" +msgstr "Aiheet, viittaukset & how-tot" + +msgid "Tutorial: A Polling App" +msgstr "Tutoriaali: kyselyapplikaatio" + +msgid "Get started with Django" +msgstr "Miten päästä alkuun Djangolla" + +msgid "Django Community" +msgstr "Django-yhteisö" + +msgid "Connect, get help, or contribute" +msgstr "Verkostoidu, saa apua tai jatkokehitä" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/fi/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/fi/formats.py new file mode 100644 index 0000000..b6afe22 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/fi/formats.py @@ -0,0 +1,39 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j. E Y' +TIME_FORMAT = 'G.i' +DATETIME_FORMAT = r'j. E Y \k\e\l\l\o G.i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j. F' +SHORT_DATE_FORMAT = 'j.n.Y' +SHORT_DATETIME_FORMAT = 'j.n.Y G.i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d.%m.%Y', # '20.3.2014' + '%d.%m.%y', # '20.3.14' +] +DATETIME_INPUT_FORMATS = [ + '%d.%m.%Y %H.%M.%S', # '20.3.2014 14.30.59' + '%d.%m.%Y %H.%M.%S.%f', # '20.3.2014 14.30.59.000200' + '%d.%m.%Y %H.%M', # '20.3.2014 14.30' + '%d.%m.%Y', # '20.3.2014' + + '%d.%m.%y %H.%M.%S', # '20.3.14 14.30.59' + '%d.%m.%y %H.%M.%S.%f', # '20.3.14 14.30.59.000200' + '%d.%m.%y %H.%M', # '20.3.14 14.30' + '%d.%m.%y', # '20.3.14' +] +TIME_INPUT_FORMATS = [ + '%H.%M.%S', # '14.30.59' + '%H.%M.%S.%f', # '14.30.59.000200' + '%H.%M', # '14.30' +] + +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # Non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/fr/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/fr/formats.py new file mode 100644 index 0000000..557c388 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/fr/formats.py @@ -0,0 +1,33 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'j F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'j N Y' +SHORT_DATETIME_FORMAT = 'j N Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' + '%d.%m.%Y', '%d.%m.%y', # Swiss [fr_CH), '25.10.2006', '25.10.06' + # '%d %B %Y', '%d %b %Y', # '25 octobre 2006', '25 oct. 2006' +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' + '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' + '%d/%m/%Y %H:%M', # '25/10/2006 14:30' + '%d/%m/%Y', # '25/10/2006' + '%d.%m.%Y %H:%M:%S', # Swiss [fr_CH), '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # Swiss (fr_CH), '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # Swiss (fr_CH), '25.10.2006 14:30' + '%d.%m.%Y', # Swiss (fr_CH), '25.10.2006' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/fy/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/fy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/gd/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/gd/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/he/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/he/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po new file mode 100644 index 0000000..6a49464 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/hi/LC_MESSAGES/django.po @@ -0,0 +1,1193 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# alkuma , 2013 +# Chandan kumar , 2012 +# Jannis Leidel , 2011 +# Pratik , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "अफ़्रीकांस" + +msgid "Arabic" +msgstr "अरबी" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "आज़रबाइजानी" + +msgid "Bulgarian" +msgstr "बलगारियन" + +msgid "Belarusian" +msgstr "बेलारूसी" + +msgid "Bengali" +msgstr "बंगाली" + +msgid "Breton" +msgstr "ब्रेटन" + +msgid "Bosnian" +msgstr "बोस्नियन" + +msgid "Catalan" +msgstr "कटलान" + +msgid "Czech" +msgstr "च्चेक" + +msgid "Welsh" +msgstr "वेल्श" + +msgid "Danish" +msgstr "दानिश" + +msgid "German" +msgstr "जर्मन" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "ग्रीक" + +msgid "English" +msgstr "अंग्रेज़ी " + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "ब्रिटिश अंग्रेजी" + +msgid "Esperanto" +msgstr "एस्परेन्तो" + +msgid "Spanish" +msgstr "स्पानिश" + +msgid "Argentinian Spanish" +msgstr "अर्जेंटीना स्पैनिश " + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "मेक्सिकन स्पैनिश" + +msgid "Nicaraguan Spanish" +msgstr "निकारागुआ स्पैनिश" + +msgid "Venezuelan Spanish" +msgstr "वेनेज़ुएलाई स्पेनिश" + +msgid "Estonian" +msgstr "एस्टोनियन" + +msgid "Basque" +msgstr "बास्क" + +msgid "Persian" +msgstr "पारसी" + +msgid "Finnish" +msgstr "फ़िन्निश" + +msgid "French" +msgstr "फ्रेंच" + +msgid "Frisian" +msgstr "फ्रिसियन" + +msgid "Irish" +msgstr "आयरिश" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "गलिशियन" + +msgid "Hebrew" +msgstr "हि‍ब्रू" + +msgid "Hindi" +msgstr "हिंदी" + +msgid "Croatian" +msgstr "क्रोयेशियन" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "हंगेरियन" + +msgid "Interlingua" +msgstr "इंतर्लिंगुआ" + +msgid "Indonesian" +msgstr "इन्डोनेशियन " + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "आयिस्लान्डिक" + +msgid "Italian" +msgstr "इटैलियन" + +msgid "Japanese" +msgstr "जपानी" + +msgid "Georgian" +msgstr "ज्योर्जियन" + +msgid "Kazakh" +msgstr "कज़ाख" + +msgid "Khmer" +msgstr "ख्मेर" + +msgid "Kannada" +msgstr "कन्‍नड़" + +msgid "Korean" +msgstr "कोरियन" + +msgid "Luxembourgish" +msgstr "लक्संबर्गी" + +msgid "Lithuanian" +msgstr "लिथुवेनियन" + +msgid "Latvian" +msgstr "लात्वियन" + +msgid "Macedonian" +msgstr "मेसिडोनियन" + +msgid "Malayalam" +msgstr "मलयालम" + +msgid "Mongolian" +msgstr "मंगोलियन" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "बर्मीज़" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "नेपाली" + +msgid "Dutch" +msgstr "डच" + +msgid "Norwegian Nynorsk" +msgstr "नार्वेजियन नायनॉर्स्क" + +msgid "Ossetic" +msgstr "ओस्सेटिक" + +msgid "Punjabi" +msgstr "पंजाबी" + +msgid "Polish" +msgstr "पोलिश" + +msgid "Portuguese" +msgstr "पुर्तगाली" + +msgid "Brazilian Portuguese" +msgstr "ब्रजिलियन पुर्तगाली" + +msgid "Romanian" +msgstr "रोमानियन" + +msgid "Russian" +msgstr "रूसी" + +msgid "Slovak" +msgstr "स्लोवाक" + +msgid "Slovenian" +msgstr "स्लोवेनियन" + +msgid "Albanian" +msgstr "अल्बेनियन्" + +msgid "Serbian" +msgstr "सर्बियन" + +msgid "Serbian Latin" +msgstr "सर्बियाई लैटिन" + +msgid "Swedish" +msgstr "स्वीडिश" + +msgid "Swahili" +msgstr "स्वाहिली" + +msgid "Tamil" +msgstr "तमिल" + +msgid "Telugu" +msgstr "तेलुगु" + +msgid "Thai" +msgstr "थाई" + +msgid "Turkish" +msgstr "तुर्किश" + +msgid "Tatar" +msgstr "तातार" + +msgid "Udmurt" +msgstr "उद्मर्त" + +msgid "Ukrainian" +msgstr "यूक्रानियन" + +msgid "Urdu" +msgstr "उर्दू" + +msgid "Vietnamese" +msgstr "वियतनामी" + +msgid "Simplified Chinese" +msgstr "सरल चीनी" + +msgid "Traditional Chinese" +msgstr "पारम्परिक चीनी" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "एक मान्य मूल्य दर्ज करें" + +msgid "Enter a valid URL." +msgstr "वैध यू.आर.एल भरें ।" + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "वैध डाक पता प्रविष्ट करें।" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "एक वैध 'काउंटर' वर्णों, संख्याओं,रेखांकित चिन्ह ,या हाइफ़न से मिलाकर दर्ज करें ।" + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "वैध आइ.पि वी 4 पता भरें ।" + +msgid "Enter a valid IPv6 address." +msgstr "वैध IPv6 पता दर्ज करें." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "वैध IPv4 या IPv6 पता दर्ज करें." + +msgid "Enter only digits separated by commas." +msgstr "अल्पविराम अंक मात्र ही भरें ।" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"सुनिश्चित करें कि यह मान %(limit_value)s (यह\n" +" %(show_value)s है) है ।" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "सुनिश्चित करें कि यह मान %(limit_value)s से कम या बराबर है ।" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "सुनिश्चित करें यह मान %(limit_value)s से बड़ा या बराबर है ।" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "और" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "यह मूल्य खाली नहीं हो सकता ।" + +msgid "This field cannot be blank." +msgstr "इस फ़ील्ड रिक्त नहीं हो सकता है." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "इस %(field_label)s के साथ एक %(model_name)s पहले से ही उपस्थित है ।" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "फील्ड के प्रकार: %(field_type)s" + +msgid "Integer" +msgstr "पूर्णांक" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "बड़ा (8 बाइट) पूर्णांक " + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "बूलियन (सही अथ‌वा गलत)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "स्ट्रिंग (अधिकतम लम्बाई %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "अल्पविराम सीमांकित संख्या" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "तिथि (बिना समय)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "तिथि (समय के साथ)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "दशमलव संख्या" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "ईमेल पता" + +msgid "File path" +msgstr "संचिका पथ" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "चल बिन्दु संख्या" + +msgid "IPv4 address" +msgstr "IPv4 पता" + +msgid "IP address" +msgstr "आइ.पि पता" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "बूलियन (सही, गलत या कुछ नहीं)" + +msgid "Positive integer" +msgstr "धनात्मक पूर्णांक" + +msgid "Positive small integer" +msgstr "धनात्मक छोटा पूर्णांक" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "स्लग (%(max_length)s तक)" + +msgid "Small integer" +msgstr "छोटा पूर्णांक" + +msgid "Text" +msgstr "पाठ" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "समय" + +msgid "URL" +msgstr "यू.आर.एल" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "फाइल" + +msgid "Image" +msgstr "छवि" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "विदेशी कुंजी (संबंधित क्षेत्र के द्वारा प्रकार निर्धारित)" + +msgid "One-to-one relationship" +msgstr "एक-एक संबंध" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "बहुत से कई संबंध" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "यह क्षेत्र अपेक्षित हैं" + +msgid "Enter a whole number." +msgstr "एक पूर्ण संख्या दर्ज करें ।" + +msgid "Enter a number." +msgstr "एक संख्या दर्ज करें ।" + +msgid "Enter a valid date." +msgstr "वैध तिथि भरें ।" + +msgid "Enter a valid time." +msgstr "वैध समय भरें ।" + +msgid "Enter a valid date/time." +msgstr "वैध तिथि/समय भरें ।" + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "कोई संचिका निवेदित नहीं हुई । कृपया कूटलेखन की जाँच करें ।" + +msgid "No file was submitted." +msgstr "कोई संचिका निवेदित नहीं हुई ।" + +msgid "The submitted file is empty." +msgstr "निवेदित संचिका खाली है ।" + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "कृपया या फ़ाइल प्रस्तुत करे या साफ जांचपेटी की जाँच करे,दोनों नहीं ." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "वैध चित्र निवेदन करें । आप के द्वारा निवेदित संचिका अमान्य अथवा दूषित है ।" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "मान्य इच्छा चयन करें । %(value)s लभ्य इच्छाओं में उप्लब्ध नहीं हैं ।" + +msgid "Enter a list of values." +msgstr "मूल्य सूची दर्ज करें ।" + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "छाटें" + +msgid "Delete" +msgstr "मिटाएँ" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "कृपया %(field)s के लिए डुप्लिकेट डेटा को सही करे." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "कृपया %(field)s के डुप्लिकेट डेटा जो अद्वितीय होना चाहिए को सही करें." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"कृपया %(field_name)s के लिए डुप्लिकेट डेटा को सही करे जो %(date_field)s में " +"%(lookup)s के लिए अद्वितीय होना चाहिए." + +msgid "Please correct the duplicate values below." +msgstr "कृपया डुप्लिकेट मानों को सही करें." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "मान्य विकल्प चयन करें । यह विकल्प उपस्थित विकल्पों में नहीं है ।" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(current_timezone)s समय क्षेत्र में %(datetime)s का व्याख्या नहीं कर सकता है, यह " +"अस्पष्ट हो सकता है या नहीं मौजूद हो सकते हैं." + +msgid "Clear" +msgstr "रिक्त करें" + +msgid "Currently" +msgstr "फिलहाल" + +msgid "Change" +msgstr "बदलें" + +msgid "Unknown" +msgstr "अनजान" + +msgid "Yes" +msgstr "हाँ" + +msgid "No" +msgstr "नहीं" + +msgid "yes,no,maybe" +msgstr "हाँ, नहीं, शायद" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d बाइट" +msgstr[1] "%(size)d बाइट" + +#, python-format +msgid "%s KB" +msgstr "%s केबी " + +#, python-format +msgid "%s MB" +msgstr "%s मेबी " + +#, python-format +msgid "%s GB" +msgstr "%s जीबी " + +#, python-format +msgid "%s TB" +msgstr "%s टीबी" + +#, python-format +msgid "%s PB" +msgstr "%s पीबी" + +msgid "p.m." +msgstr "बजे" + +msgid "a.m." +msgstr "बजे" + +msgid "PM" +msgstr "बजे" + +msgid "AM" +msgstr "बजे" + +msgid "midnight" +msgstr "मध्यरात्री" + +msgid "noon" +msgstr "दोपहर" + +msgid "Monday" +msgstr "सोम‌वार" + +msgid "Tuesday" +msgstr "मंगलवार" + +msgid "Wednesday" +msgstr "बुधवार" + +msgid "Thursday" +msgstr "गुरूवार" + +msgid "Friday" +msgstr "शुक्रवार" + +msgid "Saturday" +msgstr "शनिवार" + +msgid "Sunday" +msgstr "रविवार" + +msgid "Mon" +msgstr "सोम" + +msgid "Tue" +msgstr "मंगल" + +msgid "Wed" +msgstr "बुध" + +msgid "Thu" +msgstr "गुरू" + +msgid "Fri" +msgstr "शुक्र" + +msgid "Sat" +msgstr "शनि" + +msgid "Sun" +msgstr "रवि" + +msgid "January" +msgstr "जनवरी" + +msgid "February" +msgstr "फ़रवरी" + +msgid "March" +msgstr "मार्च" + +msgid "April" +msgstr "अप्रैल" + +msgid "May" +msgstr "मई" + +msgid "June" +msgstr "जून" + +msgid "July" +msgstr "जुलाई" + +msgid "August" +msgstr "अगस्त" + +msgid "September" +msgstr "सितमबर" + +msgid "October" +msgstr "अक्टूबर" + +msgid "November" +msgstr "नवमबर" + +msgid "December" +msgstr "दिसमबर" + +msgid "jan" +msgstr "जन" + +msgid "feb" +msgstr "फ़र" + +msgid "mar" +msgstr "मा" + +msgid "apr" +msgstr "अप्र" + +msgid "may" +msgstr "मई" + +msgid "jun" +msgstr "जून" + +msgid "jul" +msgstr "जुल" + +msgid "aug" +msgstr "अग" + +msgid "sep" +msgstr "सित" + +msgid "oct" +msgstr "अक्ट" + +msgid "nov" +msgstr "नव" + +msgid "dec" +msgstr "दिस्" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "जनवरी." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "फ़रवरी." + +msgctxt "abbrev. month" +msgid "March" +msgstr "मार्च" + +msgctxt "abbrev. month" +msgid "April" +msgstr "अप्रैल" + +msgctxt "abbrev. month" +msgid "May" +msgstr "मई" + +msgctxt "abbrev. month" +msgid "June" +msgstr "जून" + +msgctxt "abbrev. month" +msgid "July" +msgstr "जुलाई" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "अग." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "सितम्बर." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "अक्टूबर" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "नवम्बर." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "दिसम्बर" + +msgctxt "alt. month" +msgid "January" +msgstr "जनवरी" + +msgctxt "alt. month" +msgid "February" +msgstr "फरवरी" + +msgctxt "alt. month" +msgid "March" +msgstr "मार्च" + +msgctxt "alt. month" +msgid "April" +msgstr "अप्रैल" + +msgctxt "alt. month" +msgid "May" +msgstr "मई" + +msgctxt "alt. month" +msgid "June" +msgstr "जून" + +msgctxt "alt. month" +msgid "July" +msgstr "जुलाई" + +msgctxt "alt. month" +msgid "August" +msgstr "अगस्त" + +msgctxt "alt. month" +msgid "September" +msgstr "सितंबर" + +msgctxt "alt. month" +msgid "October" +msgstr "अक्टूबर" + +msgctxt "alt. month" +msgid "November" +msgstr "नवंबर" + +msgctxt "alt. month" +msgid "December" +msgstr "दिसंबर" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "अथवा" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "कोई साल निर्दिष्ट नहीं किया गया " + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "कोई महीने निर्दिष्ट नहीं किया गया " + +msgid "No day specified" +msgstr "कोई दिन निर्दिष्ट नहीं किया गया " + +msgid "No week specified" +msgstr "कोई सप्ताह निर्दिष्ट नहीं किया गया " + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s उपलब्ध नहीं है" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"भविष्य %(verbose_name_plural)s उपलब्ध नहीं है क्योंकि %(class_name)s.allow_future " +"गलत है." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "तिथि स्ट्रिंग '%(datestr)s' दिया गया प्रारूप '%(format)s' अवैध है " + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr " इस प्रश्न %(verbose_name)s से मेल नहीं खाते है" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "पृष्ठ 'अंतिम' नहीं है और न ही यह एक पूर्णांक के लिए परिवर्तित किया जा सकता है." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "अवैध पन्ना (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "रिक्त सूची और '%(class_name)s.allow_empty' गलत है." + +msgid "Directory indexes are not allowed here." +msgstr "निर्देशिका अनुक्रमित की अनुमति यहाँ नहीं है." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" मौजूद नहीं है" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s का अनुक्रमणिका" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/hi/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/hi/formats.py new file mode 100644 index 0000000..923967a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/hi/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F Y' +TIME_FORMAT = 'g:i A' +# DATETIME_FORMAT = +# YEAR_MONTH_FORMAT = +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'd-m-Y' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = '.' +THOUSAND_SEPARATOR = ',' +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..084ef35 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,1277 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# aljosa , 2011,2013 +# berislavlopac , 2013 +# Bojan Mihelač , 2012 +# Boni Đukić , 2017 +# Jannis Leidel , 2011 +# Mislav Cimperšak , 2015-2016 +# Nino , 2013 +# senko , 2012 +# Ylodi , 2011 +# zmasek , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Croatian (http://www.transifex.com/django/django/language/" +"hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arapski" + +msgid "Asturian" +msgstr "Asturijski" + +msgid "Azerbaijani" +msgstr "Azarbejdžanac" + +msgid "Bulgarian" +msgstr "Unesite ispravnu IPv4 adresu." + +msgid "Belarusian" +msgstr "Bjeloruski" + +msgid "Bengali" +msgstr "Bengalski" + +msgid "Breton" +msgstr "Bretonski" + +msgid "Bosnian" +msgstr "Bošnjački" + +msgid "Catalan" +msgstr "Katalanski" + +msgid "Czech" +msgstr "Češki" + +msgid "Welsh" +msgstr "Velški" + +msgid "Danish" +msgstr "Danski" + +msgid "German" +msgstr "Njemački" + +msgid "Lower Sorbian" +msgstr "Donjolužičkosrpski" + +msgid "Greek" +msgstr "Grčki" + +msgid "English" +msgstr "Engleski" + +msgid "Australian English" +msgstr "Australski engleski" + +msgid "British English" +msgstr "Britanski engleski" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Španjolski" + +msgid "Argentinian Spanish" +msgstr "Argentinski španjolski" + +msgid "Colombian Spanish" +msgstr "Kolumbijski španjolski" + +msgid "Mexican Spanish" +msgstr "Meksički španjolski" + +msgid "Nicaraguan Spanish" +msgstr "Nikaragvanski Španjolski" + +msgid "Venezuelan Spanish" +msgstr "Venezuelanski Španjolski" + +msgid "Estonian" +msgstr "Estonski" + +msgid "Basque" +msgstr "Baskijski" + +msgid "Persian" +msgstr "Perzijski" + +msgid "Finnish" +msgstr "Finski" + +msgid "French" +msgstr "Francuski" + +msgid "Frisian" +msgstr "Frizijski" + +msgid "Irish" +msgstr "Irski" + +msgid "Scottish Gaelic" +msgstr "Škotski gaelski" + +msgid "Galician" +msgstr "Galičanski" + +msgid "Hebrew" +msgstr "Hebrejski" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Hrvatski" + +msgid "Upper Sorbian" +msgstr "Gornjolužičkosrpski" + +msgid "Hungarian" +msgstr "Mađarski" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonezijski" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandski" + +msgid "Italian" +msgstr "Talijanski" + +msgid "Japanese" +msgstr "Japanski" + +msgid "Georgian" +msgstr "Gruzijski" + +msgid "Kazakh" +msgstr "Kazaški" + +msgid "Khmer" +msgstr "Kambođanski" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreanski" + +msgid "Luxembourgish" +msgstr "Luksemburški" + +msgid "Lithuanian" +msgstr "Litvanski" + +msgid "Latvian" +msgstr "Latvijski" + +msgid "Macedonian" +msgstr "Makedonski" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Mongolski" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Burmese" +msgstr "Burmanski" + +msgid "Norwegian Bokmål" +msgstr "Bokmål" + +msgid "Nepali" +msgstr "Nepalski" + +msgid "Dutch" +msgstr "Nizozemski" + +msgid "Norwegian Nynorsk" +msgstr "Norveški Nynorsk" + +msgid "Ossetic" +msgstr "Osetski" + +msgid "Punjabi" +msgstr "Pendžabljanin" + +msgid "Polish" +msgstr "Poljski" + +msgid "Portuguese" +msgstr "Portugalski" + +msgid "Brazilian Portuguese" +msgstr "Brazilski portugalski" + +msgid "Romanian" +msgstr "Rumunjski" + +msgid "Russian" +msgstr "Ruski" + +msgid "Slovak" +msgstr "Slovački" + +msgid "Slovenian" +msgstr "Slovenski" + +msgid "Albanian" +msgstr "Albanski" + +msgid "Serbian" +msgstr "Srpski" + +msgid "Serbian Latin" +msgstr "Latinski srpski" + +msgid "Swedish" +msgstr "Švedski" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamilski" + +msgid "Telugu" +msgstr "Teluški" + +msgid "Thai" +msgstr "Thai (tajlandski)" + +msgid "Turkish" +msgstr "Turski" + +msgid "Tatar" +msgstr "Tatarski" + +msgid "Udmurt" +msgstr "Udmurtski" + +msgid "Ukrainian" +msgstr "Ukrajinski" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vijetnamski" + +msgid "Simplified Chinese" +msgstr "Pojednostavljeni kineski" + +msgid "Traditional Chinese" +msgstr "Tradicionalni kineski" + +msgid "Messages" +msgstr "Poruke" + +msgid "Site Maps" +msgstr "Mape stranica" + +msgid "Static Files" +msgstr "Statične datoteke" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "Broj stranice nije cijeli broj" + +msgid "That page number is less than 1" +msgstr "Broj stranice je manji od 1" + +msgid "That page contains no results" +msgstr "Stranica ne sadrži rezultate" + +msgid "Enter a valid value." +msgstr "Unesite ispravnu vrijednost." + +msgid "Enter a valid URL." +msgstr "Unesite ispravan URL." + +msgid "Enter a valid integer." +msgstr "Unesite vrijednost u obliku cijelog broja." + +msgid "Enter a valid email address." +msgstr "Unesite ispravnu e-mail adresu." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Unesite ispravan 'slug' koji se sastoji samo od slova, brojeva, povlaka ili " +"crtica." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Unesite ispravan 'slug' koji se sastoji samo od Unicode slova, brojeva, " +"povlaka ili crtica." + +msgid "Enter a valid IPv4 address." +msgstr "Unesite ispravnu IPv4 adresu." + +msgid "Enter a valid IPv6 address." +msgstr "Unesite ispravnu IPv6 adresu." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Unesite ispravnu IPv4 ili IPv6 adresu." + +msgid "Enter only digits separated by commas." +msgstr "Unesite samo brojeve razdvojene zarezom." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Osigurajte da ova vrijednost ima %(limit_value)s (trenutno je " +"%(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Osigurajte da je ova vrijednost manja ili jednaka %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Osigurajte da je ova vrijednost veća ili jednaka %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znak (trenutno ima " +"%(show_value)d)." +msgstr[1] "" +"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " +"ima %(show_value)d)." +msgstr[2] "" +"Osigurajte da ova vrijednost ima najmanje %(limit_value)d znakova (trenutno " +"ima %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Osigurajte da ova vrijednost ima najviše %(limit_value)d znak (trenutno ima " +"%(show_value)d)." +msgstr[1] "" +"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " +"ima %(show_value)d)." +msgstr[2] "" +"Osigurajte da ova vrijednost ima najviše %(limit_value)d znakova (trenutno " +"ima %(show_value)d)." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Osigurajte da nema više od ukupno %(max)s numeričkog znaka." +msgstr[1] "Osigurajte da nema više od ukupno %(max)s numerička znaka." +msgstr[2] "Osigurajte da nema više od ukupno %(max)s numeričkih znakova." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Osigurajte da nema više od ukupno %(max)s decimalnog mjesta." +msgstr[1] "Osigurajte da nema više od ukupno %(max)s decimalna mjesta." +msgstr[2] "Osigurajte da nema više od ukupno %(max)s decimalnih mjesta." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Osigurajte da nema više od ukupno %(max)s numberičkog znaka prije decimalne " +"točke." +msgstr[1] "" +"Osigurajte da nema više od ukupno %(max)s numberička znaka prije decimalne " +"točke." +msgstr[2] "" +"Osigurajte da nema više od ukupno %(max)s numberičkih znakova prije " +"decimalne točke." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Ekstenzija datoteke '%(extension)s' nije dopuštena. Dopuštene ekstenzije su: " +"'%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "i" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s sa navedenim %(field_labels)s već postoji." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Vrijednost %(value)r nije jedna od raspoloživih opcija." + +msgid "This field cannot be null." +msgstr "Ovo polje ne može biti null." + +msgid "This field cannot be blank." +msgstr "Ovo polje ne može biti prazno." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s sa navedenim %(field_label)s već postoji." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s mora biti jedinstven pojam za %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Polje tipa: %(field_type)s" + +msgid "Integer" +msgstr "Cijeli broj" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' vrijednost mora biti cijeli broj." + +msgid "Big (8 byte) integer" +msgstr "Big (8 byte) integer" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' vrijednost treba biti ili \"True\" ili \"False\"." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (True ili False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Slova (do %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Cijeli brojevi odvojeni zarezom" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' vrijednost je neispravno formatiran datum. Treba biti u YYYY-MM-" +"DD formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' vrijednost ima ispravan format (YYYY-MM-DD) ali je nevaljan " +"datum." + +msgid "Date (without time)" +msgstr "Datum (bez vremena/sati)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' vrijednost je neispravnog formata. Vrijednost mora biti u YYYY-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ] formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' vrijednost je u točnom formatu (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), ali je datum/vrijeme neispravno." + +msgid "Date (with time)" +msgstr "Datum (sa vremenom/satima)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' vrijednost mora biti decimalni broj." + +msgid "Decimal number" +msgstr "Decimalni broj" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' vrijednost je neispravno formatirana. Treba biti u [DD] [HH:" +"[MM:]]ss[.uuuuuu] formatu." + +msgid "Duration" +msgstr "Trajanje" + +msgid "Email address" +msgstr "E-mail adresa" + +msgid "File path" +msgstr "Put do datoteke" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' vrijednost mora biti broj s pomičnim zarezom." + +msgid "Floating point number" +msgstr "Broj s pomičnim zarezom (floating point number)" + +msgid "IPv4 address" +msgstr "IPv4 adresa" + +msgid "IP address" +msgstr "IP adresa" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' vrijednost mora biti \"None\", \"True\" ili \"False\"." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (True, False ili None)" + +msgid "Positive integer" +msgstr "Pozitivan cijeli broj" + +msgid "Positive small integer" +msgstr "Pozitivan mali cijeli broj" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "'Slug' (do %(max_length)s)" + +msgid "Small integer" +msgstr "Mali broj" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' vrijednost je neispravnog formata. Vrijednost mora biti u HH:MM[:" +"ss[.uuuuuu]] formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' vrijednost je u točnom formatu (HH:MM[:ss[.uuuuuu]]), ali je " +"datum/vrijeme neispravno." + +msgid "Time" +msgstr "Vrijeme" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Binarni podaci" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' nije ispravan UUID." + +msgid "File" +msgstr "Datoteka" + +msgid "Image" +msgstr "Slika" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s instanca sa %(field)s %(value)r ne postoji." + +msgid "Foreign Key (type determined by related field)" +msgstr "Foreign Key (type determined by related field)" + +msgid "One-to-one relationship" +msgstr "One-to-one relationship" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s veza" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s veze" + +msgid "Many-to-many relationship" +msgstr "Many-to-many relationship" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Unos za ovo polje je obavezan." + +msgid "Enter a whole number." +msgstr "Unesite cijeli broj." + +msgid "Enter a number." +msgstr "Unesite broj." + +msgid "Enter a valid date." +msgstr "Unesite ispravan datum." + +msgid "Enter a valid time." +msgstr "Unesite ispravno vrijeme." + +msgid "Enter a valid date/time." +msgstr "Unesite ispravan datum/vrijeme." + +msgid "Enter a valid duration." +msgstr "Unesite ispravno trajanje." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Datoteka nije poslana. Provjerite 'encoding type' forme." + +msgid "No file was submitted." +msgstr "Datoteka nije poslana." + +msgid "The submitted file is empty." +msgstr "Poslana datoteka je prazna." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Osigurajte da naziv datoteke ima najviše %(max)d znak (ima %(length)d)." +msgstr[1] "" +"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." +msgstr[2] "" +"Osigurajte da naziv datoteke ima najviše %(max)d znakova (ima %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Molimo Vas da pošaljete ili datoteku ili označite izbor, a ne oboje." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Upload-ajte ispravnu sliku. Datoteka koju ste upload-ali ili nije slika ili " +"je oštečena." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Odaberite iz ponuđenog. %(value)s nije ponuđen kao opcija." + +msgid "Enter a list of values." +msgstr "Unesite listu vrijednosti." + +msgid "Enter a complete value." +msgstr "Unesite kompletnu vrijednost." + +msgid "Enter a valid UUID." +msgstr "Unesite ispravan UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Skriveno polje %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm podaci nedostaju ili su promijenjeni" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Molimo unesite %d obrazac." +msgstr[1] "Molimo unesite %d ili manje obrazaca." +msgstr[2] "Molimo unesite %d ili manje obrazaca." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Molimo unesite %d ili više obrazaca." +msgstr[1] "Molimo unesite %d ili više obrazaca." +msgstr[2] "Molimo unesite %d ili više obrazaca." + +msgid "Order" +msgstr "Redoslijed:" + +msgid "Delete" +msgstr "Izbriši" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Ispravite duplicirane podatke za %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Molimo ispravite duplicirane podatke za %(field)s, koji moraju biti " +"jedinstveni." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Molimo ispravite duplicirane podatke za %(field_name)s koji moraju biti " +"jedinstveni za %(lookup)s u %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Molimo ispravite duplicirane vrijednosti ispod." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Izaberite ispravnu opciju. Ta opcija nije jedna od dostupnih opcija." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s ne može biti interpretirano u vremenskoj zoni " +"%(current_timezone)s; možda je dvosmisleno ili ne postoji." + +msgid "Clear" +msgstr "Isprazni" + +msgid "Currently" +msgstr "Trenutno" + +msgid "Change" +msgstr "Promijeni" + +msgid "Unknown" +msgstr "Nepoznat pojam" + +msgid "Yes" +msgstr "Da" + +msgid "No" +msgstr "Ne" + +msgid "yes,no,maybe" +msgstr "da,ne,možda" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d byte-a" +msgstr[2] "%(size)d byte-a" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "popodne" + +msgid "a.m." +msgstr "ujutro" + +msgid "PM" +msgstr "popodne" + +msgid "AM" +msgstr "ujutro" + +msgid "midnight" +msgstr "ponoć" + +msgid "noon" +msgstr "podne" + +msgid "Monday" +msgstr "Ponedjeljak" + +msgid "Tuesday" +msgstr "Utorak" + +msgid "Wednesday" +msgstr "Srijeda" + +msgid "Thursday" +msgstr "Četvrtak" + +msgid "Friday" +msgstr "Petak" + +msgid "Saturday" +msgstr "Subota" + +msgid "Sunday" +msgstr "Nedjelja" + +msgid "Mon" +msgstr "Pon" + +msgid "Tue" +msgstr "Uto" + +msgid "Wed" +msgstr "Sri" + +msgid "Thu" +msgstr "Čet" + +msgid "Fri" +msgstr "Pet" + +msgid "Sat" +msgstr "Sub" + +msgid "Sun" +msgstr "Ned" + +msgid "January" +msgstr "Siječanj" + +msgid "February" +msgstr "Veljača" + +msgid "March" +msgstr "Ožujak" + +msgid "April" +msgstr "Travanj" + +msgid "May" +msgstr "Svibanj" + +msgid "June" +msgstr "Lipanj" + +msgid "July" +msgstr "Srpanj" + +msgid "August" +msgstr "Kolovoz" + +msgid "September" +msgstr "Rujan" + +msgid "October" +msgstr "Listopad" + +msgid "November" +msgstr "Studeni" + +msgid "December" +msgstr "Prosinac" + +msgid "jan" +msgstr "sij." + +msgid "feb" +msgstr "velj." + +msgid "mar" +msgstr "ožu." + +msgid "apr" +msgstr "tra." + +msgid "may" +msgstr "svi." + +msgid "jun" +msgstr "lip." + +msgid "jul" +msgstr "srp." + +msgid "aug" +msgstr "kol." + +msgid "sep" +msgstr "ruj." + +msgid "oct" +msgstr "lis." + +msgid "nov" +msgstr "stu." + +msgid "dec" +msgstr "pro." + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Sij." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Velj." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Ožu." + +msgctxt "abbrev. month" +msgid "April" +msgstr "Tra." + +msgctxt "abbrev. month" +msgid "May" +msgstr "Svi." + +msgctxt "abbrev. month" +msgid "June" +msgstr "Lip." + +msgctxt "abbrev. month" +msgid "July" +msgstr "Srp." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Kol." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Ruj." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Lis." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Stu." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Pro." + +msgctxt "alt. month" +msgid "January" +msgstr "siječnja" + +msgctxt "alt. month" +msgid "February" +msgstr "veljače" + +msgctxt "alt. month" +msgid "March" +msgstr "ožujka" + +msgctxt "alt. month" +msgid "April" +msgstr "travnja" + +msgctxt "alt. month" +msgid "May" +msgstr "svibnja" + +msgctxt "alt. month" +msgid "June" +msgstr "lipnja" + +msgctxt "alt. month" +msgid "July" +msgstr "srpnja" + +msgctxt "alt. month" +msgid "August" +msgstr "kolovoza" + +msgctxt "alt. month" +msgid "September" +msgstr "rujna" + +msgctxt "alt. month" +msgid "October" +msgstr "listopada" + +msgctxt "alt. month" +msgid "November" +msgstr "studenoga" + +msgctxt "alt. month" +msgid "December" +msgstr "prosinca" + +msgid "This is not a valid IPv6 address." +msgstr "To nije ispravna IPv6 adresa." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "ili" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d godina" +msgstr[1] "%d godina" +msgstr[2] "%d godina" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mjesec" +msgstr[1] "%d mjeseci" +msgstr[2] "%d mjeseci" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d tjedan" +msgstr[1] "%d tjedna" +msgstr[2] "%d tjedana" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dana" +msgstr[1] "%d dana" +msgstr[2] "%d dana" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d sat" +msgstr[1] "%d sati" +msgstr[2] "%d sati" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutu" +msgstr[1] "%d minute" +msgstr[2] "%d minuta" + +msgid "0 minutes" +msgstr "0 minuta" + +msgid "Forbidden" +msgstr "Zabranjeno" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF verifikacija nije uspjela. Zahtjev je prekinut." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Ova poruka je prikazana jer ova HTTPS stranica zahtijeva da 'zaglavlje " +"preporučitelja' bude poslano od strane internetskog preglednika, ali ono " +"nije poslano. Ovo zaglavlje je potrebno iz sigurnosnih razloga, kako bi se " +"osiguralo da vaš internetski preglednik ne bude otet od strane trećih osoba." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Ako ste konfigurirali svoj internetski preglednik da onemogući 'zaglavlje " +"preporučitelja', molimo da ga ponovno omogućite barem za ovu stranicu, na " +"svim HTTPS vezama, ili za zahtjeve 'istog podrijetla'." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Ova poruka vam se prikazuje jer stranica na kojoj se nalazite zahtjeva CSRF " +"kolačić prilikom slanja forme. Navedeni kolačić je obavezan iz sigurnosnih " +"razloga, kako bi se osiguralo da vaš internetski preglednik ne bude otet od " +"strane trećih osoba." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Ako ste konfigurirali svoj internetski preglednik da onemogući kolačiće, " +"molimo da ih ponovno omogućite barem za ovu stranicu ili za zahtjeve 'istog " +"podrijetla'." + +msgid "More information is available with DEBUG=True." +msgstr "Dodatne informacije su dostupne sa postavkom DEBUG=True." + +msgid "No year specified" +msgstr "Nije navedena godina" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Nije naveden mjesec" + +msgid "No day specified" +msgstr "Nije naveden dan" + +msgid "No week specified" +msgstr "Tjedan nije određen" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Nije dostupno: %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s nije dostupno jer je %(class_name)s.allow_future " +"False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Neispravan datum '%(datestr)s' za format '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "%(verbose_name)s - pretragom nisu pronađeni rezultati za upit" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Stranica nije 'zadnja', niti se može pretvoriti u cijeli broj." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Nevažeća stranica (%(page_number)s):%(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Prazna lista i '%(class_name)s.allow_empty' je False." + +msgid "Directory indexes are not allowed here." +msgstr "Sadržaji direktorija ovdje nisu dozvoljeni." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ne postoji" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Sadržaj direktorija %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6c80bb5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/hu/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/hu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..10f0b35 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,1245 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2012,2014,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "afrikaans" + +msgid "Arabic" +msgstr "arabe" + +msgid "Asturian" +msgstr "asturiano" + +msgid "Azerbaijani" +msgstr "azeri" + +msgid "Bulgarian" +msgstr "bulgaro" + +msgid "Belarusian" +msgstr "bielorusso" + +msgid "Bengali" +msgstr "bengali" + +msgid "Breton" +msgstr "breton" + +msgid "Bosnian" +msgstr "bosniaco" + +msgid "Catalan" +msgstr "catalano" + +msgid "Czech" +msgstr "tcheco" + +msgid "Welsh" +msgstr "gallese" + +msgid "Danish" +msgstr "danese" + +msgid "German" +msgstr "germano" + +msgid "Lower Sorbian" +msgstr "sorabo inferior" + +msgid "Greek" +msgstr "greco" + +msgid "English" +msgstr "anglese" + +msgid "Australian English" +msgstr "anglese australian" + +msgid "British English" +msgstr "anglese britannic" + +msgid "Esperanto" +msgstr "esperanto" + +msgid "Spanish" +msgstr "espaniol" + +msgid "Argentinian Spanish" +msgstr "espaniol argentin" + +msgid "Colombian Spanish" +msgstr "espaniol colombian" + +msgid "Mexican Spanish" +msgstr "espaniol mexican" + +msgid "Nicaraguan Spanish" +msgstr "espaniol nicaraguan" + +msgid "Venezuelan Spanish" +msgstr "espaniol venzuelan" + +msgid "Estonian" +msgstr "estoniano" + +msgid "Basque" +msgstr "basco" + +msgid "Persian" +msgstr "persiano" + +msgid "Finnish" +msgstr "finnese" + +msgid "French" +msgstr "francese" + +msgid "Frisian" +msgstr "frison" + +msgid "Irish" +msgstr "irlandese" + +msgid "Scottish Gaelic" +msgstr "gaelico scotese" + +msgid "Galician" +msgstr "galiciano" + +msgid "Hebrew" +msgstr "hebreo" + +msgid "Hindi" +msgstr "hindi" + +msgid "Croatian" +msgstr "croato" + +msgid "Upper Sorbian" +msgstr "sorabo superior" + +msgid "Hungarian" +msgstr "hungaro" + +msgid "Interlingua" +msgstr "interlingua" + +msgid "Indonesian" +msgstr "indonesiano" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islandese" + +msgid "Italian" +msgstr "italiano" + +msgid "Japanese" +msgstr "japonese" + +msgid "Georgian" +msgstr "georgiano" + +msgid "Kazakh" +msgstr "kazakh" + +msgid "Khmer" +msgstr "khmer" + +msgid "Kannada" +msgstr "kannada" + +msgid "Korean" +msgstr "coreano" + +msgid "Luxembourgish" +msgstr "luxemburgese" + +msgid "Lithuanian" +msgstr "lituano" + +msgid "Latvian" +msgstr "letton" + +msgid "Macedonian" +msgstr "macedone" + +msgid "Malayalam" +msgstr "malayalam" + +msgid "Mongolian" +msgstr "mongolico" + +msgid "Marathi" +msgstr "marathi" + +msgid "Burmese" +msgstr "burmese" + +msgid "Norwegian Bokmål" +msgstr "norvegianio bokmål" + +msgid "Nepali" +msgstr "nepali" + +msgid "Dutch" +msgstr "hollandese" + +msgid "Norwegian Nynorsk" +msgstr "norvegiano, nynorsk" + +msgid "Ossetic" +msgstr "ossetico" + +msgid "Punjabi" +msgstr "punjabi" + +msgid "Polish" +msgstr "polonese" + +msgid "Portuguese" +msgstr "portugese" + +msgid "Brazilian Portuguese" +msgstr "portugese brasilian" + +msgid "Romanian" +msgstr "romaniano" + +msgid "Russian" +msgstr "russo" + +msgid "Slovak" +msgstr "slovaco" + +msgid "Slovenian" +msgstr "sloveno" + +msgid "Albanian" +msgstr "albanese" + +msgid "Serbian" +msgstr "serbo" + +msgid "Serbian Latin" +msgstr "serbo latin" + +msgid "Swedish" +msgstr "svedese" + +msgid "Swahili" +msgstr "swahili" + +msgid "Tamil" +msgstr "tamil" + +msgid "Telugu" +msgstr "telugu" + +msgid "Thai" +msgstr "thailandese" + +msgid "Turkish" +msgstr "turco" + +msgid "Tatar" +msgstr "tartaro" + +msgid "Udmurt" +msgstr "udmurto" + +msgid "Ukrainian" +msgstr "ukrainiano" + +msgid "Urdu" +msgstr "urdu" + +msgid "Vietnamese" +msgstr "vietnamese" + +msgid "Simplified Chinese" +msgstr "chinese simplificate" + +msgid "Traditional Chinese" +msgstr "chinese traditional" + +msgid "Messages" +msgstr "Messages" + +msgid "Site Maps" +msgstr "Mappas de sito" + +msgid "Static Files" +msgstr "Files static" + +msgid "Syndication" +msgstr "Syndication" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Specifica un valor valide." + +msgid "Enter a valid URL." +msgstr "Specifica un URL valide." + +msgid "Enter a valid integer." +msgstr "Specifica un numero integre valide." + +msgid "Enter a valid email address." +msgstr "Specifica un adresse de e-mail valide." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Specifica un denotation valide, consistente de litteras, numeros, tractos de " +"sublineamento o tractos de union." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Specifica un 'slug' valide, consistente de litteras, numeros, tractos de " +"sublineamento o tractos de union in Unicode." + +msgid "Enter a valid IPv4 address." +msgstr "Specifica un adresse IPv4 valide." + +msgid "Enter a valid IPv6 address." +msgstr "Specifica un adresse IPv6 valide." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Specifica un adresse IPv4 o IPv6 valide." + +msgid "Enter only digits separated by commas." +msgstr "Scribe solmente digitos separate per commas." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Assecura te que iste valor es %(limit_value)s (illo es %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Assecura te que iste valor es inferior o equal a %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Assecura te que iste valor es superior o equal a %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Assecura te que iste valor ha al minus %(limit_value)d character (illo ha " +"%(show_value)d)." +msgstr[1] "" +"Assecura te que iste valor ha al minus %(limit_value)d characteres (illo ha " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Assecura te que iste valor ha al plus %(limit_value)d character (illo ha " +"%(show_value)d)." +msgstr[1] "" +"Assecura te que iste valor ha al plus %(limit_value)d characteres (illo ha " +"%(show_value)d)." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Assecura te que il non ha plus de %(max)s digito in total." +msgstr[1] "Assecura te que il non ha plus de %(max)s digitos in total." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +"Assecura te que il non ha plus de %(max)s cifra post le comma decimal." +msgstr[1] "" +"Assecura te que il non ha plus de %(max)s cifras post le comma decimal." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Assecura te que il non ha plus de %(max)s cifra ante le comma decimal." +msgstr[1] "" +"Assecura te que il non ha plus de %(max)s cifras ante le comma decimal." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "e" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Jam existe %(model_name)s con iste %(field_labels)s." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Le valor %(value)r non es un option valide." + +msgid "This field cannot be null." +msgstr "Iste campo non pote esser nulle." + +msgid "This field cannot be blank." +msgstr "Iste campo non pote esser vacue." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s con iste %(field_label)s jam existe." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s debe esser unic pro %(lookup_type)s de %(date_field_label)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Campo de typo: %(field_type)s" + +msgid "Integer" +msgstr "Numero integre" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Le valor '%(value)s' debe esser un numero integre." + +msgid "Big (8 byte) integer" +msgstr "Numero integre grande (8 bytes)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Le valor '%(value)s'' debe esser o True/Ver o False." + +msgid "Boolean (Either True or False)" +msgstr "Booleano (ver o false)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Catena (longitude maxime: %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Numeros integre separate per commas" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Le valor '%(value)s' ha un formato de data invalide. Debe esser in formato " +"AAAA-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Le valor '%(value)s' ha le formato correcte (AAAA-MM-DD) ma es un data " +"invalide." + +msgid "Date (without time)" +msgstr "Data (sin hora)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Le valor '%(value)s' es in un formato invalide. Debe esser in formato AAAA-" +"MM-DD HH:MM[:ss[.uuuuuu]][FH]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Le valor '%(value)s' es in le formato correcte (YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][FH]) ma es un data/hora invalide." + +msgid "Date (with time)" +msgstr "Data (con hora)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Le valor '%(value)s' debe esser un numero decimal." + +msgid "Decimal number" +msgstr "Numero decimal" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"Le valor '%(value)s' es in un formato invalide. Debe esser in formato [DD] " +"[HH:[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Duration" + +msgid "Email address" +msgstr "Adresse de e-mail" + +msgid "File path" +msgstr "Cammino de file" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "Le valor '%(value)s' debe esser un numero a comma flottante." + +msgid "Floating point number" +msgstr "Numero a comma flottante" + +msgid "IPv4 address" +msgstr "Adresse IPv4" + +msgid "IP address" +msgstr "Adresse IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Le valor '%(value)s'' debe esser None/Nulle, True/Ver o False." + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (ver, false o nulle)" + +msgid "Positive integer" +msgstr "Numero integre positive" + +msgid "Positive small integer" +msgstr "Parve numero integre positive" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Denotation (longitude maxime: %(max_length)s)" + +msgid "Small integer" +msgstr "Parve numero integre" + +msgid "Text" +msgstr "Texto" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Le valor '%(value)s' es in un formato invalide. Debe esser in formato HH:MM[:" +"ss[.uuuuuu]] ." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Le valor '%(value)s' es in le formato correcte (HH:MM[:ss[.uuuuuu]]) ma es " +"un hora invalide." + +msgid "Time" +msgstr "Hora" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Datos binari crude" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' non es un UUID valide." + +msgid "File" +msgstr "File" + +msgid "Image" +msgstr "Imagine" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "Le instantia de %(model)s con %(field)s %(value)r non existe." + +msgid "Foreign Key (type determined by related field)" +msgstr "Clave estranier (typo determinate per le campo associate)" + +msgid "One-to-one relationship" +msgstr "Relation un a un" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Relation %(from)s a %(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Relationes %(from)s a %(to)s" + +msgid "Many-to-many relationship" +msgstr "Relation multes a multes" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Iste campo es obligatori." + +msgid "Enter a whole number." +msgstr "Specifica un numero integre." + +msgid "Enter a number." +msgstr "Specifica un numero." + +msgid "Enter a valid date." +msgstr "Specifica un data valide." + +msgid "Enter a valid time." +msgstr "Specifica un hora valide." + +msgid "Enter a valid date/time." +msgstr "Specifica un data e hora valide." + +msgid "Enter a valid duration." +msgstr "Specifica un duration valide." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"Nulle file esseva submittite. Verifica le typo de codification in le " +"formulario." + +msgid "No file was submitted." +msgstr "Nulle file esseva submittite." + +msgid "The submitted file is empty." +msgstr "Le file submittite es vacue." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Assecura te que iste valor ha al plus %(max)d character (illo ha %(length)d)." +msgstr[1] "" +"Assecura te que iste valor ha al plus %(max)d characteres (illo ha " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Per favor o submitte un file o marca le quadrato \"rader\", non ambes." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Per favor incarga un imagine valide. Le file que tu incargava o non esseva " +"un imagine o esseva un imagine corrumpite." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Selige un option valide. %(value)s non es inter le optiones disponibile." + +msgid "Enter a list of values." +msgstr "Scribe un lista de valores." + +msgid "Enter a complete value." +msgstr "Specifica un valor complete." + +msgid "Enter a valid UUID." +msgstr "Specifica un UUID valide." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Campo celate %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Le datos ManagementForm manca o ha essite manipulate" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Per favor, submitte %d o minus formularios." +msgstr[1] "Per favor, submitte %d o minus formularios." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Per favor, submitte %d o plus formularios." +msgstr[1] "Per favor, submitte %d o plus formularios." + +msgid "Order" +msgstr "Ordine" + +msgid "Delete" +msgstr "Deler" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Per favor corrige le datos duplicate pro %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Per favor corrige le datos duplicate pro %(field)s, que debe esser unic." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Per favor corrige le datos duplicate pro %(field_name)s, que debe esser unic " +"pro le %(lookup)s in %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Per favor corrige le sequente valores duplicate." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Per favor selige un option valide. Iste option non es inter le optiones " +"disponibile." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s non poteva esser interpretate in le fuso horari " +"%(current_timezone)s; illo pote esser ambigue o illo pote non exister." + +msgid "Clear" +msgstr "Rader" + +msgid "Currently" +msgstr "Actualmente" + +msgid "Change" +msgstr "Cambiar" + +msgid "Unknown" +msgstr "Incognite" + +msgid "Yes" +msgstr "Si" + +msgid "No" +msgstr "No" + +msgid "yes,no,maybe" +msgstr "si,no,forsan" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "pm." + +msgid "a.m." +msgstr "am." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "medienocte" + +msgid "noon" +msgstr "mediedie" + +msgid "Monday" +msgstr "lunedi" + +msgid "Tuesday" +msgstr "martedi" + +msgid "Wednesday" +msgstr "mercuridi" + +msgid "Thursday" +msgstr "jovedi" + +msgid "Friday" +msgstr "venerdi" + +msgid "Saturday" +msgstr "sabbato" + +msgid "Sunday" +msgstr "dominica" + +msgid "Mon" +msgstr "lun" + +msgid "Tue" +msgstr "mar" + +msgid "Wed" +msgstr "mer" + +msgid "Thu" +msgstr "jov" + +msgid "Fri" +msgstr "ven" + +msgid "Sat" +msgstr "sab" + +msgid "Sun" +msgstr "dom" + +msgid "January" +msgstr "januario" + +msgid "February" +msgstr "februario" + +msgid "March" +msgstr "martio" + +msgid "April" +msgstr "april" + +msgid "May" +msgstr "maio" + +msgid "June" +msgstr "junio" + +msgid "July" +msgstr "julio" + +msgid "August" +msgstr "augusto" + +msgid "September" +msgstr "septembre" + +msgid "October" +msgstr "octobre" + +msgid "November" +msgstr "novembre" + +msgid "December" +msgstr "decembre" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "mai" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "aug" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "oct" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dec" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "April" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maio" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Junio" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julio" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Aug." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Oct." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dec." + +msgctxt "alt. month" +msgid "January" +msgstr "Januario" + +msgctxt "alt. month" +msgid "February" +msgstr "Februario" + +msgctxt "alt. month" +msgid "March" +msgstr "Martio" + +msgctxt "alt. month" +msgid "April" +msgstr "April" + +msgctxt "alt. month" +msgid "May" +msgstr "Maio" + +msgctxt "alt. month" +msgid "June" +msgstr "Junio" + +msgctxt "alt. month" +msgid "July" +msgstr "Julio" + +msgctxt "alt. month" +msgid "August" +msgstr "Augusto" + +msgctxt "alt. month" +msgid "September" +msgstr "Septembre" + +msgctxt "alt. month" +msgid "October" +msgstr "Octobre" + +msgctxt "alt. month" +msgid "November" +msgstr "Novembre" + +msgctxt "alt. month" +msgid "December" +msgstr "Decembre" + +msgid "This is not a valid IPv6 address." +msgstr "Isto non es un adresse IPv6 valide." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "o" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d anno" +msgstr[1] "%d annos" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mense" +msgstr[1] "%d menses" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d septimana" +msgstr[1] "%d septimanas" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d die" +msgstr[1] "%d dies" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horas" +msgstr[1] "%d horas" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minutas" + +msgid "0 minutes" +msgstr "0 minutas" + +msgid "Forbidden" +msgstr "Prohibite" + +msgid "CSRF verification failed. Request aborted." +msgstr "Verification CSRF fallite. Requesta abortate." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Tu vide iste message perque iste sito HTTPS require que un capite 'Referer' " +"sia inviate per tu navigator Web, ma nulle tal capite esseva inviate. Iste " +"capite es requirite pro motivos de securitate, pro assecurar que tu " +"navigator non es sequestrate per tertie personas." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Si tu ha disactivate le invio de capites 'Referer' in tu navigator, per " +"favor re-activa isto, al minus pro iste sito, o pro connexiones HTTPS, o pro " +"requestas del 'mesme origine'." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Tu vide iste message perque iste sito require un cookie CSRF durante le " +"submission de formularios. Iste cookie es requirite pro motivos de " +"securitate, pro assecurar que tu navigator non es sequestrate per tertie " +"personas." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Si tu ha disactivate le cookies in tu navigator, per favor re-activa los, al " +"minus pro iste sito, o pro requestas del 'mesme origine'." + +msgid "More information is available with DEBUG=True." +msgstr "Plus information es disponibile con DEBUG=True." + +msgid "No year specified" +msgstr "Nulle anno specificate" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Nulle mense specificate" + +msgid "No day specified" +msgstr "Nulle die specificate" + +msgid "No week specified" +msgstr "Nulle septimana specificate" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Il non ha %(verbose_name_plural)s disponibile" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"In le futuro, %(verbose_name_plural)s non essera disponibile perque " +"%(class_name)s.allow_future es False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Le data '%(datestr)s' es invalide secundo le formato '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Nulle %(verbose_name)s trovate que corresponde al consulta" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Pagina non es 'last', ni pote esser convertite in un numero integre." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Pagina invalide (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Le lista es vacue e '%(class_name)s.allow_empty' es False." + +msgid "Directory indexes are not allowed here." +msgstr "Le indices de directorio non es permittite hic." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" non existe" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Indice de %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/id/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/id/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/id/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/id/formats.py new file mode 100644 index 0000000..1458230 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/id/formats.py @@ -0,0 +1,49 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j N Y' +DATETIME_FORMAT = "j N Y, G.i" +TIME_FORMAT = 'G.i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'd-m-Y' +SHORT_DATETIME_FORMAT = 'd-m-Y G.i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d-%m-%y', '%d/%m/%y', # '25-10-09', 25/10/09' + '%d-%m-%Y', '%d/%m/%Y', # '25-10-2009', 25/10/2009' + '%d %b %Y', # '25 Oct 2006', + '%d %B %Y', # '25 October 2006' +] + +TIME_INPUT_FORMATS = [ + '%H.%M.%S', # '14.30.59' + '%H.%M', # '14.30' +] + +DATETIME_INPUT_FORMATS = [ + '%d-%m-%Y %H.%M.%S', # '25-10-2009 14.30.59' + '%d-%m-%Y %H.%M.%S.%f', # '25-10-2009 14.30.59.000200' + '%d-%m-%Y %H.%M', # '25-10-2009 14.30' + '%d-%m-%Y', # '25-10-2009' + '%d-%m-%y %H.%M.%S', # '25-10-09' 14.30.59' + '%d-%m-%y %H.%M.%S.%f', # '25-10-09' 14.30.59.000200' + '%d-%m-%y %H.%M', # '25-10-09' 14.30' + '%d-%m-%y', # '25-10-09'' + '%m/%d/%y %H.%M.%S', # '10/25/06 14.30.59' + '%m/%d/%y %H.%M.%S.%f', # '10/25/06 14.30.59.000200' + '%m/%d/%y %H.%M', # '10/25/06 14.30' + '%m/%d/%y', # '10/25/06' + '%m/%d/%Y %H.%M.%S', # '25/10/2009 14.30.59' + '%m/%d/%Y %H.%M.%S.%f', # '25/10/2009 14.30.59.000200' + '%m/%d/%Y %H.%M', # '25/10/2009 14.30' + '%m/%d/%Y', # '10/25/2009' +] + +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/io/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..3efe6fd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,1206 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viko Bartero , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: io\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "العربية" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Azərbaycanca" + +msgid "Bulgarian" +msgstr "български" + +msgid "Belarusian" +msgstr "беларуская" + +msgid "Bengali" +msgstr "বাংলা" + +msgid "Breton" +msgstr "Brezhoneg" + +msgid "Bosnian" +msgstr "босански" + +msgid "Catalan" +msgstr "Català" + +msgid "Czech" +msgstr "čeština" + +msgid "Welsh" +msgstr "Cymraeg" + +msgid "Danish" +msgstr "dansk" + +msgid "German" +msgstr "Deutsch" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Ελληνικά" + +msgid "English" +msgstr "English" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "British English" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Español" + +msgid "Argentinian Spanish" +msgstr "Español de Argentina" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Español de México" + +msgid "Nicaraguan Spanish" +msgstr "Español de Nicaragua" + +msgid "Venezuelan Spanish" +msgstr "Español de Venezuela" + +msgid "Estonian" +msgstr "Eesti" + +msgid "Basque" +msgstr "Euskara" + +msgid "Persian" +msgstr "فارسی" + +msgid "Finnish" +msgstr "Suomi" + +msgid "French" +msgstr "Français" + +msgid "Frisian" +msgstr "Frysk" + +msgid "Irish" +msgstr "Gaeilge" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Galego" + +msgid "Hebrew" +msgstr "עברית" + +msgid "Hindi" +msgstr "हिन्दी" + +msgid "Croatian" +msgstr "hrvatski" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Magyar" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Bahasa Indonesia" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Íslenska" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "日本語" + +msgid "Georgian" +msgstr "ქართული" + +msgid "Kazakh" +msgstr "Қазақша" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannaḍa" + +msgid "Korean" +msgstr "한국어" + +msgid "Luxembourgish" +msgstr "Lëtzebuergesch" + +msgid "Lithuanian" +msgstr "Lietuvių" + +msgid "Latvian" +msgstr "Latviešu" + +msgid "Macedonian" +msgstr "Македонски" + +msgid "Malayalam" +msgstr "മലയാളം" + +msgid "Mongolian" +msgstr "Монгол" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "Burmese" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "नेपाली" + +msgid "Dutch" +msgstr "Nederlands" + +msgid "Norwegian Nynorsk" +msgstr "Norsk nynorsk" + +msgid "Ossetic" +msgstr "Ossetic" + +msgid "Punjabi" +msgstr "ਪੰਜਾਬੀ" + +msgid "Polish" +msgstr "Polski" + +msgid "Portuguese" +msgstr "Português" + +msgid "Brazilian Portuguese" +msgstr "Português do Brasil" + +msgid "Romanian" +msgstr "Română" + +msgid "Russian" +msgstr "Русский" + +msgid "Slovak" +msgstr "Slovenčina" + +msgid "Slovenian" +msgstr "Slovenščina" + +msgid "Albanian" +msgstr "Shqip" + +msgid "Serbian" +msgstr "Српски / srpski" + +msgid "Serbian Latin" +msgstr "Serbian Latin" + +msgid "Swedish" +msgstr "Svenska" + +msgid "Swahili" +msgstr "Kiswahili" + +msgid "Tamil" +msgstr "தமிழ்" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Thai" +msgstr "ไทย" + +msgid "Turkish" +msgstr "Türkçe" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Удмурт" + +msgid "Ukrainian" +msgstr "Українська" + +msgid "Urdu" +msgstr "اُردُو" + +msgid "Vietnamese" +msgstr "Tiếng Việt" + +msgid "Simplified Chinese" +msgstr "简体中文" + +msgid "Traditional Chinese" +msgstr "繁體中文" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Skribez valida datumo." + +msgid "Enter a valid URL." +msgstr "Skribez valida URL." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Skribez valida e-posto adreso." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Skribez valida \"slug\" kompozata de literi, numeri, juntostreki o " +"subjuntostreki." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Skribez valida IPv4 adreso." + +msgid "Enter a valid IPv6 address." +msgstr "Skribez valida IPv6 adreso." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Skribez valida adreso IPv4 od IPv6." + +msgid "Enter only digits separated by commas." +msgstr "Skribez nur cifri separata per komi." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Verifikez ke ica datumo esas %(limit_value)s (olu esas %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Verifikez ke ica datumo esas minora kam od egala a %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Verifikez ke ica datumo esas majora kam od egala a %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Verifikez ke ica datumo havas %(limit_value)d litero adminime (olu havas " +"%(show_value)d)." +msgstr[1] "" +"Verifikez ke ica datumo havas %(limit_value)d literi adminime (olu havas " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Verifikez ke ica datumo havas %(limit_value)d litero admaxime (olu havas " +"%(show_value)d)." +msgstr[1] "" +"Verifikez ke ica datumo havas %(limit_value)d literi admaxime (olu havas " +"%(show_value)d)." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "e" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Ica feldo ne povas esar nula." + +msgid "This field cannot be blank." +msgstr "Ica feldo ne povas esar vakua." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "La %(model_name)s kun ica %(field_label)s ja existas." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Feldo de tipo: %(field_type)s" + +msgid "Integer" +msgstr "Integro" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Granda (8 byte) integro" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Booleano (True o False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (til %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Integri separata per komi" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Dato (sen horo)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Dato (kun horo)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Decimala numero" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "E-postala adreso" + +msgid "File path" +msgstr "Arkivo voyo" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Glitkomo numero" + +msgid "IPv4 address" +msgstr "IPv4 adreso" + +msgid "IP address" +msgstr "IP adreso" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (True, False o None)" + +msgid "Positive integer" +msgstr "Positiva integro" + +msgid "Positive small integer" +msgstr "Positiva mikra integro" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (til %(max_length)s)" + +msgid "Small integer" +msgstr "Mikra integro" + +msgid "Text" +msgstr "Texto" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Horo" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Kruda binara datumo" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Arkivo" + +msgid "Image" +msgstr "Imajo" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Exterklefo (la tipo esas determinata per la relatata feldo)" + +msgid "One-to-one relationship" +msgstr "Un-ad-un parenteso" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Multi-a-multi parenteso" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Ica feldo esas obligata." + +msgid "Enter a whole number." +msgstr "Skribez kompleta numero" + +msgid "Enter a number." +msgstr "Skribez numero." + +msgid "Enter a valid date." +msgstr "Skribez valida dato." + +msgid "Enter a valid time." +msgstr "Skribez valida horo." + +msgid "Enter a valid date/time." +msgstr "Skribez valida dato/horo." + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Nula arkivo sendesis. Verifikez la kodexigo tipo en la formulario." + +msgid "No file was submitted." +msgstr "Nula arkivo sendesis." + +msgid "The submitted file is empty." +msgstr "La sendita arkivo esas vakua." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Verifikez ke ica dosiero nomo havas %(max)d skribsigno admaxime (olu havas " +"%(length)d)." +msgstr[1] "" +"Verifikez ke ica arkivo nomo havas %(max)d skribsigni admaxime (olu havas " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Sendez arkivo o markizez la vakua markbuxo, ne la du." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Kargez valida imajo. La arkivo qua vu kargis ne esis imajo od esis defektiva." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Selektez valida selekto. %(value)s ne esas un de la disponebla selekti." + +msgid "Enter a list of values." +msgstr "Skribez listo de datumi." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Okulta feldo %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Ordinar" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Koretigez duopligata datumi por %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Korektigez la duopligata datumi por %(field)s, qui mustas esar unika." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Korektigez la duopligata datumi por %(field_name)s qui mustas esar unika por " +"la %(lookup)s en %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Korektigez la duopligata datumi infre." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Selektez valida selekto. Ita selekto ne esas un de la disponebla selekti." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"La %(datetime)s ne povis esar interpretata en la horala zono " +"%(current_timezone)s; forsan, olu esas ambigua o ne existas." + +msgid "Clear" +msgstr "Vakuigar" + +msgid "Currently" +msgstr "Aktuale" + +msgid "Change" +msgstr "Modifikar" + +msgid "Unknown" +msgstr "Nekonocata" + +msgid "Yes" +msgstr "Yes" + +msgid "No" +msgstr "No" + +msgid "yes,no,maybe" +msgstr "yes,no,forsan" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "noktomezo" + +msgid "noon" +msgstr "dimezo" + +msgid "Monday" +msgstr "Lundio" + +msgid "Tuesday" +msgstr "Mardio" + +msgid "Wednesday" +msgstr "Merkurdio" + +msgid "Thursday" +msgstr "Jovdio" + +msgid "Friday" +msgstr "Venerdio" + +msgid "Saturday" +msgstr "Saturdio" + +msgid "Sunday" +msgstr "Sundio" + +msgid "Mon" +msgstr "Lun" + +msgid "Tue" +msgstr "Mar" + +msgid "Wed" +msgstr "Mer" + +msgid "Thu" +msgstr "Jov" + +msgid "Fri" +msgstr "Ven" + +msgid "Sat" +msgstr "Sat" + +msgid "Sun" +msgstr "Sun" + +msgid "January" +msgstr "Januaro" + +msgid "February" +msgstr "Februaro" + +msgid "March" +msgstr "Marto" + +msgid "April" +msgstr "Aprilo" + +msgid "May" +msgstr "Mayo" + +msgid "June" +msgstr "Junio" + +msgid "July" +msgstr "Julio" + +msgid "August" +msgstr "Agosto" + +msgid "September" +msgstr "Septembro" + +msgid "October" +msgstr "Oktobro" + +msgid "November" +msgstr "Novembro" + +msgid "December" +msgstr "Decembro" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "may" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ago" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dec" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Marto" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Aprilo" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mayo" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Junio" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julio" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ago." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dec." + +msgctxt "alt. month" +msgid "January" +msgstr "Januaro" + +msgctxt "alt. month" +msgid "February" +msgstr "Februaro" + +msgctxt "alt. month" +msgid "March" +msgstr "Marto" + +msgctxt "alt. month" +msgid "April" +msgstr "Aprilo" + +msgctxt "alt. month" +msgid "May" +msgstr "Mayo" + +msgctxt "alt. month" +msgid "June" +msgstr "Junio" + +msgctxt "alt. month" +msgid "July" +msgstr "Julio" + +msgctxt "alt. month" +msgid "August" +msgstr "Agosto" + +msgctxt "alt. month" +msgid "September" +msgstr "Septembro" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktobro" + +msgctxt "alt. month" +msgid "November" +msgstr "Novembro" + +msgctxt "alt. month" +msgid "December" +msgstr "Decembro" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "o" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d yaro" +msgstr[1] "%d yari" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d monato" +msgstr[1] "%d monati" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semano" +msgstr[1] "%d semani" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dio" +msgstr[1] "%d dii" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horo" +msgstr[1] "%d hori" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minuti" + +msgid "0 minutes" +msgstr "0 minuti" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "La yaro ne specizigesis" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "La monato ne specizigesis" + +msgid "No day specified" +msgstr "La dio ne specizigesis" + +msgid "No week specified" +msgstr "La semano ne specizigesis" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ne esas %(verbose_name_plural)s disponebla" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"La futura %(verbose_name_plural)s ne esas disponebla pro ke %(class_name)s." +"allow_future esas False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "Onu ne permisas direktorio indexi hike." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ne existas" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Indexi di %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4859aaf Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..60dc67e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,1266 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# gudmundur , 2011 +# Hafsteinn Einarsson , 2011-2012 +# Jannis Leidel , 2011 +# Matt R, 2018 +# saevarom , 2011 +# saevarom , 2013,2015 +# Thordur Sigurdsson , 2016-2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 15:48+0000\n" +"Last-Translator: Thordur Sigurdsson \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +msgid "Afrikaans" +msgstr "Afríkanska" + +msgid "Arabic" +msgstr "Arabíska" + +msgid "Asturian" +msgstr "Astúríska" + +msgid "Azerbaijani" +msgstr "Aserbaídsjíska" + +msgid "Bulgarian" +msgstr "Búlgarska" + +msgid "Belarusian" +msgstr "Hvítrússneska" + +msgid "Bengali" +msgstr "Bengalska" + +msgid "Breton" +msgstr "Bretónska" + +msgid "Bosnian" +msgstr "Bosníska" + +msgid "Catalan" +msgstr "Katalónska" + +msgid "Czech" +msgstr "Tékkneska" + +msgid "Welsh" +msgstr "Velska" + +msgid "Danish" +msgstr "Danska" + +msgid "German" +msgstr "Þýska" + +msgid "Lower Sorbian" +msgstr "Neðri sorbíska" + +msgid "Greek" +msgstr "Gríska" + +msgid "English" +msgstr "Enska" + +msgid "Australian English" +msgstr "Áströlsk enska" + +msgid "British English" +msgstr "Bresk enska" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spænska" + +msgid "Argentinian Spanish" +msgstr "Argentínsk spænska" + +msgid "Colombian Spanish" +msgstr "Kólumbísk spænska" + +msgid "Mexican Spanish" +msgstr "Mexíkósk spænska" + +msgid "Nicaraguan Spanish" +msgstr "Níkaragva spænska" + +msgid "Venezuelan Spanish" +msgstr "Venesúelsk spænska" + +msgid "Estonian" +msgstr "Eistneska" + +msgid "Basque" +msgstr "Baskneska" + +msgid "Persian" +msgstr "Persneska" + +msgid "Finnish" +msgstr "Finnska" + +msgid "French" +msgstr "Franska" + +msgid "Frisian" +msgstr "Frísneska" + +msgid "Irish" +msgstr "Írska" + +msgid "Scottish Gaelic" +msgstr "Skosk gelíska" + +msgid "Galician" +msgstr "Galíska" + +msgid "Hebrew" +msgstr "Hebreska" + +msgid "Hindi" +msgstr "Hindí" + +msgid "Croatian" +msgstr "Króatíska" + +msgid "Upper Sorbian" +msgstr "Efri sorbíska" + +msgid "Hungarian" +msgstr "Ungverska" + +msgid "Armenian" +msgstr "Armenska" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indónesíska" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Íslenska" + +msgid "Italian" +msgstr "Ítalska" + +msgid "Japanese" +msgstr "Japanska" + +msgid "Georgian" +msgstr "Georgíska" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "Kasakska" + +msgid "Khmer" +msgstr "Kmeríska" + +msgid "Kannada" +msgstr "Kannadanska" + +msgid "Korean" +msgstr "Kóreska" + +msgid "Luxembourgish" +msgstr "Lúxemborgíska" + +msgid "Lithuanian" +msgstr "Litháenska" + +msgid "Latvian" +msgstr "Lettneska" + +msgid "Macedonian" +msgstr "Makedónska" + +msgid "Malayalam" +msgstr "Malajalamska" + +msgid "Mongolian" +msgstr "Mongólska" + +msgid "Marathi" +msgstr "Maratí" + +msgid "Burmese" +msgstr "Búrmíska" + +msgid "Norwegian Bokmål" +msgstr "Norskt bókmál" + +msgid "Nepali" +msgstr "Nepalska" + +msgid "Dutch" +msgstr "Hollenska" + +msgid "Norwegian Nynorsk" +msgstr "Nýnorska" + +msgid "Ossetic" +msgstr "Ossetíska" + +msgid "Punjabi" +msgstr "Púndjabíska" + +msgid "Polish" +msgstr "Pólska" + +msgid "Portuguese" +msgstr "Portúgalska" + +msgid "Brazilian Portuguese" +msgstr "Brasilísk portúgalska" + +msgid "Romanian" +msgstr "Rúmenska" + +msgid "Russian" +msgstr "Rússneska" + +msgid "Slovak" +msgstr "Slóvakíska" + +msgid "Slovenian" +msgstr "Slóvenska" + +msgid "Albanian" +msgstr "Albanska" + +msgid "Serbian" +msgstr "Serbneska" + +msgid "Serbian Latin" +msgstr "Serbnesk latína" + +msgid "Swedish" +msgstr "Sænska" + +msgid "Swahili" +msgstr "Svahílí" + +msgid "Tamil" +msgstr "Tamílska" + +msgid "Telugu" +msgstr "Telúgúska" + +msgid "Thai" +msgstr "Tælenska" + +msgid "Turkish" +msgstr "Tyrkneska" + +msgid "Tatar" +msgstr "Tataríska" + +msgid "Udmurt" +msgstr "Údmúrt" + +msgid "Ukrainian" +msgstr "Úkraínska" + +msgid "Urdu" +msgstr "Úrdú" + +msgid "Vietnamese" +msgstr "Víetnamska" + +msgid "Simplified Chinese" +msgstr "Einfölduð kínverska " + +msgid "Traditional Chinese" +msgstr "Hefðbundin kínverska" + +msgid "Messages" +msgstr "Skilaboð" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "Þetta síðunúmer er ekki heiltala" + +msgid "That page number is less than 1" +msgstr "Þetta síðunúmer er minna en 1" + +msgid "That page contains no results" +msgstr "Þessi síða hefur engar niðurstöður" + +msgid "Enter a valid value." +msgstr "Sláðu inn gilt gildi." + +msgid "Enter a valid URL." +msgstr "Sláðu inn gilt veffang (URL)." + +msgid "Enter a valid integer." +msgstr "Sláðu inn gilda heiltölu." + +msgid "Enter a valid email address." +msgstr "Sláðu inn gilt netfang." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Settu inn gildan vefslóðartitil sem má innihalda latneska bókstafi, " +"tölustafi, undirstrik og bandstrik." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Settu inn gildan vefslóðartitil sem má innihalda unicode bókstafi, " +"tölustafi, undirstrik og bandstrik." + +msgid "Enter a valid IPv4 address." +msgstr "Sláðu inn gilda IPv4 tölu." + +msgid "Enter a valid IPv6 address." +msgstr "Sláðu inn gilt IPv6 vistfang." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Sláðu inn gilt IPv4 eða IPv6 vistfang." + +msgid "Enter only digits separated by commas." +msgstr "Skrifaðu einungis tölur aðskildar með kommum." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Gakktu úr skugga um að gildi sé %(limit_value)s (það er %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Gakktu úr skugga um að gildið sé minna en eða jafnt og %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Gakktu úr skugga um að gildið sé stærra en eða jafnt og %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Gildið má minnst vera %(limit_value)d stafur að lengd (það er %(show_value)d " +"nú)" +msgstr[1] "" +"Gildið má minnst vera %(limit_value)d stafir að lengd (það er %(show_value)d " +"nú)" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Gildið má mest vera %(limit_value)d stafur að lengd (það er %(show_value)d " +"nú)" +msgstr[1] "" +"Gildið má mest vera %(limit_value)d stafir að lengd (það er %(show_value)d " +"nú)" + +msgid "Enter a number." +msgstr "Sláðu inn tölu." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu." +msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Gildið má ekki hafa meira en %(max)s tugatölustaf (decimal places)." +msgstr[1] "" +"Gildið má ekki hafa meira en %(max)s tugatölustafi (decimal places)." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Gildið má ekki hafa fleiri en %(max)s tölu fyrir tugabrotskil." +msgstr[1] "Gildið má ekki hafa fleiri en %(max)s tölur fyrir tugabrotskil." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Skrár með endingunni '%(extension)s' eru ekki leyfðar. Leyfilegar endingar " +"eru: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Núlltákn eru ekki leyfileg." + +msgid "and" +msgstr "og" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s með þessi %(field_labels)s er nú þegar til." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Gildið %(value)r er ógilt." + +msgid "This field cannot be null." +msgstr "Þessi reitur getur ekki haft tómgildi (null)." + +msgid "This field cannot be blank." +msgstr "Þessi reitur má ekki vera tómur." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s með þetta %(field_label)s er nú þegar til." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s verður að vera einkvæmt fyrir %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Reitur af gerð: %(field_type)s" + +msgid "Integer" +msgstr "Heiltala" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Gildi '%(value)s' verður að vera heiltala." + +msgid "Big (8 byte) integer" +msgstr "Stór (8 bæta) heiltala" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' verður að vera annaðhvort satt eða ósatt." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' verður að vera eitt eftirtalinna: True, False eða None." + +msgid "Boolean (Either True or False)" +msgstr "Boole-gildi (True eða False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Strengur (mest %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Heiltölur aðgreindar með kommum" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' er ógilt dagsetningarsnið. Það verður að vera á sniðinu YYYY-MM-" +"DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "'%(value)s' hefur rétt snið (YYYY-MM-DD) en dagsetningin er ógild." + +msgid "Date (without time)" +msgstr "Dagsetning (án tíma)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' hefur ógilt snið. Það verður að vera á sniðinu: YYYY-MM-DD HH:" +"MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' hefur rétt snið (YYYY-MM-DD HH:MM [:ss[.uuuuuu]][TZ]) en það er " +"ógild dagsetning/tími." + +msgid "Date (with time)" +msgstr "Dagsetning (með tíma)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' verður að vera tugatala." + +msgid "Decimal number" +msgstr "Tugatala" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' er á ógildu sniði. Það verður að vera á sniðinu [DD] [HH:" +"[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Tímalengd" + +msgid "Email address" +msgstr "Netfang" + +msgid "File path" +msgstr "Skjalaslóð" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' verður að vera fleytitala." + +msgid "Floating point number" +msgstr "Fleytitala (floating point number)" + +msgid "IPv4 address" +msgstr "IPv4 vistfang" + +msgid "IP address" +msgstr "IP tala" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' verður að vera eitt eftirtalinna: None, True eða False." + +msgid "Boolean (Either True, False or None)" +msgstr "Boole-gildi (True, False eða None)" + +msgid "Positive integer" +msgstr "Jákvæð heiltala" + +msgid "Positive small integer" +msgstr "Jákvæð lítil heiltala" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slögg (allt að %(max_length)s)" + +msgid "Small integer" +msgstr "Lítil heiltala" + +msgid "Text" +msgstr "Texti" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' er á ógildu sniði. Það verður að vera á sniðinu HH:MM[:ss[." +"uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' er á réttu sniði (HH:MM[:ss[.uuuuuu]]), en það er ógild " +"dagsetning/tími." + +msgid "Time" +msgstr "Tími" + +msgid "URL" +msgstr "Veffang" + +msgid "Raw binary data" +msgstr "Hrá tvíundargögn (binary data)" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' er ekki gilt UUID." + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "Skrá" + +msgid "Image" +msgstr "Mynd" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s hlutur með %(field)s %(value)r er ekki til." + +msgid "Foreign Key (type determined by related field)" +msgstr "Ytri lykill (Gerð ákveðin af skyldum reit)" + +msgid "One-to-one relationship" +msgstr "Einn-á-einn samband." + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s samband" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s sambönd" + +msgid "Many-to-many relationship" +msgstr "Margir-til-margra samband." + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Þennan reit þarf að fylla út." + +msgid "Enter a whole number." +msgstr "Sláðu inn heiltölu." + +msgid "Enter a valid date." +msgstr "Sláðu inn gilda dagsetningu." + +msgid "Enter a valid time." +msgstr "Sláðu inn gilda tímasetningu." + +msgid "Enter a valid date/time." +msgstr "Sláðu inn gilda dagsetningu ásamt tíma." + +msgid "Enter a valid duration." +msgstr "Sláðu inn gilt tímabil." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Fjöldi daga verður að vera á milli {min_days} og {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Engin skrá var send. Athugaðu kótunartegund á forminu (encoding type)." + +msgid "No file was submitted." +msgstr "Engin skrá var send." + +msgid "The submitted file is empty." +msgstr "Innsend skrá er tóm." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Skráarnafnið má mest vera %(max)d stafur að lengd (það er %(length)d nú)" +msgstr[1] "" +"Skráarnafnið má mest vera %(max)d stafir að lengd (það er %(length)d nú)" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Vinsamlegast sendu annað hvort inn skrá eða merktu í boxið, ekki bæði." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Halaðu upp gildri myndskrá. Skráin sem þú halaðir upp var annað hvort gölluð " +"eða ekki mynd." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Veldu gildan valmöguleika. %(value)s er ekki eitt af gildum valmöguleikum." + +msgid "Enter a list of values." +msgstr "Sláðu inn lista af gildum." + +msgid "Enter a complete value." +msgstr "Sláðu inn heilt gildi." + +msgid "Enter a valid UUID." +msgstr "Sláðu inn gilt UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Falinn reitur %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Gögn fyrir ManagementForm vantar eða hefur verið breytt" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Vinsamlegast sendu %d eða færri form." +msgstr[1] "Vinsamlegast sendu %d eða færri form." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Vinsamlegast sendu %d eða fleiri form." +msgstr[1] "Vinsamlegast sendu %d eða fleiri form." + +msgid "Order" +msgstr "Röð" + +msgid "Delete" +msgstr "Eyða" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Vinsamlegast leiðréttu tvítekin gögn í reit %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Vinsamlegast lagfærðu gögn í reit %(field)s, sem verða að vera einstök." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Vinsamlegast leiðréttu tvítekin gögn í reit %(field_name)s sem verða að vera " +"einstök fyrir %(lookup)s í %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Vinsamlegast lagfærðu tvítöldu gögnin fyrir neðan." + +msgid "The inline value did not match the parent instance." +msgstr "Innra gildið passar ekki við eiganda." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Veldu gildan valmöguleika. Valið virðist ekki vera eitt af gildum " +"valmöguleikum." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "„%(pk)s“ er ekki gilt gildi." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s er ekki hægt að túlka í tímabelti %(current_timezone)s, það " +"getur verið óljóst eða að það er ekki til." + +msgid "Clear" +msgstr "Hreinsa" + +msgid "Currently" +msgstr "Eins og er:" + +msgid "Change" +msgstr "Breyta" + +msgid "Unknown" +msgstr "Óþekkt" + +msgid "Yes" +msgstr "Já" + +msgid "No" +msgstr "Nei" + +msgid "yes,no,maybe" +msgstr "já,nei,kannski" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bæti" +msgstr[1] "%(size)d bæti" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "eftirmiðdegi" + +msgid "a.m." +msgstr "morgun" + +msgid "PM" +msgstr "Eftirmiðdegi" + +msgid "AM" +msgstr "Morgun" + +msgid "midnight" +msgstr "miðnætti" + +msgid "noon" +msgstr "hádegi" + +msgid "Monday" +msgstr "mánudagur" + +msgid "Tuesday" +msgstr "þriðjudagur" + +msgid "Wednesday" +msgstr "miðvikudagur" + +msgid "Thursday" +msgstr "fimmtudagur" + +msgid "Friday" +msgstr "föstudagur" + +msgid "Saturday" +msgstr "laugardagur" + +msgid "Sunday" +msgstr "sunnudagur" + +msgid "Mon" +msgstr "mán" + +msgid "Tue" +msgstr "þri" + +msgid "Wed" +msgstr "mið" + +msgid "Thu" +msgstr "fim" + +msgid "Fri" +msgstr "fös" + +msgid "Sat" +msgstr "lau" + +msgid "Sun" +msgstr "sun" + +msgid "January" +msgstr "janúar" + +msgid "February" +msgstr "febrúar" + +msgid "March" +msgstr "mars" + +msgid "April" +msgstr "apríl" + +msgid "May" +msgstr "maí" + +msgid "June" +msgstr "júní" + +msgid "July" +msgstr "júlí" + +msgid "August" +msgstr "ágúst" + +msgid "September" +msgstr "september" + +msgid "October" +msgstr "október" + +msgid "November" +msgstr "nóvember" + +msgid "December" +msgstr "desember" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "maí" + +msgid "jun" +msgstr "jún" + +msgid "jul" +msgstr "júl" + +msgid "aug" +msgstr "ágú" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nóv" + +msgid "dec" +msgstr "des" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "mars" + +msgctxt "abbrev. month" +msgid "April" +msgstr "apríl" + +msgctxt "abbrev. month" +msgid "May" +msgstr "maí" + +msgctxt "abbrev. month" +msgid "June" +msgstr "júní" + +msgctxt "abbrev. month" +msgid "July" +msgstr "júlí" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "ág." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "nóv." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "des." + +msgctxt "alt. month" +msgid "January" +msgstr "janúar" + +msgctxt "alt. month" +msgid "February" +msgstr "febrúar" + +msgctxt "alt. month" +msgid "March" +msgstr "mars" + +msgctxt "alt. month" +msgid "April" +msgstr "apríl" + +msgctxt "alt. month" +msgid "May" +msgstr "maí" + +msgctxt "alt. month" +msgid "June" +msgstr "júní" + +msgctxt "alt. month" +msgid "July" +msgstr "júlí" + +msgctxt "alt. month" +msgid "August" +msgstr "ágúst" + +msgctxt "alt. month" +msgid "September" +msgstr "september" + +msgctxt "alt. month" +msgid "October" +msgstr "október" + +msgctxt "alt. month" +msgid "November" +msgstr "nóvember" + +msgctxt "alt. month" +msgid "December" +msgstr "desember" + +msgid "This is not a valid IPv6 address." +msgstr "Þetta er ekki gilt IPv6 vistfang." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "eða" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d ár" +msgstr[1] "%d ár" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mánuður" +msgstr[1] "%d mánuðir" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d vika" +msgstr[1] "%d vikur" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dagur" +msgstr[1] "%d dagar" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d klukkustund" +msgstr[1] "%d klukkustundir" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d mínúta" +msgstr[1] "%d mínútur" + +msgid "0 minutes" +msgstr "0 mínútur" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF auðkenning tókst ekki." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Þú ert að fá þessi skilaboð því þetta HTTPS vefsvæði þarfnast að vafrinn " +"þinn sendi ‚Referer‘ haus (e. referer header) sem var ekki sendur. Þessi " +"haus er nauðsynlegur af öryggisástæðum til að ganga úr skugga um að " +"utanaðkomandi aðili sé ekki að senda fyrirspurnir úr vafranum þínum." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Ef þú hefur stillt vafrann þinn til að gera ‚Referer‘ hausa óvirka þarftu að " +"virkja þá aftur. Að minnsta kosti fyrir þetta vefsvæði, eða HTTPS tengingar " +"eða ‚same-origin‘ fyrirspurnir." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Þú ert að fá þessi skilaboð því þetta vefsvæði þarfnast að CSRF kaka (e. " +"cookie) sé send þegar form eru send. Þessi kaka er nauðsynleg af " +"öryggisástæðum til að ganga úr skugga um að utanaðkomandi aðili sé ekki að " +"senda fyrirspurnir úr vafranum þínum." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Ef þú hefur stillt vafrann þinn til að gera kökur óvirkar þarftu að virkja " +"þær aftur. Að minnsta kosti fyrir þetta vefsvæði eða ‚same-origin‘ " +"fyrirspurnir." + +msgid "More information is available with DEBUG=True." +msgstr "Meiri upplýsingar fást með DEBUG=True." + +msgid "No year specified" +msgstr "Ekkert ár tilgreint" + +msgid "Date out of range" +msgstr "Dagsetning utan tímabils" + +msgid "No month specified" +msgstr "Enginn mánuður tilgreindur" + +msgid "No day specified" +msgstr "Enginn dagur tilgreindur" + +msgid "No week specified" +msgstr "Engin vika tilgreind" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ekkert %(verbose_name_plural)s í boði" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Framtíðar %(verbose_name_plural)s ekki í boði því %(class_name)s." +"allow_future er Ósatt." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Ógilt snið dagsetningar \"%(datestr)s\" gefið sniðið \"%(format)s\"" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Ekkert %(verbose_name)s sem uppfyllir skilyrði" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Þetta er hvorki síðasta síða, né er hægt að breyta í heiltölu." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Ógild síða (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Tómur listi og '%(class_name)s.allow_empty er Ósatt." + +msgid "Directory indexes are not allowed here." +msgstr "Möppulistar eru ekki leyfðir hér." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" er ekki til" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Innihald %(directory)s " + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4440f63 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..9a610ab --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,1250 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# xiu1 , 2016 +# GOTO Hayato , 2019 +# Jannis Leidel , 2011 +# Kentaro Matsuzaki , 2015 +# Masashi SHIBATA , 2017 +# Nikita K , 2019 +# Shinichi Katsumata , 2019 +# Shinya Okano , 2012-2019 +# Tetsuya Morimoto , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-06-07 08:56+0000\n" +"Last-Translator: GOTO Hayato \n" +"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "アフリカーンス語" + +msgid "Arabic" +msgstr "アラビア語" + +msgid "Asturian" +msgstr "アストゥリアス語" + +msgid "Azerbaijani" +msgstr "アゼルバイジャン語" + +msgid "Bulgarian" +msgstr "ブルガリア語" + +msgid "Belarusian" +msgstr "ベラルーシ語" + +msgid "Bengali" +msgstr "ベンガル語" + +msgid "Breton" +msgstr "ブルトン語" + +msgid "Bosnian" +msgstr "ボスニア語" + +msgid "Catalan" +msgstr "カタロニア語" + +msgid "Czech" +msgstr "チェコ語" + +msgid "Welsh" +msgstr "ウェールズ語" + +msgid "Danish" +msgstr "デンマーク語" + +msgid "German" +msgstr "ドイツ語" + +msgid "Lower Sorbian" +msgstr "低地ソルブ語" + +msgid "Greek" +msgstr "ギリシャ語" + +msgid "English" +msgstr "英語(米国)" + +msgid "Australian English" +msgstr "英語(オーストラリア)" + +msgid "British English" +msgstr "英語(英国)" + +msgid "Esperanto" +msgstr "エスペラント語" + +msgid "Spanish" +msgstr "スペイン語" + +msgid "Argentinian Spanish" +msgstr "アルゼンチンスペイン語" + +msgid "Colombian Spanish" +msgstr "コロンビアスペイン語" + +msgid "Mexican Spanish" +msgstr "メキシコスペイン語" + +msgid "Nicaraguan Spanish" +msgstr "ニカラグアスペイン語" + +msgid "Venezuelan Spanish" +msgstr "ベネズエラスペイン語" + +msgid "Estonian" +msgstr "エストニア語" + +msgid "Basque" +msgstr "バスク語" + +msgid "Persian" +msgstr "ペルシア語" + +msgid "Finnish" +msgstr "フィンランド語" + +msgid "French" +msgstr "フランス語" + +msgid "Frisian" +msgstr "フリジア語" + +msgid "Irish" +msgstr "アイルランド語" + +msgid "Scottish Gaelic" +msgstr "ゲール語(スコットランド)" + +msgid "Galician" +msgstr "ガリシア語" + +msgid "Hebrew" +msgstr "ヘブライ語" + +msgid "Hindi" +msgstr "ヒンディー語" + +msgid "Croatian" +msgstr "クロアチア語" + +msgid "Upper Sorbian" +msgstr "高地ソルブ語" + +msgid "Hungarian" +msgstr "ハンガリー語" + +msgid "Armenian" +msgstr "アルメニア" + +msgid "Interlingua" +msgstr "インターリングア" + +msgid "Indonesian" +msgstr "インドネシア語" + +msgid "Ido" +msgstr "イド語" + +msgid "Icelandic" +msgstr "アイスランド語" + +msgid "Italian" +msgstr "イタリア語" + +msgid "Japanese" +msgstr "日本語" + +msgid "Georgian" +msgstr "グルジア語" + +msgid "Kabyle" +msgstr "カビル語" + +msgid "Kazakh" +msgstr "カザフ語" + +msgid "Khmer" +msgstr "クメール語" + +msgid "Kannada" +msgstr "カンナダ語" + +msgid "Korean" +msgstr "韓国語" + +msgid "Luxembourgish" +msgstr "ルクセンブルグ語" + +msgid "Lithuanian" +msgstr "リトアニア語" + +msgid "Latvian" +msgstr "ラトビア語" + +msgid "Macedonian" +msgstr "マケドニア語" + +msgid "Malayalam" +msgstr "マラヤーラム語" + +msgid "Mongolian" +msgstr "モンゴル語" + +msgid "Marathi" +msgstr "マラーティー語" + +msgid "Burmese" +msgstr "ビルマ語" + +msgid "Norwegian Bokmål" +msgstr "ノルウェーのブークモール" + +msgid "Nepali" +msgstr "ネパール語" + +msgid "Dutch" +msgstr "オランダ語" + +msgid "Norwegian Nynorsk" +msgstr "ノルウェーのニーノシュク" + +msgid "Ossetic" +msgstr "オセット語" + +msgid "Punjabi" +msgstr "パンジャブ語" + +msgid "Polish" +msgstr "ポーランド語" + +msgid "Portuguese" +msgstr "ポルトガル語" + +msgid "Brazilian Portuguese" +msgstr "ブラジルポルトガル語" + +msgid "Romanian" +msgstr "ルーマニア語" + +msgid "Russian" +msgstr "ロシア語" + +msgid "Slovak" +msgstr "スロバキア語" + +msgid "Slovenian" +msgstr "スロヴェニア語" + +msgid "Albanian" +msgstr "アルバニア語" + +msgid "Serbian" +msgstr "セルビア語" + +msgid "Serbian Latin" +msgstr "セルビア語ラテン文字" + +msgid "Swedish" +msgstr "スウェーデン語" + +msgid "Swahili" +msgstr "スワヒリ語" + +msgid "Tamil" +msgstr "タミル語" + +msgid "Telugu" +msgstr "テルグ語" + +msgid "Thai" +msgstr "タイ語" + +msgid "Turkish" +msgstr "トルコ語" + +msgid "Tatar" +msgstr "タタール語" + +msgid "Udmurt" +msgstr "ウドムルト語" + +msgid "Ukrainian" +msgstr "ウクライナ語" + +msgid "Urdu" +msgstr "ウルドゥー語" + +msgid "Vietnamese" +msgstr "ベトナム語" + +msgid "Simplified Chinese" +msgstr "簡体字中国語" + +msgid "Traditional Chinese" +msgstr "繁体字中国語" + +msgid "Messages" +msgstr "メッセージ" + +msgid "Site Maps" +msgstr "サイトマップ" + +msgid "Static Files" +msgstr "静的ファイル" + +msgid "Syndication" +msgstr "シンジケーション" + +msgid "That page number is not an integer" +msgstr "このページ番号は整数ではありません。" + +msgid "That page number is less than 1" +msgstr "ページ番号が 1 よりも小さいです。" + +msgid "That page contains no results" +msgstr "このページには結果が含まれていません。" + +msgid "Enter a valid value." +msgstr "値を正しく入力してください。" + +msgid "Enter a valid URL." +msgstr "URLを正しく入力してください。" + +msgid "Enter a valid integer." +msgstr "整数を正しく入力してください。" + +msgid "Enter a valid email address." +msgstr "有効なメールアドレスを入力してください。" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "スラグには半角の英数字、アンダースコア、ハイフン以外は使用できません。" + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"ユニコード文字、数字、アンダースコアまたはハイフンで構成された、有効なスラグ" +"を入力してください" + +msgid "Enter a valid IPv4 address." +msgstr "有効なIPアドレス (IPv4) を入力してください。" + +msgid "Enter a valid IPv6 address." +msgstr "IPv6の正しいアドレスを入力してください。" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "IPv4またはIPv6の正しいアドレスを入力してください。" + +msgid "Enter only digits separated by commas." +msgstr "カンマ区切りの数字だけを入力してください。" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"この値は %(limit_value)s でなければなりません(実際には %(show_value)s でし" +"た) 。" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "この値は %(limit_value)s 以下でなければなりません。" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "この値は %(limit_value)s 以上でなければなりません。" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"この値が少なくとも %(limit_value)d 文字以上であることを確認してください" +"( %(show_value)d 文字になっています)。" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"この値は %(limit_value)d 文字以下でなければなりません( %(show_value)d 文字に" +"なっています)。" + +msgid "Enter a number." +msgstr "数値を入力してください。" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "この値は合計 %(max)s 桁以内でなければなりません。" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "この値は小数点以下が合計 %(max)s 桁以内でなければなりません。" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "この値は小数点より前が合計 %(max)s 桁以内でなければなりません。" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"ファイル拡張子 '%(extension)s' は許可されていません。許可されている拡張子は " +"'%(allowed_extensions)s' です。" + +msgid "Null characters are not allowed." +msgstr "何か文字を入力してください。" + +msgid "and" +msgstr "と" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "この %(field_labels)s を持った %(model_name)s が既に存在します。" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r は有効な選択肢ではありません。" + +msgid "This field cannot be null." +msgstr "このフィールドには NULL を指定できません。" + +msgid "This field cannot be blank." +msgstr "このフィールドは空ではいけません。" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "この %(field_label)s を持った %(model_name)s が既に存在します。" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(date_field_label)s %(lookup_type)s では %(field_label)s がユニークである必" +"要があります。" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "タイプが %(field_type)s のフィールド" + +msgid "Integer" +msgstr "整数" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' は整数値にしなければなりません。" + +msgid "Big (8 byte) integer" +msgstr "大きな(8バイト)整数" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' は真偽値にしなければなりません。" + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' はTrue、FalseまたはNoneの値でなければなりません。" + +msgid "Boolean (Either True or False)" +msgstr "ブール値 (真: True または偽: False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "文字列 ( %(max_length)s 字まで )" + +msgid "Comma-separated integers" +msgstr "カンマ区切りの整数" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' は無効な日付形式です。YYYY-MM-DD形式にしなければなりません。" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "'%(value)s' は有効な日付形式(YYYY-MM-DD)ですが、日付が不正です。" + +msgid "Date (without time)" +msgstr "日付" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' は無効な形式の値です。 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 形式で" +"なければなりません。" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' は正しい形式(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ])の値ですが、無効" +"な日時です。" + +msgid "Date (with time)" +msgstr "日時" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' は10進浮動小数値にしなければなりません。" + +msgid "Decimal number" +msgstr "10 進数 (小数可)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' は無効な形式の値です。 [DD] [HH:[MM:]]ss[.uuuuuu] 形式でなければ" +"なりません。" + +msgid "Duration" +msgstr "時間差分" + +msgid "Email address" +msgstr "メールアドレス" + +msgid "File path" +msgstr "ファイルの場所" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' は小数値にしなければなりません。" + +msgid "Floating point number" +msgstr "浮動小数点" + +msgid "IPv4 address" +msgstr "IPv4アドレス" + +msgid "IP address" +msgstr "IP アドレス" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' はNone、TrueまたはFalseの値でなければなりません。" + +msgid "Boolean (Either True, False or None)" +msgstr "ブール値 (真: True 、偽: False または None)" + +msgid "Positive integer" +msgstr "正の整数" + +msgid "Positive small integer" +msgstr "小さな正の整数" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "スラグ(%(max_length)s文字以内)" + +msgid "Small integer" +msgstr "小さな整数" + +msgid "Text" +msgstr "テキスト" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' は無効な形式の値です。 HH:MM[:ss[.uuuuuu]] 形式でなければなりませ" +"ん。" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "'%(value)s' は正しい形式(HH:MM[:ss[.uuuuuu]])ですが、無効な時刻です。" + +msgid "Time" +msgstr "時刻" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "生のバイナリデータ" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' は有効なUUIDではありません。" + +msgid "Universally unique identifier" +msgstr "汎用一意識別子" + +msgid "File" +msgstr "ファイル" + +msgid "Image" +msgstr "画像" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(field)s が %(value)r である %(model)s のインスタンスは存在しません。" + +msgid "Foreign Key (type determined by related field)" +msgstr "外部キー(型は関連フィールドによって決まります)" + +msgid "One-to-one relationship" +msgstr "1対1の関連" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s の関連" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s の関連" + +msgid "Many-to-many relationship" +msgstr "多対多の関連" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "このフィールドは必須です。" + +msgid "Enter a whole number." +msgstr "整数を入力してください。" + +msgid "Enter a valid date." +msgstr "日付を正しく入力してください。" + +msgid "Enter a valid time." +msgstr "時間を正しく入力してください。" + +msgid "Enter a valid date/time." +msgstr "日時を正しく入力してください。" + +msgid "Enter a valid duration." +msgstr "時間差分を正しく入力してください。" + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "日数は{min_days}から{max_days}の間でなければなりません。" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"ファイルが取得できませんでした。フォームのencoding typeを確認してください。" + +msgid "No file was submitted." +msgstr "ファイルが送信されていません。" + +msgid "The submitted file is empty." +msgstr "入力されたファイルは空です。" + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"このファイル名は %(max)d 文字以下でなければなりません( %(length)d 文字になっ" +"ています)。" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"ファイルを投稿するか、クリアチェックボックスをチェックするかどちらかを選択し" +"てください。両方とも行ってはいけません。" + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"画像をアップロードしてください。アップロードしたファイルは画像でないか、また" +"は壊れています。" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "正しく選択してください。 %(value)s は候補にありません。" + +msgid "Enter a list of values." +msgstr "リストを入力してください。" + +msgid "Enter a complete value." +msgstr "すべての値を入力してください。" + +msgid "Enter a valid UUID." +msgstr "UUIDを正しく入力してください。" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(隠しフィールド %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "マネジメントフォームのデータが見つからないか、改竄されています。" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "%d 個またはそれより少ないフォームを送信してください。" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "%d 個またはそれより多いフォームを送信してください。" + +msgid "Order" +msgstr "並び変え" + +msgid "Delete" +msgstr "削除" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s の重複したデータを修正してください。" + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s の重複したデータを修正してください。このフィールドはユニークである" +"必要があります。" + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s の重複したデータを修正してください。%(date_field)s %(lookup)s " +"では %(field_name)s がユニークである必要があります。" + +msgid "Please correct the duplicate values below." +msgstr "下記の重複したデータを修正してください。" + +msgid "The inline value did not match the parent instance." +msgstr "インライン値が親のインスタンスに一致しません。" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "正しく選択してください。選択したものは候補にありません。" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" は無効な値です。" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s は%(current_timezone)sのタイムゾーンでは解釈できませんでした。そ" +"れは曖昧であるか、存在しない可能性があります。" + +msgid "Clear" +msgstr "クリア" + +msgid "Currently" +msgstr "現在" + +msgid "Change" +msgstr "変更" + +msgid "Unknown" +msgstr "不明" + +msgid "Yes" +msgstr "はい" + +msgid "No" +msgstr "いいえ" + +msgid "yes,no,maybe" +msgstr "はい,いいえ,たぶん" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d バイト" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "0時" + +msgid "noon" +msgstr "12時" + +msgid "Monday" +msgstr "月曜日" + +msgid "Tuesday" +msgstr "火曜日" + +msgid "Wednesday" +msgstr "水曜日" + +msgid "Thursday" +msgstr "木曜日" + +msgid "Friday" +msgstr "金曜日" + +msgid "Saturday" +msgstr "土曜日" + +msgid "Sunday" +msgstr "日曜日" + +msgid "Mon" +msgstr "月" + +msgid "Tue" +msgstr "火" + +msgid "Wed" +msgstr "水" + +msgid "Thu" +msgstr "木" + +msgid "Fri" +msgstr "金" + +msgid "Sat" +msgstr "土" + +msgid "Sun" +msgstr "日" + +msgid "January" +msgstr "1月" + +msgid "February" +msgstr "2月" + +msgid "March" +msgstr "3月" + +msgid "April" +msgstr "4月" + +msgid "May" +msgstr "5月" + +msgid "June" +msgstr "6月" + +msgid "July" +msgstr "7月" + +msgid "August" +msgstr "8月" + +msgid "September" +msgstr "9月" + +msgid "October" +msgstr "10月" + +msgid "November" +msgstr "11月" + +msgid "December" +msgstr "12月" + +msgid "jan" +msgstr "1月" + +msgid "feb" +msgstr "2月" + +msgid "mar" +msgstr "3月" + +msgid "apr" +msgstr "4月" + +msgid "may" +msgstr "5月" + +msgid "jun" +msgstr "6月" + +msgid "jul" +msgstr "7月" + +msgid "aug" +msgstr "8月" + +msgid "sep" +msgstr "9月" + +msgid "oct" +msgstr "10月" + +msgid "nov" +msgstr "11月" + +msgid "dec" +msgstr "12月" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "1月" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "2月" + +msgctxt "abbrev. month" +msgid "March" +msgstr "3月" + +msgctxt "abbrev. month" +msgid "April" +msgstr "4月" + +msgctxt "abbrev. month" +msgid "May" +msgstr "5月" + +msgctxt "abbrev. month" +msgid "June" +msgstr "6月" + +msgctxt "abbrev. month" +msgid "July" +msgstr "7月" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "8月" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "9月" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "10月" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "11月" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "12月" + +msgctxt "alt. month" +msgid "January" +msgstr "1月" + +msgctxt "alt. month" +msgid "February" +msgstr "2月" + +msgctxt "alt. month" +msgid "March" +msgstr "3月" + +msgctxt "alt. month" +msgid "April" +msgstr "4月" + +msgctxt "alt. month" +msgid "May" +msgstr "5月" + +msgctxt "alt. month" +msgid "June" +msgstr "6月" + +msgctxt "alt. month" +msgid "July" +msgstr "7月" + +msgctxt "alt. month" +msgid "August" +msgstr "8月" + +msgctxt "alt. month" +msgid "September" +msgstr "9月" + +msgctxt "alt. month" +msgid "October" +msgstr "10月" + +msgctxt "alt. month" +msgid "November" +msgstr "11月" + +msgctxt "alt. month" +msgid "December" +msgstr "12月" + +msgid "This is not a valid IPv6 address." +msgstr "これは有効なIPv6アドレスではありません。" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "または" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d 年" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ヶ月" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d 週間" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d 日" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d 時間" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d 分" + +msgid "0 minutes" +msgstr "0 分" + +msgid "Forbidden" +msgstr "アクセス禁止" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF検証に失敗したため、リクエストは中断されました。" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"このメッセージが表示されている理由は、このHTTPSのサイトはウェブブラウザからリ" +"ファラーヘッダが送信されることを必須としていますが、送信されなかったためで" +"す。このヘッダはセキュリティ上の理由(使用中のブラウザが第三者によってハイ" +"ジャックされていないことを確認するため)で必要です。" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"もしブラウザのリファラーヘッダを無効に設定しているならば、HTTPS接続やsame-" +"originリクエストのために、少なくともこのサイトでは再度有効にしてください。" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"もし タグを使用しているか " +"'Referrer-Policy: no-referrer' ヘッダーを含んでいる場合は、削除してください。" +"CSRFプロテクションは、厳密に referer をチェックするために 'Referer' ヘッダー" +"が必要です。プライバシーについて心配がある場合は、" +"等を用いて、外部のサイトにリンクしてください。" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"このメッセージが表示されている理由は、このサイトはフォーム送信時にCSRFクッ" +"キーを必須としているためです。このクッキーはセキュリティ上の理由(使用中のブラ" +"ウザが第三者によってハイジャックされていないことを確認するため)で必要です。" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"もしブラウザのクッキーを無効に設定しているならば、same-originリクエストのため" +"に少なくともこのサイトでは再度有効にしてください。" + +msgid "More information is available with DEBUG=True." +msgstr "詳細な情報は DEBUG=True を設定すると利用できます。" + +msgid "No year specified" +msgstr "年が未指定です" + +msgid "Date out of range" +msgstr "日付が有効範囲外です" + +msgid "No month specified" +msgstr "月が未指定です" + +msgid "No day specified" +msgstr "日が未指定です" + +msgid "No week specified" +msgstr "週が未指定です" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s は利用できません" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(class_name)s.allow_futureがFalseであるため、未来の%(verbose_name_plural)sは" +"利用できません。" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "指定された形式 '%(format)s' では '%(datestr)s' は無効な日付文字列です" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "クエリーに一致する %(verbose_name)s は見つかりませんでした" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "ページは数値に変換できる値、または 'last' ではありません。" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "無効なページです (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "空の一覧かつ '%(class_name)s.allow_empty' がFalseです。" + +msgid "Directory indexes are not allowed here." +msgstr "ここではディレクトリインデックスが許可されていません。" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" が存在しません。" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)sのディレクトリインデックス" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: 納期を逃さない完璧主義者のためのWebフレームワーク" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django%(version)sのリリースノートを見る。" + +msgid "The install worked successfully! Congratulations!" +msgstr "インストールは成功しました!おめでとうございます!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"このページは、設定ファイルでDEBUG=Trueが指定され、何もURLが設定されていない時に表示されます。" + +msgid "Django Documentation" +msgstr "Django ドキュメント" + +msgid "Topics, references, & how-to's" +msgstr "トピック、リファレンス、ハウツー" + +msgid "Tutorial: A Polling App" +msgstr "チュートリアル: 投票アプリケーション" + +msgid "Get started with Django" +msgstr "Djangoを始めよう" + +msgid "Django Community" +msgstr "Djangoのコミュニティ" + +msgid "Connect, get help, or contribute" +msgstr "つながり、助け合い、貢献しよう" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ja/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/ja/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..7e27909 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,1248 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013-2015 +# David A. , 2019 +# David A. , 2011 +# Jannis Leidel , 2011 +# Tornike Beradze , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-25 09:06+0000\n" +"Last-Translator: David A. \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Afrikaans" +msgstr "აფრიკაანსი" + +msgid "Arabic" +msgstr "არაბული" + +msgid "Asturian" +msgstr "ასტურიული" + +msgid "Azerbaijani" +msgstr "აზერბაიჯანული" + +msgid "Bulgarian" +msgstr "ბულგარული" + +msgid "Belarusian" +msgstr "ბელარუსული" + +msgid "Bengali" +msgstr "ბენგალიური" + +msgid "Breton" +msgstr "ბრეტონული" + +msgid "Bosnian" +msgstr "ბოსნიური" + +msgid "Catalan" +msgstr "კატალანური" + +msgid "Czech" +msgstr "ჩეხური" + +msgid "Welsh" +msgstr "უელსური" + +msgid "Danish" +msgstr "დანიური" + +msgid "German" +msgstr "გერმანული" + +msgid "Lower Sorbian" +msgstr "ქვემო სორბული" + +msgid "Greek" +msgstr "ბერძნული" + +msgid "English" +msgstr "ინგლისური" + +msgid "Australian English" +msgstr "ავსტრალიური ინგლისური" + +msgid "British English" +msgstr "ბრიტანეთის ინგლისური" + +msgid "Esperanto" +msgstr "ესპერანტო" + +msgid "Spanish" +msgstr "ესპანური" + +msgid "Argentinian Spanish" +msgstr "არგენტინის ესპანური" + +msgid "Colombian Spanish" +msgstr "კოლუმბიური ესპანური" + +msgid "Mexican Spanish" +msgstr "მექსიკური ესპანური" + +msgid "Nicaraguan Spanish" +msgstr "ნიკარაგუული ესპანური" + +msgid "Venezuelan Spanish" +msgstr "ვენესუელის ესპანური" + +msgid "Estonian" +msgstr "ესტონური" + +msgid "Basque" +msgstr "ბასკური" + +msgid "Persian" +msgstr "სპარსული" + +msgid "Finnish" +msgstr "ფინური" + +msgid "French" +msgstr "ფრანგული" + +msgid "Frisian" +msgstr "ფრისიული" + +msgid "Irish" +msgstr "ირლანდიური" + +msgid "Scottish Gaelic" +msgstr "შოტლანდიური-გელური" + +msgid "Galician" +msgstr "გალიციური" + +msgid "Hebrew" +msgstr "ებრაული" + +msgid "Hindi" +msgstr "ჰინდი" + +msgid "Croatian" +msgstr "ხორვატიული" + +msgid "Upper Sorbian" +msgstr "ზემო სორბიული" + +msgid "Hungarian" +msgstr "უნგრული" + +msgid "Armenian" +msgstr "სომხური" + +msgid "Interlingua" +msgstr "ინტერლინგუა" + +msgid "Indonesian" +msgstr "ინდონეზიური" + +msgid "Ido" +msgstr "იდო" + +msgid "Icelandic" +msgstr "ისლანდიური" + +msgid "Italian" +msgstr "იტალიური" + +msgid "Japanese" +msgstr "იაპონური" + +msgid "Georgian" +msgstr "ქართული" + +msgid "Kabyle" +msgstr "კაბილური" + +msgid "Kazakh" +msgstr "ყაზახური" + +msgid "Khmer" +msgstr "ხმერული" + +msgid "Kannada" +msgstr "კანნადა" + +msgid "Korean" +msgstr "კორეული" + +msgid "Luxembourgish" +msgstr "ლუქსემბურგული" + +msgid "Lithuanian" +msgstr "ლიტვური" + +msgid "Latvian" +msgstr "ლატვიური" + +msgid "Macedonian" +msgstr "მაკედონიური" + +msgid "Malayalam" +msgstr "მალაიზიური" + +msgid "Mongolian" +msgstr "მონღოლური" + +msgid "Marathi" +msgstr "მარათული" + +msgid "Burmese" +msgstr "ბირმული" + +msgid "Norwegian Bokmål" +msgstr "ნორვეგიული Bokmål" + +msgid "Nepali" +msgstr "ნეპალური" + +msgid "Dutch" +msgstr "ჰოლანდიური" + +msgid "Norwegian Nynorsk" +msgstr "ნორვეგიული-ნინორსკი" + +msgid "Ossetic" +msgstr "ოსური" + +msgid "Punjabi" +msgstr "პუნჯაბი" + +msgid "Polish" +msgstr "პოლონური" + +msgid "Portuguese" +msgstr "პორტუგალიური" + +msgid "Brazilian Portuguese" +msgstr "ბრაზილიური პორტუგალიური" + +msgid "Romanian" +msgstr "რუმინული" + +msgid "Russian" +msgstr "რუსული" + +msgid "Slovak" +msgstr "სლოვაკური" + +msgid "Slovenian" +msgstr "სლოვენიური" + +msgid "Albanian" +msgstr "ალბანური" + +msgid "Serbian" +msgstr "სერბული" + +msgid "Serbian Latin" +msgstr "სერბული (ლათინური)" + +msgid "Swedish" +msgstr "შვედური" + +msgid "Swahili" +msgstr "სუაჰილი" + +msgid "Tamil" +msgstr "თამილური" + +msgid "Telugu" +msgstr "ტელუგუ" + +msgid "Thai" +msgstr "ტაი" + +msgid "Turkish" +msgstr "თურქული" + +msgid "Tatar" +msgstr "თათრული" + +msgid "Udmurt" +msgstr "უდმურტული" + +msgid "Ukrainian" +msgstr "უკრაინული" + +msgid "Urdu" +msgstr "ურდუ" + +msgid "Vietnamese" +msgstr "ვიეტნამური" + +msgid "Simplified Chinese" +msgstr "გამარტივებული ჩინური" + +msgid "Traditional Chinese" +msgstr "ტრადიციული ჩინური" + +msgid "Messages" +msgstr "შეტყობინებები" + +msgid "Site Maps" +msgstr "საიტის რუკები" + +msgid "Static Files" +msgstr "სტატიკური ფაილები" + +msgid "Syndication" +msgstr "სინდიკაცია" + +msgid "That page number is not an integer" +msgstr "გვერდის ნომერი არ არის მთელი რიცხვი" + +msgid "That page number is less than 1" +msgstr "გვერდის ნომერი ნაკლებია 1-ზე" + +msgid "That page contains no results" +msgstr "გვერდი არ შეიცავს მონაცემებს" + +msgid "Enter a valid value." +msgstr "შეიყვანეთ სწორი მნიშვნელობა." + +msgid "Enter a valid URL." +msgstr "შეიყვანეთ სწორი URL." + +msgid "Enter a valid integer." +msgstr "შეიყვანეთ სწორი მთელი რიცხვი." + +msgid "Enter a valid email address." +msgstr "შეიყვანეთ მართებული ელფოსტის მისამართი." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"შეიყვანეთ სწორი 'slug'-მნიშვნელობა, რომელიც შეიცავს მხოლოდ ასოებს, ციფრებს, " +"ხაზგასმის ნიშნებს და დეფისებს." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"შეიყვანეთ სწორი 'slug' მნიშვნელობა, რომელიც უნდა შეიცავდეს Unicode ასოებს, " +"ციფრებს, ხაზგასმის ნიშნებს, ან დეფისებს." + +msgid "Enter a valid IPv4 address." +msgstr "შეიყვანეთ სწორი IPv4 მისამართი." + +msgid "Enter a valid IPv6 address." +msgstr "შეიყვანეთ მართებული IPv6 მისამართი." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "შეიყვანეთ მართებული IPv4 ან IPv6 მისამართი." + +msgid "Enter only digits separated by commas." +msgstr "შეიყვანეთ მხოლოდ მძიმეებით გამოყოფილი ციფრები." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s (იგი არის %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე ნაკლები ან ტოლი." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "მნიშვნელობა უნდა იყოს %(limit_value)s-ზე მეტი ან ტოლი." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " +"%(show_value)d)." +msgstr[1] "" +"მნიშვნელობას უნდა ჰქონდეს სულ ცოტა %(limit_value)d სიმბოლო (მას აქვს " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " +"%(show_value)d)." +msgstr[1] "" +"მნიშვნელობას უნდა ჰქონდეს არაუმეტეს %(limit_value)d სიმბოლოსი (მას აქვს " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "შეიყვანეთ რიცხვი." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." +msgstr[1] "ციფრების სრული რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." +msgstr[1] "" +"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"ათობითი გამყოფის შემდეგ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." +msgstr[1] "" +"ათობითი გამყოფის წინ ციფრების რაოდენობა %(max)s-ს არ უნდა აღემატებოდეს." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"ფაილის გაფართოება \"%(extension)s\" დაუშვებელია. დასაშვები გაფართოებებია: " +"\"%(allowed_extensions)s\"." + +msgid "Null characters are not allowed." +msgstr "Null მნიშვნელობები დაუშვებელია." + +msgid "and" +msgstr "და" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s ამ %(field_labels)s-ით უკვე არსებობს." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "მნიშვნელობა %(value)r არ არის დასაშვები." + +msgid "This field cannot be null." +msgstr "ეს ველი არ შეიძლება იყოს null." + +msgid "This field cannot be blank." +msgstr "ეს ველი არ შეიძლება იყოს ცარიელი." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s მოცემული %(field_label)s-ით უკვე არსებობს." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s უნდა იყოს უნიკალური %(date_field_label)s %(lookup_type)s-" +"სთვის." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "ველის ტიპი: %(field_type)s" + +msgid "Integer" +msgstr "მთელი" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "მნიშვნელობა '%(value)s' უნდა იყოს მთელი რიცხვი." + +msgid "Big (8 byte) integer" +msgstr "დიდი მთელი (8-ბაიტიანი)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "მნიშვნელობა '%(value)s' უნდა იყოს True ან False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "\"%(value)s\"-ის მნიშვნელობა შეიძლება იყოს True, False ან None." + +msgid "Boolean (Either True or False)" +msgstr "ლოგიკური (True ან False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "სტრიქონი (%(max_length)s სიმბოლომდე)" + +msgid "Comma-separated integers" +msgstr "მძიმით გამოყოფილი მთელი რიცხვები" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' მნიშვნელობას აქვს არასწორი თარიღის ფორმატი. ის უნდა იყოს YYYY-MM-" +"DD ფორმატში." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' მნიშვნელობას აქვს სწორი ფორმატი (YYYY-MM-DD), მაგრამ ის არასწორი " +"თარიღია." + +msgid "Date (without time)" +msgstr "თარიღი (დროის გარეშე)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' მნიშვნელობას აქვს არასწორი ფორმატი. ის უნდა იყოს YYYY-MM-DD HH:" +"MM[:ss[.uuuuuu]][TZ] ფორმატში." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' მნიშვნელობას აქვს სწორი ფორმატი (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), მაგრამ ის არასწორი თარიღი/დრო-ა." + +msgid "Date (with time)" +msgstr "თარიღი (დროსთან ერთად)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "მნიშვნელობა '%(value)s' უნდა იყოს ათობითი რიცხვი." + +msgid "Decimal number" +msgstr "ათობითი რიცხვი" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' არასწორი ფორმატი აქვს. ის უნდა იყოს [DD] [HH:[MM:]]ss[.uuuuuu] " +"ფორმატში." + +msgid "Duration" +msgstr "ხანგრზლივობა" + +msgid "Email address" +msgstr "ელ. ფოსტის მისამართი" + +msgid "File path" +msgstr "გზა ფაილისაკენ" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "\"%(value)s\"-ის მნიშვნელობა უნდა იყოს float ტიპის." + +msgid "Floating point number" +msgstr "რიცხვი მცოცავი წერტილით" + +msgid "IPv4 address" +msgstr "IPv4 მისამართი" + +msgid "IP address" +msgstr "IP-მისამართი" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "მნიშვნელობა '%(value)s' უნდა იყოს None, True ან False." + +msgid "Boolean (Either True, False or None)" +msgstr "ლოგიკური (True, False ან None)" + +msgid "Positive integer" +msgstr "დადებითი მთელი რიცხვი" + +msgid "Positive small integer" +msgstr "დადებითი პატარა მთელი რიცხვი" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "სლაგი (%(max_length)s-მდე)" + +msgid "Small integer" +msgstr "პატარა მთელი რიცხვი" + +msgid "Text" +msgstr "ტექსტი" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"\"%(value)s\" მნიშვნელობას აქვს არასწორი ფორმატი. უნდა იყოს HH:MM[:ss[." +"uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"\"%(value)s\"-ს აქვს სწორი ფორმატი (HH:MM[:ss[.uuuuuu]]), მაგრამ დროის " +"მნიშვნელობა არასწორია." + +msgid "Time" +msgstr "დრო" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "დაუმუშავებელი ორობითი მონაცემები" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "\"%(value)s\"-ს აქვს დაუშვებელი UUID-ის მნიშვნელობა." + +msgid "Universally unique identifier" +msgstr "უნივერსალური უნიკალური იდენტიფიკატორი." + +msgid "File" +msgstr "ფაილი" + +msgid "Image" +msgstr "გამოსახულება" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "გარე გასაღები (ტიპი განისაზღვრება დაკავშირებული ველის ტიპით)" + +msgid "One-to-one relationship" +msgstr "კავშირი ერთი-ერთტან" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "კავშირი მრავალი-მრავალთან" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "ეს ველი აუცილებელია." + +msgid "Enter a whole number." +msgstr "შეიყვანეთ მთელი რიცხვი" + +msgid "Enter a valid date." +msgstr "შეიყვანეთ სწორი თარიღი." + +msgid "Enter a valid time." +msgstr "შეიყვანეთ სწორი დრო." + +msgid "Enter a valid date/time." +msgstr "შეიყვანეთ სწორი თარიღი და დრო." + +msgid "Enter a valid duration." +msgstr "შეიყვანეთ სწორი დროის პერიოდი." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"ფაილი არ იყო გამოგზავნილი. შეამოწმეთ კოდირების ტიპი მოცემული ფორმისათვის." + +msgid "No file was submitted." +msgstr "ფაილი არ იყო გამოგზავნილი." + +msgid "The submitted file is empty." +msgstr "გამოგზავნილი ფაილი ცარიელია." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "ან გამოგზავნეთ ფაილი, ან მონიშნეთ \"წაშლის\" დროშა." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"ატვირთეთ დასაშვები გამოსახულება. თქვენს მიერ გამოგზავნილი ფაილი ან არ არის " +"გამოსახულება, ან დაზიანებულია." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "აირჩიეთ დასაშვები მნიშვნელობა. %(value)s დასაშვები არ არის." + +msgid "Enter a list of values." +msgstr "შეიყვანეთ მნიშვნელობების სია." + +msgid "Enter a complete value." +msgstr "შეიყვანეთ სრული მნიშვნელობა." + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(დამალული ველი %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "დალაგება" + +msgid "Delete" +msgstr "წავშალოთ" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "გთხოვთ, შეასწოროთ დუბლირებული მონაცემები %(field)s-თვის." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field)s ველისთვის, რომელიც უნდა " +"იყოს უნიკალური." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობა %(field_name)s ველისთვის, რომელიც " +"უნდა იყოს უნიკალური %(lookup)s-ზე, %(date_field)s-თვის." + +msgid "Please correct the duplicate values below." +msgstr "გთხოვთ, შეასწოროთ დუბლირებული მნიშვნელობები." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "აირჩიეთ დასაშვები მნიშვნელობა. ეს არჩევანი დასაშვები არ არის." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "წაშლა" + +msgid "Currently" +msgstr "ამჟამად" + +msgid "Change" +msgstr "შეცვლა" + +msgid "Unknown" +msgstr "გაურკვეველი" + +msgid "Yes" +msgstr "კი" + +msgid "No" +msgstr "არა" + +msgid "yes,no,maybe" +msgstr "კი,არა,შესაძლოა" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d ბაიტი" +msgstr[1] "%(size)d ბაიტი" + +#, python-format +msgid "%s KB" +msgstr "%s კბ" + +#, python-format +msgid "%s MB" +msgstr "%s მბ" + +#, python-format +msgid "%s GB" +msgstr "%s გბ" + +#, python-format +msgid "%s TB" +msgstr "%s ტბ" + +#, python-format +msgid "%s PB" +msgstr "%s პბ" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "შუაღამე" + +msgid "noon" +msgstr "შუადღე" + +msgid "Monday" +msgstr "ორშაბათი" + +msgid "Tuesday" +msgstr "სამშაბათი" + +msgid "Wednesday" +msgstr "ოთხშაბათი" + +msgid "Thursday" +msgstr "ხუთშაბათი" + +msgid "Friday" +msgstr "პარასკევი" + +msgid "Saturday" +msgstr "შაბათი" + +msgid "Sunday" +msgstr "კვირა" + +msgid "Mon" +msgstr "ორშ" + +msgid "Tue" +msgstr "სამ" + +msgid "Wed" +msgstr "ოთხ" + +msgid "Thu" +msgstr "ხუთ" + +msgid "Fri" +msgstr "პარ" + +msgid "Sat" +msgstr "შაბ" + +msgid "Sun" +msgstr "კვრ" + +msgid "January" +msgstr "იანვარი" + +msgid "February" +msgstr "თებერვალი" + +msgid "March" +msgstr "მარტი" + +msgid "April" +msgstr "აპრილი" + +msgid "May" +msgstr "მაისი" + +msgid "June" +msgstr "ივნისი" + +msgid "July" +msgstr "ივლისი" + +msgid "August" +msgstr "აგვისტო" + +msgid "September" +msgstr "სექტემბერი" + +msgid "October" +msgstr "ოქტომბერი" + +msgid "November" +msgstr "ნოემბერი" + +msgid "December" +msgstr "დეკემბერი" + +msgid "jan" +msgstr "იან" + +msgid "feb" +msgstr "თებ" + +msgid "mar" +msgstr "მარ" + +msgid "apr" +msgstr "აპრ" + +msgid "may" +msgstr "მაი" + +msgid "jun" +msgstr "ივნ" + +msgid "jul" +msgstr "ივლ" + +msgid "aug" +msgstr "აგვ" + +msgid "sep" +msgstr "სექ" + +msgid "oct" +msgstr "ოქტ" + +msgid "nov" +msgstr "ნოე" + +msgid "dec" +msgstr "დეკ" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "იან." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "თებ." + +msgctxt "abbrev. month" +msgid "March" +msgstr "მარ." + +msgctxt "abbrev. month" +msgid "April" +msgstr "აპრ." + +msgctxt "abbrev. month" +msgid "May" +msgstr "მაი" + +msgctxt "abbrev. month" +msgid "June" +msgstr "ივნ." + +msgctxt "abbrev. month" +msgid "July" +msgstr "ივლ." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "აგვ." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "სექტ." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "ოქტ." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "ნოემ." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "დეკ." + +msgctxt "alt. month" +msgid "January" +msgstr "იანვარი" + +msgctxt "alt. month" +msgid "February" +msgstr "თებერვალი" + +msgctxt "alt. month" +msgid "March" +msgstr "მარტი" + +msgctxt "alt. month" +msgid "April" +msgstr "აპრილი" + +msgctxt "alt. month" +msgid "May" +msgstr "მაისი" + +msgctxt "alt. month" +msgid "June" +msgstr "ივნისი" + +msgctxt "alt. month" +msgid "July" +msgstr "ივლისი" + +msgctxt "alt. month" +msgid "August" +msgstr "აგვისტო" + +msgctxt "alt. month" +msgid "September" +msgstr "სექტემბერი" + +msgctxt "alt. month" +msgid "October" +msgstr "ოქტომბერი" + +msgctxt "alt. month" +msgid "November" +msgstr "ნოემბერი" + +msgctxt "alt. month" +msgid "December" +msgstr "დეკემბერი" + +msgid "This is not a valid IPv6 address." +msgstr "ეს არ არის სწორი IPv6 მისამართი." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "ან" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d წელი" +msgstr[1] "%d წელი" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d თვე" +msgstr[1] "%d თვე" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d კვირა" +msgstr[1] "%d კვირა" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d დღე" +msgstr[1] "%d დღე" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d საათი" +msgstr[1] "%d საათი" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d წუთი" +msgstr[1] "%d წუთი" + +msgid "0 minutes" +msgstr "0 წუთი" + +msgid "Forbidden" +msgstr "აკრძალული" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "მეტი ინფორმაცია მისაწვდომია DEBUG=True-ს მეშვეობით." + +msgid "No year specified" +msgstr "არ არის მითითებული წელი" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "არ არის მითითებული თვე" + +msgid "No day specified" +msgstr "არ არის მითითებული დღე" + +msgid "No week specified" +msgstr "არ არის მითითებული კვირა" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s არ არსებობს" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"მომავალი %(verbose_name_plural)s არ არსებობს იმიტომ, რომ %(class_name)s." +"allow_future არის False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"არასწორი თარიღის სტრიქონი '%(datestr)s' გამომდინარე ფორმატიდან '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "არ მოიძებნა არცერთი მოთხოვნის თანმხვედრი %(verbose_name)s" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "ცარიელი სია და '%(class_name)s.allow_empty' არის False." + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" არ არსებობს" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s-ის იდექსი" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..f21e906 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,1182 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" +"kab/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kab\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Tafrikanst" + +msgid "Arabic" +msgstr "Taɛṛabt" + +msgid "Asturian" +msgstr "Tasturyant" + +msgid "Azerbaijani" +msgstr "Tazeṛbayǧant" + +msgid "Bulgarian" +msgstr "Tabulgarit" + +msgid "Belarusian" +msgstr "Tabilurusit" + +msgid "Bengali" +msgstr "Tabelgalit" + +msgid "Breton" +msgstr "Tabrutunt" + +msgid "Bosnian" +msgstr "Tabusnit" + +msgid "Catalan" +msgstr "Takaṭalant" + +msgid "Czech" +msgstr "Tačikit" + +msgid "Welsh" +msgstr "Takusit" + +msgid "Danish" +msgstr "Tadanit" + +msgid "German" +msgstr "Talmanit" + +msgid "Lower Sorbian" +msgstr "Tasiṛbit n wadda" + +msgid "Greek" +msgstr "Tagrigit" + +msgid "English" +msgstr "Taglizit" + +msgid "Australian English" +msgstr "Taglizit n Ustralya" + +msgid "British English" +msgstr "Taglizit (UK)" + +msgid "Esperanto" +msgstr "Taspirantit" + +msgid "Spanish" +msgstr "Taspanit" + +msgid "Argentinian Spanish" +msgstr "Taspanit n Arjuntin" + +msgid "Colombian Spanish" +msgstr "Taspanit n Kulumbya" + +msgid "Mexican Spanish" +msgstr "Taspanit n Miksik" + +msgid "Nicaraguan Spanish" +msgstr "Taspanit n Nikaragwa" + +msgid "Venezuelan Spanish" +msgstr "Taspanit n Vinizwila" + +msgid "Estonian" +msgstr "Tastunit" + +msgid "Basque" +msgstr "Tabaskit" + +msgid "Persian" +msgstr "Tafarsit" + +msgid "Finnish" +msgstr "Tafinit" + +msgid "French" +msgstr "Tafṛansist" + +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Hebrew" +msgstr "" + +msgid "Hindi" +msgstr "Tahendit" + +msgid "Croatian" +msgstr "Takarwasit" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Tahungarit" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Tandunizit" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Taslandit" + +msgid "Italian" +msgstr "Taṭelyanit" + +msgid "Japanese" +msgstr "" + +msgid "Georgian" +msgstr "Tajyuṛjit" + +msgid "Kazakh" +msgstr "Takazaxt" + +msgid "Khmer" +msgstr "" + +msgid "Kannada" +msgstr "Takannadat" + +msgid "Korean" +msgstr "Takurit" + +msgid "Luxembourgish" +msgstr "" + +msgid "Lithuanian" +msgstr "Talitwanit" + +msgid "Latvian" +msgstr "Talitunit" + +msgid "Macedonian" +msgstr "Tamasidunit" + +msgid "Malayalam" +msgstr "Tamayalamt" + +msgid "Mongolian" +msgstr "" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "Tabirmanit" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "Tanipalit" + +msgid "Dutch" +msgstr "Tahulandit" + +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Tabenjabit" + +msgid "Polish" +msgstr "Tapulandit" + +msgid "Portuguese" +msgstr "Tapurtugit" + +msgid "Brazilian Portuguese" +msgstr "" + +msgid "Romanian" +msgstr "Tarumanit" + +msgid "Russian" +msgstr "Tarusit" + +msgid "Slovak" +msgstr "Tasluvakt" + +msgid "Slovenian" +msgstr "" + +msgid "Albanian" +msgstr "Talbanit" + +msgid "Serbian" +msgstr "Tasiṛbit" + +msgid "Serbian Latin" +msgstr "" + +msgid "Swedish" +msgstr "Taswidit" + +msgid "Swahili" +msgstr "Taswahilit" + +msgid "Tamil" +msgstr "Taṭamult" + +msgid "Telugu" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Turkish" +msgstr "Taṭurkit" + +msgid "Tatar" +msgstr "" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "" + +msgid "Urdu" +msgstr "" + +msgid "Vietnamese" +msgstr "" + +msgid "Simplified Chinese" +msgstr "" + +msgid "Traditional Chinese" +msgstr "" + +msgid "Messages" +msgstr "Iznan" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Sekcem azal ameɣtu." + +msgid "Enter a valid URL." +msgstr "" + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Sekcem tansa imayl tameɣtut." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Sekcem tansa IPv4 tameɣtut." + +msgid "Enter a valid IPv6 address." +msgstr "" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +msgid "Enter only digits separated by commas." +msgstr "" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "akked" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "" + +msgid "This field cannot be blank." +msgstr "" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +msgid "Integer" +msgstr "Ummid" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +msgid "Comma-separated integers" +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Azemz (s wakud)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "Tanzagt" + +msgid "Email address" +msgstr "Tansa email" + +msgid "File path" +msgstr "Abrid n ufaylu" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "" + +msgid "IPv4 address" +msgstr "" + +msgid "IP address" +msgstr "Tansa IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "" + +msgid "Positive integer" +msgstr "" + +msgid "Positive small integer" +msgstr "" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +msgid "Small integer" +msgstr "" + +msgid "Text" +msgstr "Aḍris" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Akud" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Afaylu" + +msgid "Image" +msgstr "Tugna" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "" + +msgid "One-to-one relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "" + +msgid "Enter a whole number." +msgstr "Sekcem amḍan ummid." + +msgid "Enter a number." +msgstr "Sekcem amḍan." + +msgid "Enter a valid date." +msgstr "" + +msgid "Enter a valid time." +msgstr "" + +msgid "Enter a valid date/time." +msgstr "" + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +msgid "No file was submitted." +msgstr "Afaylu ur yettwazen ara." + +msgid "The submitted file is empty." +msgstr "" + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +msgid "Enter a list of values." +msgstr "" + +msgid "Enter a complete value." +msgstr "Sekcem azal ummid." + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Amizwer" + +msgid "Delete" +msgstr "KKES" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +msgid "Please correct the duplicate values below." +msgstr "" + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "Sfeḍ" + +msgid "Currently" +msgstr "Tura" + +msgid "Change" +msgstr "Beddel" + +msgid "Unknown" +msgstr "Arussin" + +msgid "Yes" +msgstr "Ih" + +msgid "No" +msgstr "Uhu" + +msgid "yes,no,maybe" +msgstr "" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%s KB" +msgstr "%s KAṬ" + +#, python-format +msgid "%s MB" +msgstr "%s MAṬ" + +#, python-format +msgid "%s GB" +msgstr "%s GAṬ" + +#, python-format +msgid "%s TB" +msgstr "%s TAṬ" + +#, python-format +msgid "%s PB" +msgstr "%s PAṬ" + +msgid "p.m." +msgstr "m.d." + +msgid "a.m." +msgstr "f.t." + +msgid "PM" +msgstr "MD" + +msgid "AM" +msgstr "FT" + +msgid "midnight" +msgstr "ttnaṣfa n yiḍ" + +msgid "noon" +msgstr "ttnaṣfa n uzal" + +msgid "Monday" +msgstr "Arim" + +msgid "Tuesday" +msgstr "Aram" + +msgid "Wednesday" +msgstr "Ahad" + +msgid "Thursday" +msgstr "Amhad" + +msgid "Friday" +msgstr "Sem" + +msgid "Saturday" +msgstr "Sed" + +msgid "Sunday" +msgstr "Acer" + +msgid "Mon" +msgstr "Ari" + +msgid "Tue" +msgstr "Ara" + +msgid "Wed" +msgstr "Aha" + +msgid "Thu" +msgstr "Amh" + +msgid "Fri" +msgstr "Sem" + +msgid "Sat" +msgstr "Sed" + +msgid "Sun" +msgstr "Ace" + +msgid "January" +msgstr "Yennayer" + +msgid "February" +msgstr "Fuṛaṛ" + +msgid "March" +msgstr "Meɣres" + +msgid "April" +msgstr "Yebrir" + +msgid "May" +msgstr "Mayyu" + +msgid "June" +msgstr "Yunyu" + +msgid "July" +msgstr "Yulyu" + +msgid "August" +msgstr "Ɣuct" + +msgid "September" +msgstr "Ctamber" + +msgid "October" +msgstr "Tuber" + +msgid "November" +msgstr "Wamber" + +msgid "December" +msgstr "Dujamber" + +msgid "jan" +msgstr "yen" + +msgid "feb" +msgstr "fuṛ" + +msgid "mar" +msgstr "meɣ" + +msgid "apr" +msgstr "yeb" + +msgid "may" +msgstr "may" + +msgid "jun" +msgstr "yun" + +msgid "jul" +msgstr "yul" + +msgid "aug" +msgstr "ɣuc" + +msgid "sep" +msgstr "cte" + +msgid "oct" +msgstr "tub" + +msgid "nov" +msgstr "wam" + +msgid "dec" +msgstr "duj" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Yen." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Fuṛ." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Meɣres" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Yebrir" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mayyu" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Yunyu" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Yulyu" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ɣuc." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Tub." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Wam." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Duj." + +msgctxt "alt. month" +msgid "January" +msgstr "Yennayer" + +msgctxt "alt. month" +msgid "February" +msgstr "Fuṛaṛ" + +msgctxt "alt. month" +msgid "March" +msgstr "Meɣres" + +msgctxt "alt. month" +msgid "April" +msgstr "Yebrir" + +msgctxt "alt. month" +msgid "May" +msgstr "Mayyu" + +msgctxt "alt. month" +msgid "June" +msgstr "Yunyu" + +msgctxt "alt. month" +msgid "July" +msgstr "Yulyu" + +msgctxt "alt. month" +msgid "August" +msgstr "Ɣuct" + +msgctxt "alt. month" +msgid "September" +msgstr "Ctamber" + +msgctxt "alt. month" +msgid "October" +msgstr "Tuber" + +msgctxt "alt. month" +msgid "November" +msgstr "Wamber" + +msgctxt "alt. month" +msgid "December" +msgstr "Dujamber" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "" + +msgid "or" +msgstr "neɣ" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "0 n tisdatin" + +msgid "Forbidden" +msgstr "Yegdel" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "" + +msgid "No day specified" +msgstr "" + +msgid "No week specified" +msgstr "" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "Bdu s Django" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0c426b6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po new file mode 100644 index 0000000..01e7bb7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/kk/LC_MESSAGES/django.po @@ -0,0 +1,1213 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Baurzhan Muftakhidinov , 2015 +# Zharzhan Kulmyrza , 2011 +# Leo Trubach , 2017 +# Nurlan Rakhimzhanov , 2011 +# yun_man_ger , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:44+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kk\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "Араб" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Әзірбайжан" + +msgid "Bulgarian" +msgstr "Болгар" + +msgid "Belarusian" +msgstr "" + +msgid "Bengali" +msgstr "Бенгал" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "Босния" + +msgid "Catalan" +msgstr "Каталан" + +msgid "Czech" +msgstr "Чех" + +msgid "Welsh" +msgstr "Валлий" + +msgid "Danish" +msgstr "Дания" + +msgid "German" +msgstr "Неміс" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Грек" + +msgid "English" +msgstr "Ағылшын" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Британдық ағылшын" + +msgid "Esperanto" +msgstr "" + +msgid "Spanish" +msgstr "Испан" + +msgid "Argentinian Spanish" +msgstr "Аргентиналық испан" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Мексикалық испан" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуа испан" + +msgid "Venezuelan Spanish" +msgstr "" + +msgid "Estonian" +msgstr "Эстон" + +msgid "Basque" +msgstr "Баск" + +msgid "Persian" +msgstr "Парсы" + +msgid "Finnish" +msgstr "Фин" + +msgid "French" +msgstr "Француз" + +msgid "Frisian" +msgstr "Фриз" + +msgid "Irish" +msgstr "Ирландия" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Галиц" + +msgid "Hebrew" +msgstr "Иврит" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Кроат" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Венгрия" + +msgid "Armenian" +msgstr "" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Индонезия" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Исладия" + +msgid "Italian" +msgstr "Итальян" + +msgid "Japanese" +msgstr "Жапон" + +msgid "Georgian" +msgstr "Грузин" + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "Қазақша" + +msgid "Khmer" +msgstr "Кхмер" + +msgid "Kannada" +msgstr "Канада" + +msgid "Korean" +msgstr "Корей" + +msgid "Luxembourgish" +msgstr "" + +msgid "Lithuanian" +msgstr "Литва" + +msgid "Latvian" +msgstr "Латвия" + +msgid "Macedonian" +msgstr "Македон" + +msgid "Malayalam" +msgstr "Малаялам" + +msgid "Mongolian" +msgstr "Монғол" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Dutch" +msgstr "Голланд" + +msgid "Norwegian Nynorsk" +msgstr "Норвегиялық нюнор" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Пенджаб" + +msgid "Polish" +msgstr "Поляк" + +msgid "Portuguese" +msgstr "Португал" + +msgid "Brazilian Portuguese" +msgstr "Бразилиялық португал" + +msgid "Romanian" +msgstr "Роман" + +msgid "Russian" +msgstr "Орыс" + +msgid "Slovak" +msgstr "Словак" + +msgid "Slovenian" +msgstr "Словениялық" + +msgid "Albanian" +msgstr "Албан" + +msgid "Serbian" +msgstr "Серб" + +msgid "Serbian Latin" +msgstr "Сербиялық латын" + +msgid "Swedish" +msgstr "Швед" + +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "Тамиль" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Thai" +msgstr "Тай" + +msgid "Turkish" +msgstr "Түрік" + +msgid "Tatar" +msgstr "" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "Украин" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнам" + +msgid "Simplified Chinese" +msgstr "Жеңілдетілген қытай" + +msgid "Traditional Chinese" +msgstr "Дәстүрлі қытай" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Тура мәнін енгізіңіз." + +msgid "Enter a valid URL." +msgstr "Тура URL-ді енгізіңіз." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Тек әріптерден, сандардан, астыңғы сызықтардан немесе дефистерден құралатын " +"тура 'slug'-ті енгізіңіз." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Тура IPv4 адресті енгізіңіз." + +msgid "Enter a valid IPv6 address." +msgstr "" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +msgid "Enter only digits separated by commas." +msgstr "Тек үтірлермен бөлінген цифрлерді енгізіңіз." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Бұл мәннің %(limit_value)s екендігін тексеріңіз (қазір ол %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Бұл мәннің мынадан %(limit_value)s кіші немесе тең екендігін тексеріңіз." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Бұл мәннің мынадан %(limit_value)s үлкен немесе тең екендігін тексеріңіз." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Enter a number." +msgstr "Сан енгізіңіз." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "және" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Бұл жолақ null болмау керек." + +msgid "This field cannot be blank." +msgstr "Бұл жолақ бос болмау керек." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s %(field_label)s жолақпен бұрыннан бар." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Жолақтын түрі: %(field_type)s" + +msgid "Integer" +msgstr "Бүтін сан" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Ұзын (8 байт) бүтін сан" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Boolean (True немесе False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Жол (%(max_length)s символға дейін)" + +msgid "Comma-separated integers" +msgstr "Үтірмен бөлінген бүтін сандар" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Дата (уақытсыз)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Дата (уақытпен)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Ондық сан" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Email адрес" + +msgid "File path" +msgstr "Файл жолы" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Реал сан" + +msgid "IPv4 address" +msgstr "" + +msgid "IP address" +msgstr "IP мекенжайы" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Булеан (True, False немесе None)" + +msgid "Positive integer" +msgstr "" + +msgid "Positive small integer" +msgstr "" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +msgid "Small integer" +msgstr "" + +msgid "Text" +msgstr "Мәтін" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Уақыт" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "" + +msgid "Image" +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Foreign Key (тип related field арқылы анықталады)" + +msgid "One-to-one relationship" +msgstr "One-to-one қатынас" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Many-to-many қатынас" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Бұл өрісті толтыру міндетті." + +msgid "Enter a whole number." +msgstr "Толық санды енгізіңіз." + +msgid "Enter a valid date." +msgstr "Дұрыс күнді енгізіңіз." + +msgid "Enter a valid time." +msgstr "Дұрыс уақытты енгізіңіз." + +msgid "Enter a valid date/time." +msgstr "Дұрыс күнді/уақытты енгізіңіз." + +msgid "Enter a valid duration." +msgstr "" + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ешқандай файл жіберілмеді. Форманың кодтау түрін тексеріңіз." + +msgid "No file was submitted." +msgstr "Ешқандай файл жіберілмеді." + +msgid "The submitted file is empty." +msgstr "Бос файл жіберілді." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Файлды жіберіңіз немесе тазалауды белгіленіз, екеуін бірге емес." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Дұрыс сүретті жүктеңіз. Сіз жүктеген файл - сүрет емес немесе бұзылған сүрет." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Дұрыс тандау жасаңыз. %(value)s дұрыс тандау емес." + +msgid "Enter a list of values." +msgstr "Мәндер тізімін енгізіңіз." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Сұрыптау" + +msgid "Delete" +msgstr "Жою" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s жолақтағы қайталанған мәнді түзетіңіз." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "%(field)s жолақтағы мәнді түзетіңіз, ол бірегей болу керек." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s жолақтағы мәнді түзетіңіз. Ол %(date_field)s жолақтың ішінде " +"%(lookup)s үшін бірегей болу керек." + +msgid "Please correct the duplicate values below." +msgstr "Қайталанатын мәндерді түзетіңіз." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Дұрыс нұсқаны таңдаңыз. Бұл нұсқа дұрыс таңдаулардың арасында жоқ." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "Тазалау" + +msgid "Currently" +msgstr "Ағымдағы" + +msgid "Change" +msgstr "Түзету" + +msgid "Unknown" +msgstr "Белгісіз" + +msgid "Yes" +msgstr "Иә" + +msgid "No" +msgstr "Жоқ" + +msgid "yes,no,maybe" +msgstr "иә,жоқ,мүмкін" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" +msgstr[1] "%(size)d байт" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s ГБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "Т.Қ." + +msgid "a.m." +msgstr "Т.Ж." + +msgid "PM" +msgstr "ТҚ" + +msgid "AM" +msgstr "ТЖ" + +msgid "midnight" +msgstr "түнжарым" + +msgid "noon" +msgstr "түсқайта" + +msgid "Monday" +msgstr "Дүйсенбі" + +msgid "Tuesday" +msgstr "Сейсенбі" + +msgid "Wednesday" +msgstr "Сәрсенбі" + +msgid "Thursday" +msgstr "Бейсенбі" + +msgid "Friday" +msgstr "Жума" + +msgid "Saturday" +msgstr "Сенбі" + +msgid "Sunday" +msgstr "Жексенбі" + +msgid "Mon" +msgstr "Дб" + +msgid "Tue" +msgstr "Сб" + +msgid "Wed" +msgstr "Ср" + +msgid "Thu" +msgstr "Бс" + +msgid "Fri" +msgstr "Жм" + +msgid "Sat" +msgstr "Сн" + +msgid "Sun" +msgstr "Жк" + +msgid "January" +msgstr "Қаңтар" + +msgid "February" +msgstr "Ақпан" + +msgid "March" +msgstr "Наурыз" + +msgid "April" +msgstr "Сәуір" + +msgid "May" +msgstr "Мамыр" + +msgid "June" +msgstr "Маусым" + +msgid "July" +msgstr "Шілде" + +msgid "August" +msgstr "Тамыз" + +msgid "September" +msgstr "Қыркүйек" + +msgid "October" +msgstr "Қазан" + +msgid "November" +msgstr "Қараша" + +msgid "December" +msgstr "Желтоқсан" + +msgid "jan" +msgstr "қан" + +msgid "feb" +msgstr "ақп" + +msgid "mar" +msgstr "нау" + +msgid "apr" +msgstr "сәу" + +msgid "may" +msgstr "мам" + +msgid "jun" +msgstr "мау" + +msgid "jul" +msgstr "шіл" + +msgid "aug" +msgstr "там" + +msgid "sep" +msgstr "қыр" + +msgid "oct" +msgstr "қаз" + +msgid "nov" +msgstr "қар" + +msgid "dec" +msgstr "жел" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Қаң." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Ақп." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Наурыз" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Сәуір" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Мамыр" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Маусым" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Шілде" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Там." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Қыр." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Қаз." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Қар." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Жел." + +msgctxt "alt. month" +msgid "January" +msgstr "Қаңтар" + +msgctxt "alt. month" +msgid "February" +msgstr "Ақпан" + +msgctxt "alt. month" +msgid "March" +msgstr "Наурыз" + +msgctxt "alt. month" +msgid "April" +msgstr "Сәуір" + +msgctxt "alt. month" +msgid "May" +msgstr "Мамыр" + +msgctxt "alt. month" +msgid "June" +msgstr "Маусым" + +msgctxt "alt. month" +msgid "July" +msgstr "Шілде" + +msgctxt "alt. month" +msgid "August" +msgstr "Тамыз" + +msgctxt "alt. month" +msgid "September" +msgstr "Қыркүйек" + +msgctxt "alt. month" +msgid "October" +msgstr "Қазан" + +msgctxt "alt. month" +msgid "November" +msgstr "Қараша" + +msgctxt "alt. month" +msgid "December" +msgstr "Желтоқсан" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "немесе" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "Жыл таңдалмаған" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Ай таңдалмаған" + +msgid "No day specified" +msgstr "Күн таңдалмаған" + +msgid "No week specified" +msgstr "Апта таңдалмаған" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s қол жеткізгісіз" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Болашақ %(verbose_name_plural)s қол жеткізгісіз, себебі %(class_name)s." +"allow_future False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "'%(format)s' пішімі үшін дұрыс емес '%(datestr)s' уақыт жолы" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "%(verbose_name)s табылған жоқ" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Бет соңғы емес және оны санға түрлендіруге болмайды." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Бос тізім және '%(class_name)s.allow_empty' - False." + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ccae161 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po new file mode 100644 index 0000000..cb0e8ed --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/kn/LC_MESSAGES/django.po @@ -0,0 +1,1224 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# karthikbgl , 2011-2012 +# Ramakrishna Yekulla , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:44+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Kannada (http://www.transifex.com/django/django/language/" +"kn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "ಅರೇಬಿಕ್" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "ಆಜೆರ್ಬೈಜನಿ" + +msgid "Bulgarian" +msgstr "ಬಲ್ಗೇರಿಯನ್" + +msgid "Belarusian" +msgstr "" + +msgid "Bengali" +msgstr "ಬೆಂಗಾಲಿ" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "ಬೋಸ್ನಿಯನ್" + +msgid "Catalan" +msgstr "ಕೆಟಲಾನ್" + +msgid "Czech" +msgstr "ಝೆಕ್" + +msgid "Welsh" +msgstr "ವೆಲ್ಷ್" + +msgid "Danish" +msgstr "ಡ್ಯಾನಿಷ್" + +msgid "German" +msgstr "ಜರ್ಮನ್" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "ಗ್ರೀಕ್" + +msgid "English" +msgstr "ಇಂಗ್ಲಿಷ್" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "ಬ್ರಿಟೀಶ್ ಇಂಗ್ಲಿಷ್" + +msgid "Esperanto" +msgstr "" + +msgid "Spanish" +msgstr "ಸ್ಪ್ಯಾನಿಷ್" + +msgid "Argentinian Spanish" +msgstr "ಅರ್ಜೆಂಟಿನಿಯನ್ ಸ್ಪಾನಿಷ್" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "ಮೆಕ್ಸಿಕನ್ ಸ್ಪಾನಿಷ್" + +msgid "Nicaraguan Spanish" +msgstr "nicarguan ಸ್ಪಾನಿಷ್" + +msgid "Venezuelan Spanish" +msgstr "" + +msgid "Estonian" +msgstr "ಎಷ್ಟೋನಿಯನ್" + +msgid "Basque" +msgstr "ಬಾಸ್ಕ್‍" + +msgid "Persian" +msgstr "ಪರ್ಶಿಯನ್" + +msgid "Finnish" +msgstr "ಫಿನ್ನಿಶ್" + +msgid "French" +msgstr "ಫ್ರೆಂಚ್" + +msgid "Frisian" +msgstr "ಫ್ರಿಸಿಯನ್" + +msgid "Irish" +msgstr "ಐರಿಶ್" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "ಗೆಲಿಶಿಯನ್" + +msgid "Hebrew" +msgstr "ಹೀಬ್ರೂ" + +msgid "Hindi" +msgstr "ಹಿಂದಿ" + +msgid "Croatian" +msgstr "ಕ್ರೊಯೇಶಿಯನ್" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "ಹಂಗೇರಿಯನ್" + +msgid "Armenian" +msgstr "" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "ಇಂಡೋನಿಶಿಯನ್" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "ಐಸ್‌ಲ್ಯಾಂಡಿಕ್" + +msgid "Italian" +msgstr "ಇಟಾಲಿಯನ್" + +msgid "Japanese" +msgstr "ಜಾಪನೀಸ್" + +msgid "Georgian" +msgstr "ಜಾರ್ಜೆಯನ್ " + +msgid "Kabyle" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Khmer" +msgstr "ಖಮೇರ್" + +msgid "Kannada" +msgstr "ಕನ್ನಡ" + +msgid "Korean" +msgstr "ಕೊರಿಯನ್" + +msgid "Luxembourgish" +msgstr "" + +msgid "Lithuanian" +msgstr "ಲಿತುವಾನಿಯನ್ " + +msgid "Latvian" +msgstr "ಲಾಟ್ವಿಯನ್" + +msgid "Macedonian" +msgstr "ಮೆಸಡೊನಿಯನ್" + +msgid "Malayalam" +msgstr "ಮಲಯಾಳಂ" + +msgid "Mongolian" +msgstr "ಮಂಗೊಲಿಯನ್" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Dutch" +msgstr "ಡಚ್" + +msgid "Norwegian Nynorsk" +msgstr "ನಾರ್ವೇಜಿಯನ್ ನಿನೋರ್ಕ್" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "ಪಂಜಾಬಿ" + +msgid "Polish" +msgstr "ಪೋಲಿಷ್" + +msgid "Portuguese" +msgstr "ಪೋರ್ಚುಗೀಸ್" + +msgid "Brazilian Portuguese" +msgstr "ಬ್ರಜೀಲಿಯನ್ ಪೋರ್ಚುಗೀಸ್" + +msgid "Romanian" +msgstr "ರೋಮೇನಿಯನ್" + +msgid "Russian" +msgstr "ರಶಿಯನ್" + +msgid "Slovak" +msgstr "ಸ್ಲೋವಾಕ್" + +msgid "Slovenian" +msgstr "ಸ್ಲೋವೇನಿಯನ್" + +msgid "Albanian" +msgstr "ಅಲ್ಬೆನಿಯನ್ " + +msgid "Serbian" +msgstr "ಸರ್ಬಿಯನ್" + +msgid "Serbian Latin" +msgstr "ಸರ್ಬಿಯನ್ ಲ್ಯಾಟಿನ್" + +msgid "Swedish" +msgstr "ಸ್ವೀಡಿಷ್" + +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "ತಮಿಳು" + +msgid "Telugu" +msgstr "ತೆಲುಗು" + +msgid "Thai" +msgstr "ಥಾಯ್" + +msgid "Turkish" +msgstr "ಟರ್ಕಿಶ್" + +msgid "Tatar" +msgstr "" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "ಉಕ್ರೇನಿಯನ್" + +msgid "Urdu" +msgstr "ಉರ್ದು" + +msgid "Vietnamese" +msgstr "ವಿಯೆತ್ನಾಮೀಸ್" + +msgid "Simplified Chinese" +msgstr "ಸರಳೀಕೃತ ಚೈನೀಸ್" + +msgid "Traditional Chinese" +msgstr "ಸಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್ " + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "ಸಿಂಧುವಾದ ಮೌಲ್ಯವನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid URL." +msgstr "ಸರಿಯಾದ ಒಂದು URL ಅನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"ಅಕ್ಷರಗಳು, ಅಂಕೆಗಳು, ಅಡಿಗೆರೆಗಳು (ಅಂಡರ್ಸ್ಕೋರ್) ಹಾಗು ಅಡ್ಡಗೆರೆಗಳನ್ನು ಹೊಂದಿರುವ ಒಂದು " +"ಸರಿಯಾದ 'slug' ಅನ್ನು ನಮೂದಿಸಿ." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "ಒಂದು ಸರಿಯಾದ IPv4 ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid IPv6 address." +msgstr "ಮಾನ್ಯವಾದ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "ಮಾನ್ಯವಾದ IPv4 ಅಥವಾ IPv6 ವಿಳಾಸ ದಾಖಲಿಸಿ" + +msgid "Enter only digits separated by commas." +msgstr "ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ ಬೇರ್ಪಟ್ಟ ಅಂಕೆಗಳನ್ನು ಮಾತ್ರ ಬರೆಯಿರಿ." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"ಈ ಮೌಲ್ಯವು %(limit_value)s ಆಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ (ಇದು %(show_value)s ಆಗಿದೆ)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಕಡಿಮೆಯ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " +"ಮಾಡಿಕೊಳ್ಳಿ." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"ಈ ಮೌಲ್ಯವು %(limit_value)s ಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಅಥವ ಸಮನಾದ ಮೌಲ್ಯವಾಗಿದೆ ಎಂದು ಖಾತ್ರಿ " +"ಮಾಡಿಕೊಳ್ಳಿ." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Enter a number." +msgstr "ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "ಮತ್ತು" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "ಈ ಅಂಶವನ್ನು ಖಾಲಿ ಬಿಡುವಂತಿಲ್ಲ." + +msgid "This field cannot be blank." +msgstr "ಈ ಸ್ಥಳವು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "" +"ಈ %(field_label)s ಅನ್ನು ಹೊಂದಿರುವ ಒಂದು %(model_name)s ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "ಕ್ಷೇತ್ರದ ಬಗೆ: %(field_type)s" + +msgid "Integer" +msgstr "ಪೂರ್ಣಾಂಕ" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "ಬೃಹತ್ (೮ ಬೈಟ್) ಪೂರ್ಣ ಸಂಖ್ಯೆ" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "ಬೂಲಿಯನ್ (ಹೌದು ಅಥವ ಅಲ್ಲ)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "ಪದಪುಂಜ (%(max_length)s ವರೆಗೆ)" + +msgid "Comma-separated integers" +msgstr "ಅಲ್ಪವಿರಾಮ(,) ದಿಂದ ಬೇರ್ಪಟ್ಟ ಪೂರ್ಣಸಂಖ್ಯೆಗಳು" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "ದಿನಾಂಕ (ಸಮಯವಿಲ್ಲದೆ)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "ದಿನಾಂಕ (ಸಮಯದೊಂದಿಗೆ)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "ದಶಮಾನ ಸಂಖ್ಯೆ" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "" + +msgid "File path" +msgstr "ಕಡತದ ಸ್ಥಾನಪಥ" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "ತೇಲುವ-ಬಿಂದು ಸಂಖ್ಯೆ" + +msgid "IPv4 address" +msgstr "IPv4 ವಿಳಾಸ" + +msgid "IP address" +msgstr "IP ವಿಳಾಸ" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "ಬೂಲಿಯನ್ (ನಿಜ, ಸುಳ್ಳು ಅಥವ ಯಾವುದೂ ಅಲ್ಲ ಇವುಗಳಲ್ಲಿ ಒಂದು)" + +msgid "Positive integer" +msgstr "" + +msgid "Positive small integer" +msgstr "" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +msgid "Small integer" +msgstr "" + +msgid "Text" +msgstr "ಪಠ್ಯ" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "ಸಮಯ" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "Universally unique identifier" +msgstr "" + +msgid "File" +msgstr "" + +msgid "Image" +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "ಬಾಹ್ಯ ಕೀಲಿ (ಸಂಬಂಧಿತ ಸ್ಥಳದಿಂದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಧರಿಸಲಾಗುತ್ತದೆ)" + +msgid "One-to-one relationship" +msgstr "ಒನ್-ಟು-ಒನ್ (ಪರಸ್ಪರ) ಸಂಬಂಧ" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "ಮೆನಿ-ಟು-ಮೆನಿ (ಸಾರ್ವಜನಿಕ) ಸಂಬಂಧ" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "ಈ ಸ್ಥಳವು ಅಗತ್ಯವಿರುತ್ತದೆ." + +msgid "Enter a whole number." +msgstr "ಪೂರ್ಣಾಂಕವೊಂದನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid date." +msgstr "ಸರಿಯಾದ ದಿನಾಂಕವನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid time." +msgstr "ಸರಿಯಾದ ಸಮಯವನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid date/time." +msgstr "ಸರಿಯಾದ ದಿನಾಂಕ/ಸಮಯವನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a valid duration." +msgstr "" + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ. ನಮೂನೆಯ ಮೇಲಿನ ಸಂಕೇತೀಕರಣ (ಎನ್ಕೋಡಿಂಗ್) ಬಗೆಯನ್ನು " +"ಪರೀಕ್ಷಿಸಿ." + +msgid "No file was submitted." +msgstr "ಯಾವದೇ ಕಡತವನ್ನೂ ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ." + +msgid "The submitted file is empty." +msgstr "ಸಲ್ಲಿಸಲಾದ ಕಡತ ಖಾಲಿ ಇದೆ." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"ದಯವಿಟ್ಟು ಕಡತವನ್ನು ಸಲ್ಲಿಸಿ ಅಥವ ಅಳಿಸುವ ಗುರುತುಚೌಕವನ್ನು ಗುರುತು ಹಾಕಿ, ಎರಡನ್ನೂ ಒಟ್ಟಿಗೆ " +"ಮಾಡಬೇಡಿ." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"ಸರಿಯಾದ ಚಿತ್ರವನ್ನು ಸೇರಿಸಿ. ನೀವು ಸೇರಿಸಿದ ಕಡತವು ಚಿತ್ರವೇ ಅಲ್ಲ ಅಥವಾ ಅದು ಒಂದು ಹಾಳಾದ " +"ಚಿತ್ರವಾಗಿದೆ. " + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. %(value)s ಎನ್ನುವುದು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." + +msgid "Enter a list of values." +msgstr "ಮೌಲ್ಯಗಳ ಒಂದು ಪಟ್ಟಿಯನ್ನು ನಮೂದಿಸಿ." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "ಕ್ರಮ" + +msgid "Delete" +msgstr "ಅಳಿಸಿಹಾಕಿ" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, ಇದರ ಮೌಲ್ಯವು " +"ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s ಗಾಗಿ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮಾಹಿತಿಯನ್ನು ಸರಿಪಡಿಸಿ, %(date_field)s " +"ನಲ್ಲಿನ %(lookup)s ಗಾಗಿ ಇದರ ಮೌಲ್ಯವು ವಿಶಿಷ್ಟವಾಗಿರಬೇಕು." + +msgid "Please correct the duplicate values below." +msgstr "ದಯವಿಟ್ಟು ಈ ಕೆಳಗೆ ಎರಡು ಬಾರಿ ನಮೂದಿಸಲಾದ ಮೌಲ್ಯವನ್ನು ಸರಿಪಡಿಸಿ." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "ಸರಿಯಾದ ಒಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ. ಆ ಆಯ್ಕೆಯು ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳಲ್ಲಿ ಇಲ್ಲ." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "ಮುಕ್ತಗೊಳಿಸು" + +msgid "Currently" +msgstr "ಪ್ರಸಕ್ತ" + +msgid "Change" +msgstr "ಬದಲಾವಣೆ" + +msgid "Unknown" +msgstr "ಗೊತ್ತಿರದ" + +msgid "Yes" +msgstr "ಹೌದು" + +msgid "No" +msgstr "ಇಲ್ಲ" + +msgid "yes,no,maybe" +msgstr "ಹೌದು,ಇಲ್ಲ,ಇರಬಹುದು" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d ಬೈಟ್‌ಗಳು" +msgstr[1] "%(size)d ಬೈಟ್‌ಗಳು" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "ಅಪರಾಹ್ನ" + +msgid "a.m." +msgstr "ಪೂರ್ವಾಹ್ನ" + +msgid "PM" +msgstr "ಅಪರಾಹ್ನ" + +msgid "AM" +msgstr "ಪೂರ್ವಾಹ್ನ" + +msgid "midnight" +msgstr "ಮಧ್ಯರಾತ್ರಿ" + +msgid "noon" +msgstr "ಮಧ್ಯಾಹ್ನ" + +msgid "Monday" +msgstr "ಸೋಮವಾರ" + +msgid "Tuesday" +msgstr "ಮಂಗಳವಾರ" + +msgid "Wednesday" +msgstr "ಬುಧವಾರ" + +msgid "Thursday" +msgstr "ಗುರುವಾರ" + +msgid "Friday" +msgstr "ಶುಕ್ರವಾರ" + +msgid "Saturday" +msgstr "ಶನಿವಾರ" + +msgid "Sunday" +msgstr "ರವಿವಾರ" + +msgid "Mon" +msgstr "ಸೋಮ" + +msgid "Tue" +msgstr "ಮಂಗಳ" + +msgid "Wed" +msgstr "ಬುಧ" + +msgid "Thu" +msgstr "ಗುರು" + +msgid "Fri" +msgstr "ಶುಕ್ರ" + +msgid "Sat" +msgstr "ಶನಿ" + +msgid "Sun" +msgstr "ರವಿ" + +msgid "January" +msgstr "ಜನವರಿ" + +msgid "February" +msgstr "ಫೆಬ್ರುವರಿ" + +msgid "March" +msgstr "ಮಾರ್ಚ್" + +msgid "April" +msgstr "ಎಪ್ರಿಲ್" + +msgid "May" +msgstr "ಮೇ" + +msgid "June" +msgstr "ಜೂನ್" + +msgid "July" +msgstr "ಜುಲೈ" + +msgid "August" +msgstr "ಆಗಸ್ಟ್" + +msgid "September" +msgstr "ಸೆಪ್ಟೆಂಬರ್" + +msgid "October" +msgstr "ಅಕ್ಟೋಬರ್" + +msgid "November" +msgstr "ನವೆಂಬರ್" + +msgid "December" +msgstr "ಡಿಸೆಂಬರ್" + +msgid "jan" +msgstr "ಜನವರಿ" + +msgid "feb" +msgstr "ಫೆಬ್ರವರಿ" + +msgid "mar" +msgstr "ಮಾರ್ಚ್" + +msgid "apr" +msgstr "ಏಪ್ರಿಲ್" + +msgid "may" +msgstr "ಮೇ" + +msgid "jun" +msgstr "ಜೂನ್" + +msgid "jul" +msgstr "ಜುಲೈ" + +msgid "aug" +msgstr "ಆಗಸ್ಟ್‍" + +msgid "sep" +msgstr "ಸೆಪ್ಟೆಂಬರ್" + +msgid "oct" +msgstr "ಅಕ್ಟೋಬರ್" + +msgid "nov" +msgstr "ನವೆಂಬರ್" + +msgid "dec" +msgstr "ಡಿಸೆಂಬರ್" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "ಜನ." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "ಫೆಬ್ರ." + +msgctxt "abbrev. month" +msgid "March" +msgstr "ಮಾರ್ಚ್" + +msgctxt "abbrev. month" +msgid "April" +msgstr "ಏಪ್ರಿಲ್" + +msgctxt "abbrev. month" +msgid "May" +msgstr "ಮೇ" + +msgctxt "abbrev. month" +msgid "June" +msgstr "ಜೂನ್" + +msgctxt "abbrev. month" +msgid "July" +msgstr "ಜುಲೈ" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "ಆಗ." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "ಸೆಪ್ಟೆ." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "ಅಕ್ಟೋ." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "ನವೆಂ." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "ಡಿಸೆಂ." + +msgctxt "alt. month" +msgid "January" +msgstr "ಜನವರಿ" + +msgctxt "alt. month" +msgid "February" +msgstr "ಫೆಬ್ರವರಿ" + +msgctxt "alt. month" +msgid "March" +msgstr "ಮಾರ್ಚ್" + +msgctxt "alt. month" +msgid "April" +msgstr "ಏಪ್ರಿಲ್" + +msgctxt "alt. month" +msgid "May" +msgstr "ಮೇ" + +msgctxt "alt. month" +msgid "June" +msgstr "ಜೂನ್" + +msgctxt "alt. month" +msgid "July" +msgstr "ಜುಲೈ" + +msgctxt "alt. month" +msgid "August" +msgstr "ಆಗಸ್ಟ್‍" + +msgctxt "alt. month" +msgid "September" +msgstr "ಸಪ್ಟೆಂಬರ್" + +msgctxt "alt. month" +msgid "October" +msgstr "ಅಕ್ಟೋಬರ್" + +msgctxt "alt. month" +msgid "November" +msgstr "ನವೆಂಬರ್" + +msgctxt "alt. month" +msgid "December" +msgstr "ಡಿಸೆಂಬರ್" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "ಅಥವ" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "ಯಾವುದೆ ವರ್ಷವನ್ನು ಸೂಚಿಲಾಗಿಲ್ಲ" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "ಯಾವುದೆ ತಿಂಗಳನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +msgid "No day specified" +msgstr "ಯಾವುದೆ ದಿನವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +msgid "No week specified" +msgstr "ಯಾವುದೆ ವಾರವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "ಯಾವುದೆ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"ಭವಿಷ್ಯದ %(verbose_name_plural)s ಲಭ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ %(class_name)s.allow_future " +"ಎನ್ನುವುದು ಅಸತ್ಯವಾಗಿದೆ (ಫಾಲ್ಸ್‍) ಆಗಿದೆ." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"ಅಸಿಂಧುವಾದ '%(datestr)s' ದಿನಾಂಕ ಪದಪುಂಜ ಒದಗಿಸಲಾದ ವಿನ್ಯಾಸವು '%(format)s' ಆಗಿದೆ" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "ಮನವಿಗೆ ತಾಳೆಯಾಗುವ ಯಾವುದೆ %(verbose_name)s ಕಂಡುಬಂದಿಲ್ಲ" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "ಪುಟವು 'ಕೊನೆಯ'ದಲ್ಲ, ಅಥವ ಅದನ್ನು ಒಂದು int ಆಗಿ ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" +"ಖಾಲಿ ಪಟ್ಟಿ ಹಾಗು '%(class_name)s.allow_empty' ಎನ್ನುವುದು ಅಸತ್ಯವಾಗಿದೆ (ಫಾಲ್ಸ್‍)." + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..0af50ea --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,1324 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kostas , 2011 +# lauris , 2011 +# Matas Dailyda , 2015-2019 +# naktinis , 2012 +# Nikolajus Krauklis , 2013 +# Povilas Balzaravičius , 2011-2012 +# Simonas Kazlauskas , 2012-2014 +# Vytautas Astrauskas , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 10:33+0000\n" +"Last-Translator: Matas Dailyda \n" +"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" +"lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +msgid "Afrikaans" +msgstr "Afrikiečių" + +msgid "Arabic" +msgstr "Arabų" + +msgid "Asturian" +msgstr "Austrų" + +msgid "Azerbaijani" +msgstr "Azerbaidžaniečių" + +msgid "Bulgarian" +msgstr "Bulgarų" + +msgid "Belarusian" +msgstr "Gudų" + +msgid "Bengali" +msgstr "Bengalų" + +msgid "Breton" +msgstr "Bretonų" + +msgid "Bosnian" +msgstr "Bosnių" + +msgid "Catalan" +msgstr "Katalonų" + +msgid "Czech" +msgstr "Čekų" + +msgid "Welsh" +msgstr "Velso" + +msgid "Danish" +msgstr "Danų" + +msgid "German" +msgstr "Vokiečių" + +msgid "Lower Sorbian" +msgstr "Žemutinė Sorbų" + +msgid "Greek" +msgstr "Graikų" + +msgid "English" +msgstr "Anglų" + +msgid "Australian English" +msgstr "Australų Anlgų" + +msgid "British English" +msgstr "Britų Anglų" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Ispanų" + +msgid "Argentinian Spanish" +msgstr "Argentiniečių Ispanų" + +msgid "Colombian Spanish" +msgstr "Kolumbų Ispanų" + +msgid "Mexican Spanish" +msgstr "Meksikiečių Ispanų" + +msgid "Nicaraguan Spanish" +msgstr "Nikaragvos Ispanijos" + +msgid "Venezuelan Spanish" +msgstr "Venesuelos Ispanų" + +msgid "Estonian" +msgstr "Estų" + +msgid "Basque" +msgstr "Baskų" + +msgid "Persian" +msgstr "Persų" + +msgid "Finnish" +msgstr "Suomių" + +msgid "French" +msgstr "Prancūzų" + +msgid "Frisian" +msgstr "Fryzų" + +msgid "Irish" +msgstr "Airių" + +msgid "Scottish Gaelic" +msgstr "Škotų Gėlų" + +msgid "Galician" +msgstr "Galų" + +msgid "Hebrew" +msgstr "Hebrajų" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Kroatų" + +msgid "Upper Sorbian" +msgstr "Aukštutinė Sorbų" + +msgid "Hungarian" +msgstr "Vengrų" + +msgid "Armenian" +msgstr "Armėnų" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indoneziečių" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandų" + +msgid "Italian" +msgstr "Italų" + +msgid "Japanese" +msgstr "Japonų" + +msgid "Georgian" +msgstr "Gruzinų" + +msgid "Kabyle" +msgstr "Kabilų" + +msgid "Kazakh" +msgstr "Kazachų" + +msgid "Khmer" +msgstr "Khmerų" + +msgid "Kannada" +msgstr "Dravidų" + +msgid "Korean" +msgstr "Korėjiečių" + +msgid "Luxembourgish" +msgstr "Liuksemburgų" + +msgid "Lithuanian" +msgstr "Lietuvių" + +msgid "Latvian" +msgstr "Latvių" + +msgid "Macedonian" +msgstr "Makedonų" + +msgid "Malayalam" +msgstr "Malajalių" + +msgid "Mongolian" +msgstr "Mongolų" + +msgid "Marathi" +msgstr "Marati" + +msgid "Burmese" +msgstr "Mjanmų" + +msgid "Norwegian Bokmål" +msgstr "Norvegų Bokmal" + +msgid "Nepali" +msgstr "Nepalų" + +msgid "Dutch" +msgstr "Olandų" + +msgid "Norwegian Nynorsk" +msgstr "Norvegų Nynorsk" + +msgid "Ossetic" +msgstr "Osetinų" + +msgid "Punjabi" +msgstr "Pandžabi" + +msgid "Polish" +msgstr "Lenkų" + +msgid "Portuguese" +msgstr "Protugalų" + +msgid "Brazilian Portuguese" +msgstr "Brazilijos Portugalų" + +msgid "Romanian" +msgstr "Rumunų" + +msgid "Russian" +msgstr "Rusų" + +msgid "Slovak" +msgstr "Slovakų" + +msgid "Slovenian" +msgstr "Slovėnų" + +msgid "Albanian" +msgstr "Albanų" + +msgid "Serbian" +msgstr "Serbų" + +msgid "Serbian Latin" +msgstr "Serbų Lotynų" + +msgid "Swedish" +msgstr "Švedų" + +msgid "Swahili" +msgstr "Svahili" + +msgid "Tamil" +msgstr "Tamilų" + +msgid "Telugu" +msgstr "Telugų" + +msgid "Thai" +msgstr "Tailando" + +msgid "Turkish" +msgstr "Turkų" + +msgid "Tatar" +msgstr "Totorių" + +msgid "Udmurt" +msgstr "Udmurtų" + +msgid "Ukrainian" +msgstr "Ukrainiečių" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vietnamiečių" + +msgid "Simplified Chinese" +msgstr "Supaprastinta kinų" + +msgid "Traditional Chinese" +msgstr "Tradicinė kinų" + +msgid "Messages" +msgstr "Žinutės" + +msgid "Site Maps" +msgstr "Tinklalapio struktūros" + +msgid "Static Files" +msgstr "Statiniai failai" + +msgid "Syndication" +msgstr "Sindikacija" + +msgid "That page number is not an integer" +msgstr "To puslapio numeris nėra sveikasis skaičius." + +msgid "That page number is less than 1" +msgstr "To numerio puslapis yra mažesnis už 1" + +msgid "That page contains no results" +msgstr "Tas puslapis neturi jokių rezultatų" + +msgid "Enter a valid value." +msgstr "Įveskite tinkamą reikšmę." + +msgid "Enter a valid URL." +msgstr "Įveskite tinkamą URL adresą." + +msgid "Enter a valid integer." +msgstr "Įveskite tinkamą sveikąjį skaičių." + +msgid "Enter a valid email address." +msgstr "Įveskite teisingą el. pašto adresą." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Šią reikšmę gali sudaryti tik raidės, skaičiai, pabraukimo arba paprasto " +"brūkšnio simboliai." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Įveskite teisingą adresą sudarytą iš Unikodo raidžių, skaičių, pabraukimo " +"arba paprastų brūkšnių." + +msgid "Enter a valid IPv4 address." +msgstr "Įveskite validų IPv4 adresą." + +msgid "Enter a valid IPv6 address." +msgstr "Įveskite validų IPv6 adresą." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Įveskite validų IPv4 arba IPv6 adresą." + +msgid "Enter only digits separated by commas." +msgstr "Įveskite skaitmenis atskirtus kableliais." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Įsitikinkite, kad reikšmę sudaro %(limit_value)s simbolių (dabar yra " +"%(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Įsitikinkite, kad reikšmė yra mažesnė arba lygi %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Įsitikinkite, kad reikšmė yra didesnė arba lygi %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklo " +"(dabartinis ilgis %(show_value)d)." +msgstr[1] "" +"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." +msgstr[2] "" +"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." +msgstr[3] "" +"Įsitikinkite, kad reikšmė sudaryta iš nemažiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklo " +"(dabartinis ilgis %(show_value)d)." +msgstr[1] "" +"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." +msgstr[2] "" +"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." +msgstr[3] "" +"Įsitikinkite, kad reikšmė sudaryta iš nedaugiau kaip %(limit_value)d ženklų " +"(dabartinis ilgis %(show_value)d)." + +msgid "Enter a number." +msgstr "Įveskite skaičių." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo." +msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys." +msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." +msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo po kablelio." +msgstr[1] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys po kablelio." +msgstr[2] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." +msgstr[3] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų po kablelio." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmuo prieš kablelį." +msgstr[1] "" +"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenys prieš kablelį." +msgstr[2] "" +"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." +msgstr[3] "" +"Įsitikinkite, kad yra nedaugiau nei %(max)s skaitmenų prieš kablelį." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Bylos tipas '%(extension)s' negalimas. Galimi tipai yra: " +"'%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Nuliniai simboliai neleidžiami." + +msgid "and" +msgstr "ir" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s su šiais %(field_labels)s jau egzistuoja." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Reikšmės %(value)r rinktis negalima." + +msgid "This field cannot be null." +msgstr "Šis laukas negali būti null." + +msgid "This field cannot be blank." +msgstr "Lauką privaloma užpildyti." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s su šiuo %(field_label)s jau egzistuoja." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s privalo būti unikalus %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Lauko tipas: %(field_type)s " + +msgid "Integer" +msgstr "Sveikas skaičius" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' turi būti sveikas skaičius." + +msgid "Big (8 byte) integer" +msgstr "Didelis (8 baitų) sveikas skaičius" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' reikšmė turi būti arba True, arba False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' reikšmė turi būti True, False, arba None." + +msgid "Boolean (Either True or False)" +msgstr "Loginė reikšmė (Tiesa arba Netiesa)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Eilutė (ilgis iki %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Kableliais atskirti sveikieji skaičiai" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' reikšmė yra netinkamu datos formatu. Reikšmė turi būti YYYY-MM-" +"DD formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' reikšmė yra teisingo (YYYY-MM-DD) formato, tačiau tai nėra " +"teisinga data." + +msgid "Date (without time)" +msgstr "Data (be laiko)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' reikšmė yra neteisingo formato. Reikšmė turi būti pateikta YYYY-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ] formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' reikšmė yra teisingo (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"formato, tačiau tai nėra teisinga data ar laikas." + +msgid "Date (with time)" +msgstr "Data (su laiku)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' reikšmė turi būti dešimtainis skaičius." + +msgid "Decimal number" +msgstr "Dešimtainis skaičius" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' reikšmė yra neteisingo formato. Reikšmė turi būti pateikta [DD] " +"[HH:[MM:]]ss[.uuuuuu] formatu." + +msgid "Duration" +msgstr "Trukmė" + +msgid "Email address" +msgstr "El. pašto adresas" + +msgid "File path" +msgstr "Kelias iki failo" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' reikšmė turi būti realus skaičius." + +msgid "Floating point number" +msgstr "Realus skaičius" + +msgid "IPv4 address" +msgstr "IPv4 adresas" + +msgid "IP address" +msgstr "IP adresas" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' reikšmė turi būti None, True arba False." + +msgid "Boolean (Either True, False or None)" +msgstr "Loginė reikšmė (Tiesa, Netiesa arba Nieko)" + +msgid "Positive integer" +msgstr "Teigiamas sveikasis skaičius" + +msgid "Positive small integer" +msgstr "Nedidelis teigiamas sveikasis skaičius" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Unikalus adresas (iki %(max_length)s ženklų)" + +msgid "Small integer" +msgstr "Nedidelis sveikasis skaičius" + +msgid "Text" +msgstr "Tekstas" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' reikšmė yra neteisingo formato. Reikšmė turi būti pateikta HH:" +"MM[:ss[.uuuuuu]] formatu." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' reikšmė yra teisingo (HH:MM[:ss[.uuuuuu]]) formato, tačiau tai " +"nėra teisingas laikas." + +msgid "Time" +msgstr "Laikas" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Neapdorota informacija" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' yra netinkama UUID reikšmė." + +msgid "Universally unique identifier" +msgstr "Universaliai unikalus identifikatorius" + +msgid "File" +msgstr "Failas" + +msgid "Image" +msgstr "Paveiksliukas" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s objektas su %(field)s %(value)r neegzistuoja." + +msgid "Foreign Key (type determined by related field)" +msgstr "Išorinis raktas (tipas nustatomas susijusiame lauke)" + +msgid "One-to-one relationship" +msgstr "Sąryšis vienas su vienu" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s sąryšis" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s sąryšiai" + +msgid "Many-to-many relationship" +msgstr "Sąryšis daug su daug" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Šis laukas yra privalomas." + +msgid "Enter a whole number." +msgstr "Įveskite pilną skaičių." + +msgid "Enter a valid date." +msgstr "Įveskite tinkamą datą." + +msgid "Enter a valid time." +msgstr "Įveskite tinkamą laiką." + +msgid "Enter a valid date/time." +msgstr "Įveskite tinkamą datą/laiką." + +msgid "Enter a valid duration." +msgstr "Įveskite tinkamą trukmę." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Dienų skaičius turi būti tarp {min_days} ir {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Nebuvo nurodytas failas. Patikrinkite formos koduotę." + +msgid "No file was submitted." +msgstr "Failas nebuvo nurodytas." + +msgid "The submitted file is empty." +msgstr "Nurodytas failas yra tuščias." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " +"ženklo (dabartinis ilgis %(length)d)." +msgstr[1] "" +"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " +"ženklų (dabartinis ilgis %(length)d)." +msgstr[2] "" +"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " +"ženklų (dabartinis ilgis %(length)d)." +msgstr[3] "" +"Įsitikinkite, kad failo pavadinimas sudarytas iš nedaugiau kaip %(max)d " +"ženklų (dabartinis ilgis %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Nurodykite failą arba pažymėkite išvalyti. Abu pasirinkimai negalimi." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Atsiųskite tinkamą paveiksliuką. Failas, kurį siuntėte nebuvo paveiksliukas, " +"arba buvo sugadintas." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Nurodykite tinkamą reikšmę. %(value)s nėra galimas pasirinkimas." + +msgid "Enter a list of values." +msgstr "Įveskite reikšmių sarašą." + +msgid "Enter a complete value." +msgstr "Įveskite pilną reikšmę." + +msgid "Enter a valid UUID." +msgstr "Įveskite tinkamą UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Paslėptas laukelis %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm duomenys buvo sugadinti arba neegzistuoja" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Prašome pateikti %d arba mažiau formų." +msgstr[1] "Prašome pateikti %d arba mažiau formų." +msgstr[2] "Prašome pateikti %d arba mažiau formų." +msgstr[3] "Prašome pateikti %d arba mažiau formų." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Prašome pateikti %d arba daugiau formų." +msgstr[1] "Prašome pateikti %d arba daugiau formų." +msgstr[2] "Prašome pateikti %d arba daugiau formų." +msgstr[3] "Prašome pateikti %d arba daugiau formų." + +msgid "Order" +msgstr "Nurodyti" + +msgid "Delete" +msgstr "Ištrinti" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Pataisykite pasikartojančius duomenis laukui %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Pataisykite pasikartojančius duomenis laukui %(field)s. Duomenys privalo " +"būti unikalūs." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Pataisykite pasikartojančius duomenis laukui %(field_name)s. Duomenys " +"privalo būti unikalūs %(lookup)s peržiūroms per %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Pataisykite žemiau esančias pasikartojančias reikšmes." + +msgid "The inline value did not match the parent instance." +msgstr "Reikšmė nesutapo su pirminiu objektu." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Pasirinkite tinkamą reikšmę. Parinkta reikšmė nėra galima." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" nėra tinkama reikšmė." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"Nepavyko interpretuoti %(datetime)s %(current_timezone)s laiko juostoje; " +"Data gali turėti keletą reikšmių arba neegzistuoti." + +msgid "Clear" +msgstr "Išvalyti" + +msgid "Currently" +msgstr "Šiuo metu" + +msgid "Change" +msgstr "Pakeisti" + +msgid "Unknown" +msgstr "Nežinomas" + +msgid "Yes" +msgstr "Taip" + +msgid "No" +msgstr "Ne" + +msgid "yes,no,maybe" +msgstr "taip,ne,galbūt" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d baitas" +msgstr[1] "%(size)d baitai" +msgstr[2] "%(size)d baitai" +msgstr[3] "%(size)d baitai" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "vidurnaktis" + +msgid "noon" +msgstr "vidurdienis" + +msgid "Monday" +msgstr "Pirmadienis" + +msgid "Tuesday" +msgstr "Antradienis" + +msgid "Wednesday" +msgstr "Trečiadienis" + +msgid "Thursday" +msgstr "Ketvirtadienis" + +msgid "Friday" +msgstr "Penktadienis" + +msgid "Saturday" +msgstr "Šeštadienis" + +msgid "Sunday" +msgstr "Sekmadienis" + +msgid "Mon" +msgstr "Pr" + +msgid "Tue" +msgstr "A" + +msgid "Wed" +msgstr "T" + +msgid "Thu" +msgstr "K" + +msgid "Fri" +msgstr "P" + +msgid "Sat" +msgstr "Š" + +msgid "Sun" +msgstr "S" + +msgid "January" +msgstr "sausis" + +msgid "February" +msgstr "vasaris" + +msgid "March" +msgstr "kovas" + +msgid "April" +msgstr "balandis" + +msgid "May" +msgstr "gegužė" + +msgid "June" +msgstr "birželis" + +msgid "July" +msgstr "liepa" + +msgid "August" +msgstr "rugpjūtis" + +msgid "September" +msgstr "rugsėjis" + +msgid "October" +msgstr "spalis" + +msgid "November" +msgstr "lapkritis" + +msgid "December" +msgstr "gruodis" + +msgid "jan" +msgstr "sau" + +msgid "feb" +msgstr "vas" + +msgid "mar" +msgstr "kov" + +msgid "apr" +msgstr "bal" + +msgid "may" +msgstr "geg" + +msgid "jun" +msgstr "bir" + +msgid "jul" +msgstr "lie" + +msgid "aug" +msgstr "rugp" + +msgid "sep" +msgstr "rugs" + +msgid "oct" +msgstr "spa" + +msgid "nov" +msgstr "lap" + +msgid "dec" +msgstr "grd" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "saus." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "vas." + +msgctxt "abbrev. month" +msgid "March" +msgstr "kov." + +msgctxt "abbrev. month" +msgid "April" +msgstr "bal." + +msgctxt "abbrev. month" +msgid "May" +msgstr "geg." + +msgctxt "abbrev. month" +msgid "June" +msgstr "birž." + +msgctxt "abbrev. month" +msgid "July" +msgstr "liep." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "rugpj." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "rugs." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "spal." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "lapkr." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "gruod." + +msgctxt "alt. month" +msgid "January" +msgstr "sausio" + +msgctxt "alt. month" +msgid "February" +msgstr "vasario" + +msgctxt "alt. month" +msgid "March" +msgstr "kovo" + +msgctxt "alt. month" +msgid "April" +msgstr "balandžio" + +msgctxt "alt. month" +msgid "May" +msgstr "gegužės" + +msgctxt "alt. month" +msgid "June" +msgstr "birželio" + +msgctxt "alt. month" +msgid "July" +msgstr "liepos" + +msgctxt "alt. month" +msgid "August" +msgstr "rugpjūčio" + +msgctxt "alt. month" +msgid "September" +msgstr "rugsėjo" + +msgctxt "alt. month" +msgid "October" +msgstr "spalio" + +msgctxt "alt. month" +msgid "November" +msgstr "lapkričio" + +msgctxt "alt. month" +msgid "December" +msgstr "gruodžio" + +msgid "This is not a valid IPv6 address." +msgstr "Tai nėra teisingas IPv6 adresas." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "arba" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d metas" +msgstr[1] "%d metai" +msgstr[2] "%d metų" +msgstr[3] "%d metų" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mėnuo" +msgstr[1] "%d mėnesiai" +msgstr[2] "%d mėnesių" +msgstr[3] "%d mėnesių" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d savaitė" +msgstr[1] "%d savaitės" +msgstr[2] "%d savaičių" +msgstr[3] "%d savaičių" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d diena" +msgstr[1] "%d dienos" +msgstr[2] "%d dienų" +msgstr[3] "%d dienų" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d valanda" +msgstr[1] "%d valandos" +msgstr[2] "%d valandų" +msgstr[3] "%d valandų" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutė" +msgstr[1] "%d minutės" +msgstr[2] "%d minučių" +msgstr[3] "%d minučių" + +msgid "0 minutes" +msgstr "0 minučių" + +msgid "Forbidden" +msgstr "Uždrausta" + +msgid "CSRF verification failed. Request aborted." +msgstr "Nepavyko CSRF patvirtinimas. Užklausa nutraukta." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Jūs matote šią žinutę nes šis HTTPS puslapis reikalauja kad Jūsų naršyklė " +"siųstų 'Referer header', bet jis nebuvo išsiųstas. Šis 'Header' " +"reikalaujamas saugumo sumetimais, kad užtikrinti jog jūsų naršyklė nėra " +"užgrobiama trečiųjų asmenų." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Jeigu Jūsų naršyklėje išjungti 'Referer headers', prašome juos įjungti, bent " +"jau šitame tinklalapyje, arba HTTPS prisijungimams, arba 'same-origin' " +"užklausoms." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Jei naudojate žymeną " +"pridedate 'Referrer-Policy: no-referrer' antraštę, prašome juo panaikinti. " +"CSRF apsauga reikalauja 'Referer' antraštės vykdyti griežtą patikrinimą. Jei " +"esate susirūpinę privatumu, naudokite tokias alternatyvas nuorodoms į " +"išorinius tinklalapius kaip ." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Jūs matote šią žinutę nes šis puslapis reikalauja CSRF slapuko, kai " +"pateikiama forma. Slapukas reikalaujamas saugumo sumetimais, kad užtikrinti " +"jog jūsų naršyklė nėra užgrobiama trečiųjų asmenų." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Jeigu Jūsų naršyklėje išjungti slapukai, prašome juos įjungti, bent jau " +"šitame tinklalapyje, arba 'same-origin' užklausoms." + +msgid "More information is available with DEBUG=True." +msgstr "Gauti daugiau informacijos galima su DEBUG=True nustatymu." + +msgid "No year specified" +msgstr "Nenurodyti metai" + +msgid "Date out of range" +msgstr "Data išeina iš ribų" + +msgid "No month specified" +msgstr "Nenurodytas mėnuo" + +msgid "No day specified" +msgstr "Nenurodyta diena" + +msgid "No week specified" +msgstr "Nenurodyta savaitė" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Nėra %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Ateities %(verbose_name_plural)s nėra prieinami, nes %(class_name)s." +"allow_future yra False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Data '%(datestr)s' neatitinka formato '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Atitinkantis užklausą %(verbose_name)s nerastas" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" +"Puslapis nėra 'paskutinis', taip pat negali būti paverstas į sveiką skaičių." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Neegzistuojantis puslapis (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Tuščias sąrašas ir '%(class_name)s.allow_empty' yra False." + +msgid "Directory indexes are not allowed here." +msgstr "Aplankų indeksai čia neleidžiami." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" neegzistuoja" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s indeksas" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: Žiniatinklio karkasas perfekcionistams su terminais." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Žiūrėti Django %(version)s išleidimo " +"pastabas" + +msgid "The install worked successfully! Congratulations!" +msgstr "Diegimas pavyko! Sveikiname!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Jūs matote šią žinutę dėl to kad Django nustatymų faile įvesta DEBUG = True ir Jūs nenustatėte jokių URL'ų." + +msgid "Django Documentation" +msgstr "Django dokumentacija" + +msgid "Topics, references, & how-to's" +msgstr "Temos, nuorodos ir & kaip tai padaryti" + +msgid "Tutorial: A Polling App" +msgstr "Pamoka: Apklausos aplikacija" + +msgid "Get started with Django" +msgstr "Pradėti su Django" + +msgid "Django Community" +msgstr "Django Bendrija" + +msgid "Connect, get help, or contribute" +msgstr "Prisijunk, gauk pagalbą arba prisidėk" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..659db90 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mk/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/mk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f09d900 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po new file mode 100644 index 0000000..756331e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/mn/LC_MESSAGES/django.po @@ -0,0 +1,1274 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ankhbayar , 2013 +# Bayarkhuu Bataa, 2014,2017-2018 +# Baskhuu Lodoikhuu , 2011 +# Jannis Leidel , 2011 +# jargalan , 2011 +# Tsolmon , 2011 +# Zorig, 2013-2014,2016,2018 +# Zorig, 2019 +# Анхбаяр Анхаа , 2013-2016,2018-2019 +# Баясгалан Цэвлээ , 2011,2015,2017 +# Ганзориг БП , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-19 08:42+0000\n" +"Last-Translator: Анхбаяр Анхаа \n" +"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Африк" + +msgid "Arabic" +msgstr "Араб" + +msgid "Asturian" +msgstr "Астури" + +msgid "Azerbaijani" +msgstr "Азербажан" + +msgid "Bulgarian" +msgstr "Болгар" + +msgid "Belarusian" +msgstr "Беларус" + +msgid "Bengali" +msgstr "Бенгал" + +msgid "Breton" +msgstr "Бэрэйтон " + +msgid "Bosnian" +msgstr "Босни" + +msgid "Catalan" +msgstr "Каталан" + +msgid "Czech" +msgstr "Чех" + +msgid "Welsh" +msgstr "Уэльс" + +msgid "Danish" +msgstr "Дани" + +msgid "German" +msgstr "Герман" + +msgid "Lower Sorbian" +msgstr "Доод Сорбин" + +msgid "Greek" +msgstr "Грек" + +msgid "English" +msgstr "Англи" + +msgid "Australian English" +msgstr "Австрали Англи" + +msgid "British English" +msgstr "Британи Англи" + +msgid "Esperanto" +msgstr "Эсперанто" + +msgid "Spanish" +msgstr "Испани" + +msgid "Argentinian Spanish" +msgstr "Аргентинийн Испани" + +msgid "Colombian Spanish" +msgstr "Колумбийн Испаниар" + +msgid "Mexican Spanish" +msgstr "Мексикийн Испани" + +msgid "Nicaraguan Spanish" +msgstr "Никрагуан Испани" + +msgid "Venezuelan Spanish" +msgstr "Венесуэлийн Спани" + +msgid "Estonian" +msgstr "Эстони" + +msgid "Basque" +msgstr "Баск" + +msgid "Persian" +msgstr "Перс" + +msgid "Finnish" +msgstr "Финлянд" + +msgid "French" +msgstr "Франц" + +msgid "Frisian" +msgstr "Фриз" + +msgid "Irish" +msgstr "Ирланд" + +msgid "Scottish Gaelic" +msgstr "Шотландийн Гаелик" + +msgid "Galician" +msgstr "Галици" + +msgid "Hebrew" +msgstr "Еврэй" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Хорват" + +msgid "Upper Sorbian" +msgstr "Дээд Сорбин" + +msgid "Hungarian" +msgstr "Унгар" + +msgid "Armenian" +msgstr "Армен" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Индонези" + +msgid "Ido" +msgstr "Идо" + +msgid "Icelandic" +msgstr "Исланд" + +msgid "Italian" +msgstr "Итали" + +msgid "Japanese" +msgstr "Япон" + +msgid "Georgian" +msgstr "Гүрж" + +msgid "Kabyle" +msgstr "Кабилэ" + +msgid "Kazakh" +msgstr "Казак" + +msgid "Khmer" +msgstr "Кхмер" + +msgid "Kannada" +msgstr "Канад" + +msgid "Korean" +msgstr "Солонгос" + +msgid "Luxembourgish" +msgstr "Лүксенбүргиш" + +msgid "Lithuanian" +msgstr "Литва" + +msgid "Latvian" +msgstr "Латви" + +msgid "Macedonian" +msgstr "Македон" + +msgid "Malayalam" +msgstr "Малайз" + +msgid "Mongolian" +msgstr "Монгол" + +msgid "Marathi" +msgstr "маратхи" + +msgid "Burmese" +msgstr "Бирм" + +msgid "Norwegian Bokmål" +msgstr "Норвеги Бокмал" + +msgid "Nepali" +msgstr "Непал" + +msgid "Dutch" +msgstr "Голланд" + +msgid "Norwegian Nynorsk" +msgstr "Норвегийн нюнорск" + +msgid "Ossetic" +msgstr "Оссетик" + +msgid "Punjabi" +msgstr "Панжаби" + +msgid "Polish" +msgstr "Польш" + +msgid "Portuguese" +msgstr "Португал" + +msgid "Brazilian Portuguese" +msgstr "Бразилийн Португали" + +msgid "Romanian" +msgstr "Румын" + +msgid "Russian" +msgstr "Орос" + +msgid "Slovak" +msgstr "Словак" + +msgid "Slovenian" +msgstr "Словен" + +msgid "Albanian" +msgstr "Альбани" + +msgid "Serbian" +msgstr "Серби" + +msgid "Serbian Latin" +msgstr "Серби латин" + +msgid "Swedish" +msgstr "Щвед" + +msgid "Swahili" +msgstr "Савахил" + +msgid "Tamil" +msgstr "Тамил" + +msgid "Telugu" +msgstr "Тэлүгү" + +msgid "Thai" +msgstr "Тайланд" + +msgid "Turkish" +msgstr "Турк" + +msgid "Tatar" +msgstr "Татар" + +msgid "Udmurt" +msgstr "Удмурт" + +msgid "Ukrainian" +msgstr "Украйн" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнам" + +msgid "Simplified Chinese" +msgstr "Хятад (хялбаршуулсан) " + +msgid "Traditional Chinese" +msgstr "Хятад (уламжлалт)" + +msgid "Messages" +msgstr "Мэдээллүүд" + +msgid "Site Maps" +msgstr "Сайтын бүтэц" + +msgid "Static Files" +msgstr "Статик файлууд" + +msgid "Syndication" +msgstr "Нэгтгэл" + +msgid "That page number is not an integer" +msgstr "Хуудасны дугаар бүхэл тоо / Integer / биш байна" + +msgid "That page number is less than 1" +msgstr "Хуудасны дугаар 1-ээс байга байна" + +msgid "That page contains no results" +msgstr "Хуудас үр дүн агуулаагүй байна" + +msgid "Enter a valid value." +msgstr "Зөв утга оруулна уу." + +msgid "Enter a valid URL." +msgstr "Зөв, хүчинтэй хаяг (URL) оруулна уу." + +msgid "Enter a valid integer." +msgstr "Бүхэл тоо оруулна уу" + +msgid "Enter a valid email address." +msgstr "Зөв имэйл хаяг оруулна уу" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Үсэг, тоо, доогуур зураас, дундуур зурааснаас бүрдэх зөв 'slug' оруулна уу." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Үсэг, тоо, доогуур зураас, дундуур зурааснаас бүрдэх зөв 'slug' оруулна уу." + +msgid "Enter a valid IPv4 address." +msgstr "Зөв IPv4 хаяг оруулна уу. " + +msgid "Enter a valid IPv6 address." +msgstr "Зөв IPv6 хаяг оруулна уу." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Зөв IPv4 эсвэл IPv6 хаяг оруулна уу." + +msgid "Enter only digits separated by commas." +msgstr "Зөвхөн таслалаар тусгаарлагдсан цифр оруулна уу." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Энэ утга хамгийн ихдээ %(limit_value)s байх ёстой. (одоо %(show_value)s " +"байна)" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Энэ утга %(limit_value)s -с бага эсвэл тэнцүү байх ёстой." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Энэ утга %(limit_value)s -с их эсвэл тэнцүү байх нөхцлийг хангана уу." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " +"(%(show_value)d-ийн дагуу)" +msgstr[1] "" +"Хамгийн ихдээ %(limit_value)d тэмдэгт байх нөхцлийг хангана уу. " +"(%(show_value)d-ийн дагуу)" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[1] "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Тоон утга оруулна уу." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "%(max)s -ээс ихгүй утга оруулна уу " +msgstr[1] "%(max)s -ээс ихгүй утга оруулна уу " + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " +msgstr[1] "Энд %(max)s -аас олонгүй бутархайн орон байх ёстой. " + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." +msgstr[1] "Энд бутархайн таслалаас өмнө %(max)s-аас олонгүй цифр байх ёстой." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Файлын '%(extension)s' өргөтгөл зөвшөөрөгдөөгүй байна. Дараах өргөтгөлүүд " +"зөвшөөрөгдсөн: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Хоосон тэмдэгт зөвшөөрөгдөхгүй." + +msgid "and" +msgstr "ба" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(field_labels)s талбар бүхий %(model_name)s аль хэдийн орсон байна." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r буруу сонголт байна." + +msgid "This field cannot be null." +msgstr "Энэ хэсгийг хоосон орхиж болохгүй." + +msgid "This field cannot be blank." +msgstr "Энэ хэсэг хоосон байж болохгүй." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(field_label)s-тэй %(model_name)s-ийг аль хэдийнэ оруулсан байна." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s талбарт давхардахгүй байх хэрэгтэй %(date_field_label)s " +"%(lookup_type)s оруулна." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Талбарийн төрөл нь : %(field_type)s" + +msgid "Integer" +msgstr "Бүхэл тоо" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' бүхэл тоо байх ёстой." + +msgid "Big (8 byte) integer" +msgstr "Том (8 байт) бүхэл тоо" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' заавал True эсвэл False утга авах." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' утга True,False, None ийн аль нэг байх ёстой." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (Үнэн худлын аль нэг нь)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Бичвэр (%(max_length)s хүртэл)" + +msgid "Comma-separated integers" +msgstr "Таслалаар тусгаарлагдсан бүхэл тоо" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "'%(value)s' нь буруу байна. Энэ нь ОООО-СС-ӨӨ форматтай байх ёстой." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "'%(value)s' утга (YYYY-MM-DD) форматтай байх хэрэгтэй." + +msgid "Date (without time)" +msgstr "Огноо (цаггүй)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' утга буруу форматтай байна. Формат нь заавал YYYY-MM-DD HH:MM[:" +"ss[.uuuuuu]][TZ] байх хэрэгтэй." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' утга зөв форматтай байна(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"гэвч буруу огноо/цаг байна. " + +msgid "Date (with time)" +msgstr "Огноо (цагтай)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' заавал decimal утга байх." + +msgid "Decimal number" +msgstr "Аравтын бутархайт тоо" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' утга буруу форматтай байна. Формат нь заавал [DD] [HH:[MM:]]ss[." +"uuuuuu] байх хэрэгтэй." + +msgid "Duration" +msgstr "Үргэлжлэх хугацаа" + +msgid "Email address" +msgstr "Имэйл хаяг" + +msgid "File path" +msgstr "Файлын зам " + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' нь бутархай тоо байх ёстой." + +msgid "Floating point number" +msgstr "Хөвөгч таслалтай тоо" + +msgid "IPv4 address" +msgstr "IPv4 хаяг" + +msgid "IP address" +msgstr "IP хаяг" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' заавал None, True эсвэл False утга авах ёстой." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (Үнэн, худал, эсвэл юу ч биш)" + +msgid "Positive integer" +msgstr "Бүхэл тоох утга" + +msgid "Positive small integer" +msgstr "Бага бүхэл тоон утга" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Слаг (ихдээ %(max_length)s )" + +msgid "Small integer" +msgstr "Бага тоон утна" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' утга буруу форматтай байна. Формат нь заавал HH:MM[:ss[.uuuuuu]] " +"байх хэрэгтэй." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' утгын формат зөв байна (HH:MM[:ss[.uuuuuu]]) гэвч цаг буруу " +"байна." + +msgid "Time" +msgstr "Цаг" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Бинари өгөгдөл" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' утга зөв UUID биш байна." + +msgid "Universally unique identifier" +msgstr "UUID" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Зураг" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(field)s %(value)r утгатай %(model)s байхгүй байна." + +msgid "Foreign Key (type determined by related field)" +msgstr "Гадаад түлхүүр (тодорхой төрлийн холбоос талбар)" + +msgid "One-to-one relationship" +msgstr "Нэг-нэг холбоос" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s холбоос" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s холбоосууд" + +msgid "Many-to-many relationship" +msgstr "Олон-олон холбоос" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Энэ талбарыг бөглөх шаардлагатай." + +msgid "Enter a whole number." +msgstr "Бүхэл тоон утга оруулна уу." + +msgid "Enter a valid date." +msgstr "Зөв огноо оруулна уу." + +msgid "Enter a valid time." +msgstr "Зөв цаг оруулна уу." + +msgid "Enter a valid date/time." +msgstr "Огноо/цаг-ыг зөв оруулна уу." + +msgid "Enter a valid duration." +msgstr "Үргэлжилэх хугацааг зөв оруулна уу." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Өдөрийн утга {min_days} ээс {max_days} ийн хооронд байх ёстой." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Файл оруулаагүй байна. Маягтаас кодлох төрлийг чагтал. " + +msgid "No file was submitted." +msgstr "Файл оруулаагүй байна." + +msgid "The submitted file is empty." +msgstr "Оруулсан файл хоосон байна. " + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[1] "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Нэг бол сонголтын чягтыг авах эсвэл файл оруулна уу. Зэрэг хэрэгжих " +"боломжгүй." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Зөв зураг оруулна уу. Таны оруулсан файл нэг бол зургийн файл биш эсвэл " +"гэмтсэн зураг байна." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Зөв сонголт хийнэ үү. %(value)s гэсэн сонголт байхгүй байна." + +msgid "Enter a list of values." +msgstr "Өгөгдхүүний жагсаалтаа оруулна уу." + +msgid "Enter a complete value." +msgstr "Бүрэн утга оруулна уу." + +msgid "Enter a valid UUID." +msgstr "Зөв UUID оруулна уу." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Нууц талбар%(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "УдирдахФормын мэдээлэл олдсонгүй эсвэл өөрчлөгдсөн байна" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "%d ихгүй форм илгээн үү" +msgstr[1] "%d ихгүй форм илгээн үү" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "%d эсвэл их форм илгээнэ үү" +msgstr[1] "%d эсвэл их форм илгээнэ үү" + +msgid "Order" +msgstr "Эрэмбэлэх" + +msgid "Delete" +msgstr "Устгах" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s хэсэг дэх давхардсан утгыг засварлана уу. " + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s хэсэг дэх давхардсан утгыг засварлана уу. Түүний утгууд " +"давхардахгүй байх ёстой." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s хэсэг дэх давхардсан утгыг засварлана уу. %(date_field)s-н " +"%(lookup)s хувьд давхардахгүй байх ёстой." + +msgid "Please correct the duplicate values below." +msgstr "Доорх давхардсан утгуудыг засна уу." + +msgid "The inline value did not match the parent instance." +msgstr "Inline утга эцэг обекттой таарахгүй байна." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Зөв сонголт хийнэ үү. Энэ утга сонголтонд алга." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" зөв утга биш байна." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s цагийн бүсийг хөрвүүлэж чадахгүй байна. %(current_timezone)s; " +"цагийн бүс буруу эсвэл байхгүй байж магадгүй." + +msgid "Clear" +msgstr "Цэвэрлэх" + +msgid "Currently" +msgstr "Одоогийн" + +msgid "Change" +msgstr "Засах" + +msgid "Unknown" +msgstr "Тодорхойгүй" + +msgid "Yes" +msgstr "Тийм" + +msgid "No" +msgstr "Үгүй" + +msgid "yes,no,maybe" +msgstr "тийм,үгүй,магадгүй" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" +msgstr[1] "%(size)d байт" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "шөнө дунд" + +msgid "noon" +msgstr "үд дунд" + +msgid "Monday" +msgstr "Даваа гариг" + +msgid "Tuesday" +msgstr "Мягмар гариг" + +msgid "Wednesday" +msgstr "Лхагва гариг" + +msgid "Thursday" +msgstr "Пүрэв гариг" + +msgid "Friday" +msgstr "Баасан гариг" + +msgid "Saturday" +msgstr "Бямба гариг" + +msgid "Sunday" +msgstr "Ням гариг" + +msgid "Mon" +msgstr "Дав" + +msgid "Tue" +msgstr "Мяг" + +msgid "Wed" +msgstr "Лха" + +msgid "Thu" +msgstr "Пүр" + +msgid "Fri" +msgstr "Баа" + +msgid "Sat" +msgstr "Бям" + +msgid "Sun" +msgstr "Ням" + +msgid "January" +msgstr "1-р сар" + +msgid "February" +msgstr "2-р сар" + +msgid "March" +msgstr "3-р сар" + +msgid "April" +msgstr "4-р сар" + +msgid "May" +msgstr "5-р сар" + +msgid "June" +msgstr "6-р сар" + +msgid "July" +msgstr "7-р сар" + +msgid "August" +msgstr "8-р сар" + +msgid "September" +msgstr "9-р сар" + +msgid "October" +msgstr "10-р сар" + +msgid "November" +msgstr "11-р сар" + +msgid "December" +msgstr "12-р сар" + +msgid "jan" +msgstr "1-р сар" + +msgid "feb" +msgstr "2-р сар" + +msgid "mar" +msgstr "3-р сар" + +msgid "apr" +msgstr "4-р сар" + +msgid "may" +msgstr "5-р сар" + +msgid "jun" +msgstr "6-р сар" + +msgid "jul" +msgstr "7-р сар" + +msgid "aug" +msgstr "8-р сар " + +msgid "sep" +msgstr "9-р сар" + +msgid "oct" +msgstr "10-р сар" + +msgid "nov" +msgstr "11-р сар" + +msgid "dec" +msgstr "12-р сар" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "1-р сар." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "2-р сар." + +msgctxt "abbrev. month" +msgid "March" +msgstr "3-р сар." + +msgctxt "abbrev. month" +msgid "April" +msgstr "4-р сар." + +msgctxt "abbrev. month" +msgid "May" +msgstr "5-р сар." + +msgctxt "abbrev. month" +msgid "June" +msgstr "6-р сар." + +msgctxt "abbrev. month" +msgid "July" +msgstr "7-р сар." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "8-р сар." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "9-р сар." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "10-р сар." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "11-р сар." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "12-р сар." + +msgctxt "alt. month" +msgid "January" +msgstr "Хулгана" + +msgctxt "alt. month" +msgid "February" +msgstr "Үхэр" + +msgctxt "alt. month" +msgid "March" +msgstr "Бар" + +msgctxt "alt. month" +msgid "April" +msgstr "Туулай" + +msgctxt "alt. month" +msgid "May" +msgstr "Луу" + +msgctxt "alt. month" +msgid "June" +msgstr "Могой" + +msgctxt "alt. month" +msgid "July" +msgstr "Морь" + +msgctxt "alt. month" +msgid "August" +msgstr "Хонь" + +msgctxt "alt. month" +msgid "September" +msgstr "Бич" + +msgctxt "alt. month" +msgid "October" +msgstr "Тахиа" + +msgctxt "alt. month" +msgid "November" +msgstr "Нохой" + +msgctxt "alt. month" +msgid "December" +msgstr "Гахай" + +msgid "This is not a valid IPv6 address." +msgstr "Энэ буруу IPv6 хаяг байна." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "буюу" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d жил" +msgstr[1] "%d жил" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d сар" +msgstr[1] "%d сар" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d долоо хоног" +msgstr[1] "%d долоо хоног" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d өдөр" +msgstr[1] "%d өдөр" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d цаг" +msgstr[1] "%d цаг" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минут" + +msgid "0 minutes" +msgstr "0 минут" + +msgid "Forbidden" +msgstr "Хориотой" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF дээр уналаа. Хүсэлт таслагдсан." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Таны веб хөтөчөөс 'Referer header'-ийг HTTPS хуудасд илгээх шаардлагатай " +"байдаг учир Та энэ мэдэгдлийг харж байна. Энэ нь гуравдагч этгээдээс " +"хамгаалахын тулд шаардлагатай." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Хэрвээ та веб хөтөчөө 'Referer' толгойг идэвхигүй болгосон бол энэ хуудас, " +"HTTPS холболт эсвэл 'same-origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Хэрвээ та таг ашиглаж " +"байгаа бол эсвэл 'Referrer-Policy: no-referrer' толгойг нэмсэн бол, " +"эдгээрийг устгана уу. CSRF хамгаалалт 'Referer' толгойг чанд шалгалт хийхийг " +"шаарддаг. Хэрвээ та хувийн аюулгүй байдалд санаа тавьдаг бол 3-дагч сайтыг " +"холбохдоо ашиглана уу." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Энэ хуудсанд форм илгээхийн тулд CSRF күүки шаардлагатай учир Та энэ " +"мэдэгдлийг харж байна. Энэ күүки нь гуравдагч этгээдээс хамгаалахын тулд " +"шаардлагатай." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Хэрвээ та веб хөтөчийн күүкийг хаасан бол энэ хуудас эсвэл 'same-origin' " +"хүсэлтэнд зориулж идэвхижүүлнэ үү." + +msgid "More information is available with DEBUG=True." +msgstr "DEBUG=True үед дэлгэрэнгүй мэдээлэл харах боломжтой." + +msgid "No year specified" +msgstr "Он тодорхойлоогүй байна" + +msgid "Date out of range" +msgstr "Хугацааны хязгаар хэтэрсэн байна" + +msgid "No month specified" +msgstr "Сар тодорхойлоогүй байна" + +msgid "No day specified" +msgstr "Өдөр тодорхойлоогүй байна" + +msgid "No week specified" +msgstr "Долоо хоног тодорхойлоогүй байна" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s боломжгүй" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(class_name)s.allow_future нь худлаа учраас %(verbose_name_plural)s нь " +"боломжгүй." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"Буруу огноо. '%(datestr)s' огноо '%(format)s' хэлбэрт тохирохгүй байна." + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Шүүлтүүрт таарах %(verbose_name)s олдсонгүй " + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Хуудас нь 'last' биш, эсвэл тоонд хөрвүүлэж болохгүй байна." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Буруу хуудас (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" +"Жагсаалт хоосон байна бас '%(class_name)s.allow_empty' ийг False гэж өгсөн." + +msgid "Directory indexes are not allowed here." +msgstr "Файлын жагсаалтыг энд зөвшөөрөөгүй." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" байхгүй байна." + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s ийн жагсаалт" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Джанго: Чанартай бөгөөд хугацаанд нь хийхэд зориулсан Web framework." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Джанго %(version)s хувирбарын тэмдэглэл харах " + +msgid "The install worked successfully! Congratulations!" +msgstr "Амжилттай суулгалаа! Баяр хүргэе!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Таний тохиргооны файл дээр DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо хийгээгүй учраас " +"энэ хуудасыг харж байна." + +msgid "Django Documentation" +msgstr "Джанго баримтжуулалт" + +msgid "Topics, references, & how-to's" +msgstr "Сэдэв, лавлахууд болон заавар-ууд" + +msgid "Tutorial: A Polling App" +msgstr "Хичээл: Санал асуулга App" + +msgid "Get started with Django" +msgstr "Джанготой ажиллаж эхлэх" + +msgid "Django Community" +msgstr "Django Бүлгэм" + +msgid "Connect, get help, or contribute" +msgstr "Холбогдох, тусламж авах эсвэл хувь нэмрээ оруулах" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mn/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/mn/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/mn/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/mn/formats.py new file mode 100644 index 0000000..24c7dec --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/mn/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'd F Y' +TIME_FORMAT = 'g:i A' +# DATETIME_FORMAT = +# YEAR_MONTH_FORMAT = +# MONTH_DAY_FORMAT = +SHORT_DATE_FORMAT = 'j M Y' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +# DECIMAL_SEPARATOR = +# THOUSAND_SEPARATOR = +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..eb536cd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,1271 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alexander Hansen , 2014 +# Eirik Krogstad , 2014 +# Jannis Leidel , 2011 +# jensadne , 2014-2015 +# Jon , 2015-2016 +# Jon , 2014 +# Jon , 2017-2019 +# Jon , 2013 +# Jon , 2011 +# Sigurd Gartmann , 2012 +# Tommy Strand , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-05-06 13:02+0000\n" +"Last-Translator: Jon \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arabisk" + +msgid "Asturian" +msgstr "Asturiansk" + +msgid "Azerbaijani" +msgstr "Aserbajdsjansk" + +msgid "Bulgarian" +msgstr "Bulgarsk" + +msgid "Belarusian" +msgstr "Hviterussisk" + +msgid "Bengali" +msgstr "Bengalsk" + +msgid "Breton" +msgstr "Bretonsk" + +msgid "Bosnian" +msgstr "Bosnisk" + +msgid "Catalan" +msgstr "Katalansk" + +msgid "Czech" +msgstr "Tsjekkisk" + +msgid "Welsh" +msgstr "Walisisk" + +msgid "Danish" +msgstr "Dansk" + +msgid "German" +msgstr "Tysk" + +msgid "Lower Sorbian" +msgstr "Lavsorbisk" + +msgid "Greek" +msgstr "Gresk" + +msgid "English" +msgstr "Engelsk" + +msgid "Australian English" +msgstr "Engelsk (australsk)" + +msgid "British English" +msgstr "Engelsk (britisk)" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spansk" + +msgid "Argentinian Spanish" +msgstr "Argentinsk spansk" + +msgid "Colombian Spanish" +msgstr "Colombiansk spansk" + +msgid "Mexican Spanish" +msgstr "Meksikansk spansk" + +msgid "Nicaraguan Spanish" +msgstr "Nicaraguansk spansk" + +msgid "Venezuelan Spanish" +msgstr "Venezuelanske spansk" + +msgid "Estonian" +msgstr "Estisk" + +msgid "Basque" +msgstr "Baskisk" + +msgid "Persian" +msgstr "Persisk" + +msgid "Finnish" +msgstr "Finsk" + +msgid "French" +msgstr "Fransk" + +msgid "Frisian" +msgstr "Frisisk" + +msgid "Irish" +msgstr "Irsk" + +msgid "Scottish Gaelic" +msgstr "Skotsk-gælisk" + +msgid "Galician" +msgstr "Galisisk" + +msgid "Hebrew" +msgstr "Hebraisk" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Kroatisk" + +msgid "Upper Sorbian" +msgstr "Høysorbisk" + +msgid "Hungarian" +msgstr "Ungarsk" + +msgid "Armenian" +msgstr "Armensk" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonesisk" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandsk" + +msgid "Italian" +msgstr "Italiensk" + +msgid "Japanese" +msgstr "Japansk" + +msgid "Georgian" +msgstr "Georgisk" + +msgid "Kabyle" +msgstr "Kabylsk" + +msgid "Kazakh" +msgstr "Kasakhisk" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreansk" + +msgid "Luxembourgish" +msgstr "Luxembourgsk" + +msgid "Lithuanian" +msgstr "Litauisk" + +msgid "Latvian" +msgstr "Latvisk" + +msgid "Macedonian" +msgstr "Makedonsk" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Mongolsk" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Burmese" +msgstr "Burmesisk" + +msgid "Norwegian Bokmål" +msgstr "Norsk (bokmål)" + +msgid "Nepali" +msgstr "Nepali" + +msgid "Dutch" +msgstr "Nederlandsk" + +msgid "Norwegian Nynorsk" +msgstr "Norsk (nynorsk)" + +msgid "Ossetic" +msgstr "Ossetisk" + +msgid "Punjabi" +msgstr "Panjabi" + +msgid "Polish" +msgstr "Polsk" + +msgid "Portuguese" +msgstr "Portugisisk" + +msgid "Brazilian Portuguese" +msgstr "Brasiliansk portugisisk" + +msgid "Romanian" +msgstr "Rumensk" + +msgid "Russian" +msgstr "Russisk" + +msgid "Slovak" +msgstr "Slovakisk" + +msgid "Slovenian" +msgstr "Slovensk" + +msgid "Albanian" +msgstr "Albansk" + +msgid "Serbian" +msgstr "Serbisk" + +msgid "Serbian Latin" +msgstr "Serbisk latin" + +msgid "Swedish" +msgstr "Svensk" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamil" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Thai" +msgstr "Thai" + +msgid "Turkish" +msgstr "Tyrkisk" + +msgid "Tatar" +msgstr "Tatarisk" + +msgid "Udmurt" +msgstr "Udmurtisk" + +msgid "Ukrainian" +msgstr "Ukrainsk" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vietnamesisk" + +msgid "Simplified Chinese" +msgstr "Forenklet kinesisk" + +msgid "Traditional Chinese" +msgstr "Tradisjonell kinesisk" + +msgid "Messages" +msgstr "Meldinger" + +msgid "Site Maps" +msgstr "Sidekart" + +msgid "Static Files" +msgstr "Statiske filer" + +msgid "Syndication" +msgstr "Syndikering" + +msgid "That page number is not an integer" +msgstr "Sidenummeret er ikke et heltall" + +msgid "That page number is less than 1" +msgstr "Sidenummeret er mindre enn 1" + +msgid "That page contains no results" +msgstr "Siden inneholder ingen resultater" + +msgid "Enter a valid value." +msgstr "Oppgi en gyldig verdi." + +msgid "Enter a valid URL." +msgstr "Oppgi en gyldig nettadresse." + +msgid "Enter a valid integer." +msgstr "Skriv inn et gyldig heltall." + +msgid "Enter a valid email address." +msgstr "Oppgi en gyldig e-postadresse" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Oppgi en gyldig «slug» bestående av bokstaver, nummer, understreker eller " +"bindestreker." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Oppgi en gyldig «slug» bestående av Unicode-bokstaver, nummer, understreker " +"eller bindestreker." + +msgid "Enter a valid IPv4 address." +msgstr "Oppgi en gyldig IPv4-adresse." + +msgid "Enter a valid IPv6 address." +msgstr "Oppgi en gyldig IPv6-adresse." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Oppgi en gyldig IPv4- eller IPv6-adresse." + +msgid "Enter only digits separated by commas." +msgstr "Oppgi kun tall adskilt med komma." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Verdien må være %(limit_value)s (den er %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Verdien må være mindre enn eller lik %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Verdien må være større enn eller lik %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Sørg for denne verdien har minst %(limit_value)d tegn (den har " +"%(show_value)d)." +msgstr[1] "" +"Sørg for at denne verdien har minst %(limit_value)d tegn (den har " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Sørg for denne verdien har %(limit_value)d tegn (den har nå %(show_value)d)." +msgstr[1] "" +"Sørg for at denne verdien har %(limit_value)d eller færre tegn (den har nå " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Oppgi et tall." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Sørg for at det er kun %(max)s tall." +msgstr[1] "Sørg for at det er %(max)s eller færre tall totalt." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Sørg for at det er kun %(max)s desimal." +msgstr[1] "Sørg for at det er %(max)s eller færre desimaler." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Sørg for at det kun %(max)s tall før desimalpunkt." +msgstr[1] "Sørg for at det er %(max)s eller færre tall før desimalpunkt." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Filendelsen '%(extension)s' er ikke tillatt. Tillatte filendelser er: " +"'%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Null-tegn er ikke tillatt." + +msgid "and" +msgstr "og" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s med denne %(field_labels)s finnes allerede." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Verdien %(value)r er ikke et gyldig valg." + +msgid "This field cannot be null." +msgstr "Feltet kan ikke være tomt." + +msgid "This field cannot be blank." +msgstr "Feltet kan ikke være blankt." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s med %(field_label)s finnes allerede." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "%(field_label)s må være unik for %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Felt av typen: %(field_type)s" + +msgid "Integer" +msgstr "Heltall" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Verdien '%(value)s' må være et heltall." + +msgid "Big (8 byte) integer" +msgstr "Stort (8 byte) heltall" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Verdien '%(value)s' må være enten True eller False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s'-verdien må være enten True, False, eller None." + +msgid "Boolean (Either True or False)" +msgstr "Boolsk (True eller False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Tekst (opp til %(max_length)s tegn)" + +msgid "Comma-separated integers" +msgstr "Heltall adskilt med komma" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Verdien '%(value)s' har ugyldig datoformat. Den må være i formatet ÅÅÅÅ-MM-" +"DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Verdien '%(value)s' har riktig format (ÅÅÅÅ-MM-DD), men er en ugyldig dato." + +msgid "Date (without time)" +msgstr "Dato (uten tid)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s'-verdien har et ugyldig format. Det må være på formen YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s'-verdien er på den korrekte formen (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), men er ugyldig dato/tid." + +msgid "Date (with time)" +msgstr "Dato (med tid)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Verdien '%(value)s' må være et desimaltall." + +msgid "Decimal number" +msgstr "Desimaltall" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s'-verdien har et ugyldig format. Det må være på formen [DD] [HH:" +"[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Varighet" + +msgid "Email address" +msgstr "E-postadresse" + +msgid "File path" +msgstr "Filsti" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "Verdien '%(value)s' må være et flyttall." + +msgid "Floating point number" +msgstr "Flyttall" + +msgid "IPv4 address" +msgstr "IPv4-adresse" + +msgid "IP address" +msgstr "IP-adresse" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Verdien '%(value)s' må være enten None, True eller False." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolsk (True, False eller None)" + +msgid "Positive integer" +msgstr "Positivt heltall" + +msgid "Positive small integer" +msgstr "Positivt lite heltall" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (opp til %(max_length)s)" + +msgid "Small integer" +msgstr "Lite heltall" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Verdien '%(value)s' er i et ugyldig format. Formatet må være HH:MM[:ss[." +"uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Verdien '%(value)s' har riktig format (HH:MM[:ss[.uuuuuu]]), men er ikke et " +"gyldig klokkeslett." + +msgid "Time" +msgstr "Tid" + +msgid "URL" +msgstr "Nettadresse" + +msgid "Raw binary data" +msgstr "Rå binærdata" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' er ikke en gyldig UUID." + +msgid "Universally unique identifier" +msgstr "Universelt unik identifikator" + +msgid "File" +msgstr "Fil" + +msgid "Image" +msgstr "Bilde" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s-instansen med %(field)s %(value)r finnes ikke." + +msgid "Foreign Key (type determined by related field)" +msgstr "Fremmednøkkel (type bestemmes av relatert felt)" + +msgid "One-to-one relationship" +msgstr "En-til-en-relasjon" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s-relasjon" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s-relasjoner" + +msgid "Many-to-many relationship" +msgstr "Mange-til-mange-relasjon" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Feltet er påkrevet." + +msgid "Enter a whole number." +msgstr "Oppgi et heltall." + +msgid "Enter a valid date." +msgstr "Oppgi en gyldig dato." + +msgid "Enter a valid time." +msgstr "Oppgi et gyldig tidspunkt." + +msgid "Enter a valid date/time." +msgstr "Oppgi gyldig dato og tidspunkt." + +msgid "Enter a valid duration." +msgstr "Oppgi en gyldig varighet." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Antall dager må være mellom {min_days} og {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ingen fil ble sendt. Sjekk «encoding»-typen på skjemaet." + +msgid "No file was submitted." +msgstr "Ingen fil ble sendt." + +msgid "The submitted file is empty." +msgstr "Filen er tom." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "Sørg for at filnavnet har %(max)d tegn (det har nå %(length)d)." +msgstr[1] "" +"Sørg for at filnavnet har færre enn %(max)d tegn (det har nå %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Vennligst last opp en ny fil eller marker fjern-boksen, ikke begge." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Last opp et gyldig bilde. Filen du lastet opp var ødelagt eller ikke et " +"bilde." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Velg et gyldig valg. %(value)s er ikke et av de tilgjengelige valgene." + +msgid "Enter a list of values." +msgstr "Oppgi en liste med verdier." + +msgid "Enter a complete value." +msgstr "Skriv inn en fullstendig verdi." + +msgid "Enter a valid UUID." +msgstr "Oppgi en gyldig UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Skjult felt %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm-data mangler eller har blitt endret." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Vennligst oppgi %d skjema." +msgstr[1] "Vennligst oppgi %d eller færre skjema." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Vennligst send inn %d eller flere skjemaer." +msgstr[1] "Vennligst send inn %d eller flere skjemaer." + +msgid "Order" +msgstr "Rekkefølge" + +msgid "Delete" +msgstr "Slett" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Vennligst korriger dupliserte data for %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Vennligst korriger dupliserte data for %(field)s, som må være unike." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Vennligst korriger dupliserte data for %(field_name)s, som må være unike for " +"%(lookup)s i %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Vennligst korriger de dupliserte verdiene nedenfor." + +msgid "The inline value did not match the parent instance." +msgstr "Inline-verdien var ikke i samsvar med foreldre-instansen." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Velg et gyldig valg. Valget er ikke av de tilgjengelige valgene." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" er ikke en gyldig verdi." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s kunne ikke tolkes i tidssonen %(current_timezone)s, det kan " +"være tvetydig eller ikke eksistere." + +msgid "Clear" +msgstr "Fjern" + +msgid "Currently" +msgstr "Nåværende" + +msgid "Change" +msgstr "Endre" + +msgid "Unknown" +msgstr "Ukjent" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nei" + +msgid "yes,no,maybe" +msgstr "ja,nei,kanskje" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d byte" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "midnatt" + +msgid "noon" +msgstr "12:00" + +msgid "Monday" +msgstr "mandag" + +msgid "Tuesday" +msgstr "tirsdag" + +msgid "Wednesday" +msgstr "onsdag" + +msgid "Thursday" +msgstr "torsdag" + +msgid "Friday" +msgstr "fredag" + +msgid "Saturday" +msgstr "lørdag" + +msgid "Sunday" +msgstr "søndag" + +msgid "Mon" +msgstr "man" + +msgid "Tue" +msgstr "tir" + +msgid "Wed" +msgstr "ons" + +msgid "Thu" +msgstr "tor" + +msgid "Fri" +msgstr "fre" + +msgid "Sat" +msgstr "lør" + +msgid "Sun" +msgstr "søn" + +msgid "January" +msgstr "januar" + +msgid "February" +msgstr "februar" + +msgid "March" +msgstr "mars" + +msgid "April" +msgstr "april" + +msgid "May" +msgstr "mai" + +msgid "June" +msgstr "juni" + +msgid "July" +msgstr "juli" + +msgid "August" +msgstr "august" + +msgid "September" +msgstr "september" + +msgid "October" +msgstr "oktober" + +msgid "November" +msgstr "november" + +msgid "December" +msgstr "desember" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "mai" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "aug" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "des" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "apr." + +msgctxt "abbrev. month" +msgid "May" +msgstr "mai" + +msgctxt "abbrev. month" +msgid "June" +msgstr "jun." + +msgctxt "abbrev. month" +msgid "July" +msgstr "jul." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "aug." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "des." + +msgctxt "alt. month" +msgid "January" +msgstr "Januar" + +msgctxt "alt. month" +msgid "February" +msgstr "Februar" + +msgctxt "alt. month" +msgid "March" +msgstr "Mars" + +msgctxt "alt. month" +msgid "April" +msgstr "April" + +msgctxt "alt. month" +msgid "May" +msgstr "Mai" + +msgctxt "alt. month" +msgid "June" +msgstr "Juni" + +msgctxt "alt. month" +msgid "July" +msgstr "Juli" + +msgctxt "alt. month" +msgid "August" +msgstr "August" + +msgctxt "alt. month" +msgid "September" +msgstr "September" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktober" + +msgctxt "alt. month" +msgid "November" +msgstr "November" + +msgctxt "alt. month" +msgid "December" +msgstr "Desember" + +msgid "This is not a valid IPv6 address." +msgstr "Dette er ikke en gyldig IPv6-adresse." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "eller" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d måned" +msgstr[1] "%d måneder" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d uke" +msgstr[1] "%d uker" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dager" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutt" +msgstr[1] "%d minutter" + +msgid "0 minutes" +msgstr "0 minutter" + +msgid "Forbidden" +msgstr "Forbudt" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF-verifisering feilet. Forespørsel avbrutt." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Du ser denne meldingen fordi dette HTTPS-nettstedet krever en 'Referer'-" +"header for å bli sendt av nettleseren, men ingen ble sendt. Denne headeren " +"er nødvendig av sikkerhetsmessige årsaker, for å sikre at nettleseren din " +"ikke blir kapret av tredjeparter." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Hvis du har konfigurert nettleseren din til å deaktivere 'Referer'-headers, " +"kan du aktivere dem, i hvert fall for dette nettstedet, eller for HTTPS-" +"tilkoblinger, eller for 'same-origin'-forespørsler." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Hvis du bruker -taggen eller " +"inkluderer 'Referrer-Policy: no-referrer'-header, vennligst fjern dem. CSRF-" +"beskyttelsen krever 'Referer'-headeren for å utføre streng kontroll av " +"referanser. Hvis du er bekymret for personvern, bruk alternativer som for koblinger til tredjeparts nettsteder." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Du ser denne meldingen fordi denne nettsiden krever en CSRF-cookie når du " +"sender inn skjemaer. Denne informasjonskapselen er nødvendig av " +"sikkerhetsmessige årsaker, for å sikre at nettleseren din ikke blir kapret " +"av tredjeparter." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Hvis du har konfigurert nettleseren din til å deaktivere " +"informasjonskapsler, kan du aktivere dem, i hvert fall for dette nettstedet, " +"eller for 'same-origin'-forespørsler." + +msgid "More information is available with DEBUG=True." +msgstr "Mer informasjon er tilgjengelig med DEBUG=True." + +msgid "No year specified" +msgstr "År ikke spesifisert" + +msgid "Date out of range" +msgstr "Date utenfor rekkevidde" + +msgid "No month specified" +msgstr "Måned ikke spesifisert" + +msgid "No day specified" +msgstr "Dag ikke spesifisert" + +msgid "No week specified" +msgstr "Uke ikke spesifisert" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ingen %(verbose_name_plural)s tilgjengelig" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Fremtidig %(verbose_name_plural)s ikke tilgjengelig fordi %(class_name)s." +"allow_future er False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Ugyldig datostreng «%(datestr)s» gitt formatet «%(format)s»" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Fant ingen %(verbose_name)s som passet spørringen" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Siden er ikke «last», og kan heller ikke konverteres til et tall." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Ugyldig side (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Tom liste og «%(class_name)s.allow_empty» er False." + +msgid "Directory indexes are not allowed here." +msgstr "Mappeinnhold er ikke tillatt her." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "«%(path)s» finnes ikke" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Innhold i %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: web-rammeverket for perfeksjonister med tidsfrister." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Se produktmerknader for Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Installasjonen var vellykket! Gratulerer!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Du ser denne siden fordi DEBUG=True er i din Django-innstillingsfil og du ikke har konfigurert " +"noen URL-er." + +msgid "Django Documentation" +msgstr "Django-dokumentasjon" + +msgid "Topics, references, & how-to's" +msgstr "Temaer, referanser & how-tos" + +msgid "Tutorial: A Polling App" +msgstr "Tutorial: en polling-app" + +msgid "Get started with Django" +msgstr "Kom i gang med Django" + +msgid "Django Community" +msgstr "Django nettsamfunn" + +msgid "Connect, get help, or contribute" +msgstr "Koble, få hjelp eller bidra" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/nb/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/nb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/nb/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/nb/formats.py new file mode 100644 index 0000000..2180cf3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/nb/formats.py @@ -0,0 +1,39 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j. F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'j. F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j. F' +SHORT_DATE_FORMAT = 'd.m.Y' +SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# Kept ISO formats as they are in first position +DATE_INPUT_FORMATS = [ + '%Y-%m-%d', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' + # '%d. %b %Y', '%d %b %Y', # '25. okt 2006', '25 okt 2006' + # '%d. %b. %Y', '%d %b. %Y', # '25. okt. 2006', '25 okt. 2006' + # '%d. %B %Y', '%d %B %Y', # '25. oktober 2006', '25 oktober 2006' +] +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' + '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' + '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + '%d.%m.%Y', # '25.10.2006' + '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' + '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' + '%d.%m.%y %H:%M', # '25.10.06 14:30' + '%d.%m.%y', # '25.10.06' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6ebecb9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/nn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/os/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..4c2fdc6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,1210 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Африкаанс" + +msgid "Arabic" +msgstr "Араббаг" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Тӕтӕйраг" + +msgid "Bulgarian" +msgstr "Болгайраг" + +msgid "Belarusian" +msgstr "Беларусаг" + +msgid "Bengali" +msgstr "Бенгалаг" + +msgid "Breton" +msgstr "Бретойнаг" + +msgid "Bosnian" +msgstr "Босниаг" + +msgid "Catalan" +msgstr "Каталайнаг" + +msgid "Czech" +msgstr "Чехаг" + +msgid "Welsh" +msgstr "Уельсаг" + +msgid "Danish" +msgstr "Даниаг" + +msgid "German" +msgstr "Немыцаг" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Грекъаг" + +msgid "English" +msgstr "Англисаг" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Бритайнаг англисаг" + +msgid "Esperanto" +msgstr "Есперанто" + +msgid "Spanish" +msgstr "Испайнаг" + +msgid "Argentinian Spanish" +msgstr "Аргентинаг испайнаг" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Мексикайнаг Испайнаг" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуайаг испайнаг" + +msgid "Venezuelan Spanish" +msgstr "Венесуелаг испайнаг" + +msgid "Estonian" +msgstr "Эстойнаг" + +msgid "Basque" +msgstr "Баскаг" + +msgid "Persian" +msgstr "Персайнаг" + +msgid "Finnish" +msgstr "Финнаг" + +msgid "French" +msgstr "Францаг" + +msgid "Frisian" +msgstr "Фризаг" + +msgid "Irish" +msgstr "Ирландиаг" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Галициаг" + +msgid "Hebrew" +msgstr "Иврит" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Хорватаг" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Венгриаг" + +msgid "Interlingua" +msgstr "Интерлингва" + +msgid "Indonesian" +msgstr "Индонезиаг" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Исландаг" + +msgid "Italian" +msgstr "Италиаг" + +msgid "Japanese" +msgstr "Япойнаг" + +msgid "Georgian" +msgstr "Гуырдзиаг" + +msgid "Kazakh" +msgstr "Казахаг" + +msgid "Khmer" +msgstr "Хмераг" + +msgid "Kannada" +msgstr "Каннадаг" + +msgid "Korean" +msgstr "Корейаг" + +msgid "Luxembourgish" +msgstr "Люксембургаг" + +msgid "Lithuanian" +msgstr "Литвайаг" + +msgid "Latvian" +msgstr "Латвийаг" + +msgid "Macedonian" +msgstr "Мӕчъидон" + +msgid "Malayalam" +msgstr "Малайаг" + +msgid "Mongolian" +msgstr "Монголиаг" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "Бурмизаг" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "Непалаг" + +msgid "Dutch" +msgstr "Нидерландаг" + +msgid "Norwegian Nynorsk" +msgstr "Норвегийаг Нинорск" + +msgid "Ossetic" +msgstr "Ирон" + +msgid "Punjabi" +msgstr "Пенджабаг" + +msgid "Polish" +msgstr "Полаг" + +msgid "Portuguese" +msgstr "Португалаг" + +msgid "Brazilian Portuguese" +msgstr "Бразилаг португалаг" + +msgid "Romanian" +msgstr "Румынаг" + +msgid "Russian" +msgstr "Уырыссаг" + +msgid "Slovak" +msgstr "Словакиаг" + +msgid "Slovenian" +msgstr "Словенаг" + +msgid "Albanian" +msgstr "Албайнаг" + +msgid "Serbian" +msgstr "Сербаг" + +msgid "Serbian Latin" +msgstr "Латинаг Сербаг" + +msgid "Swedish" +msgstr "Шведаг" + +msgid "Swahili" +msgstr "Суахили" + +msgid "Tamil" +msgstr "Тамилаг" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Thai" +msgstr "Тайаг" + +msgid "Turkish" +msgstr "Туркаг" + +msgid "Tatar" +msgstr "Тӕтӕйраг" + +msgid "Udmurt" +msgstr "Удмуртаг" + +msgid "Ukrainian" +msgstr "Украинаг" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнамаг" + +msgid "Simplified Chinese" +msgstr "Ӕнцонгонд Китайаг" + +msgid "Traditional Chinese" +msgstr "Традицион Китайаг" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Раст бӕрц бафысс." + +msgid "Enter a valid URL." +msgstr "Раст URL бафысс." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Раст email адрис бафысс." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Раст бӕрӕг ном бафысс, цӕмӕй дзы уой дамгъӕтӕ, нымӕцтӕ бынылхӕххытӕ кӕнӕ " +"дефистӕ." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Раст IPv4 адрис бафысс." + +msgid "Enter a valid IPv6 address." +msgstr "Раст IPv6 адрис бафысс." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Раст IPv4 кӕнӕ IPv6 адрис бафысс." + +msgid "Enter only digits separated by commas." +msgstr "Бафысс ӕрмӕст нымӕцтӕ, къӕдзгуытӕй дихгонд." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s (у %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Ацы бӕрц хъуамӕ уа %(limit_value)s, кӕнӕ цъусдӕр." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕ уӕддӕр уа (ис дзы " +"%(show_value)d)." +msgstr[1] "" +"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйы уӕддӕр уа (ис дзы " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " +"%(show_value)d)." +msgstr[1] "" +"Дӕ хъус бадар цӕмӕй ам %(limit_value)d дамгъӕйӕ фылдӕр ма уа (ис дзы " +"%(show_value)d)." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." +msgstr[1] "Дӕ хъус бадар цӕмӕй иууыл иумӕ %(max)s цифрӕйӕ фылдӕр уой." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." +msgstr[1] "Дӕ хъус бадар цӕмӕй дӕсон бынӕттӕ %(max)s-ӕй фылдӕр ма уой." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." +msgstr[1] "" +"Дӕ хъус бадар цӕмӕй дӕсон стъӕлфы размӕ %(max)s цифрӕйӕ фылдӕр ма уа." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "ӕмӕ" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Ацы быдыр нул ма хъуамӕ уа." + +msgid "This field cannot be blank." +msgstr "Ацы быдыр афтид ма хъуамӕ уа." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s ацы %(field_label)s-имӕ нырид ис." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Быдыры хуыз: %(field_type)s" + +msgid "Integer" +msgstr "Ӕгас нымӕц" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Стыр (8 байты) ӕгас нымӕц" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Булон (Бӕлвырд кӕнӕ Мӕнг)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Рӕнхъ (%(max_length)s-ы йонг)" + +msgid "Comma-separated integers" +msgstr "Къӕдзыгӕй хицӕнгонд ӕгас нымӕцтӕ" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Бон (ӕнӕ рӕстӕг)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Бон (ӕд рӕстӕг)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Дӕсон нымӕц" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Электрон посты адрис" + +msgid "File path" +msgstr "Файлы фӕт" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Уӕгъд стъӕлфимӕ нымӕц" + +msgid "IPv4 address" +msgstr "IPv4 адрис" + +msgid "IP address" +msgstr "IP адрис" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Булон (Бӕлвырд, Мӕнг кӕнӕ Ницы)" + +msgid "Positive integer" +msgstr "Позитивон ӕгас нымӕц" + +msgid "Positive small integer" +msgstr "Позитивон гыццыл ӕгас нымӕц" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Слаг (ӕппӕты фылдӕр %(max_length)s)" + +msgid "Small integer" +msgstr "Гыццыл ӕгас нымӕц" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Рӕстӕг" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Хом бинарон рардтӕ" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Ныв" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Ӕттагон Амонӕн (хӕстӕг быдырӕй бӕрӕггонд хуыз)" + +msgid "One-to-one relationship" +msgstr "Иуӕн-иу бастдзинад" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Бирӕйӕн-бирӕ бастдзинад" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Ацы быдыр ӕнӕмӕнг у." + +msgid "Enter a whole number." +msgstr "Бафысс ӕнӕхъӕн нымӕц." + +msgid "Enter a number." +msgstr "Бафысс нымӕц." + +msgid "Enter a valid date." +msgstr "Раст бон бафысс." + +msgid "Enter a valid time." +msgstr "Раст рӕстӕг бафысс." + +msgid "Enter a valid date/time." +msgstr "Раст бон/рӕстӕг бафысс." + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ницы файл уыд лӕвӕрд. Абӕрӕг кӕн формӕйы кодкӕнынады хуыз." + +msgid "No file was submitted." +msgstr "Ницы файл уыд лӕвӕрд." + +msgid "The submitted file is empty." +msgstr "Лӕвӕрд файл афтид у." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " +"%(length)d)." +msgstr[1] "" +"Дӕ хъус бадар цӕмӕй ацы файлы номы %(max)d дамгъӕйӕ фылдӕр ма уа(ис дзы " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Дӕ хорзӕхӕй, кӕнӕ бадӕтт файл, кӕнӕ банысан кӕн сыгъдӕг чекбокс. Дыууӕ иумӕ " +"нӕ." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Раст ныв бавгӕн. Ды цы файл бавгӕдтай, уый кӕнӕ ныв нӕ уыд, кӕнӕ хӕлд ныв " +"уыд." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Раст фадат равзар. %(value)s фадӕтты ӕхсӕн нӕй." + +msgid "Enter a list of values." +msgstr "Бафысс мидисты номхыгъд." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Ӕмбӕхст быдыр %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Рад" + +msgid "Delete" +msgstr "Схафын" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Дӕ хорзӕхӕй, %(field)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ уникалон уа." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Дӕ хорзӕхӕй, %(field_name)s-ы дывӕр рардтӕ сраст кӕн. Хъуамӕ %(date_field)s-" +"ы %(lookup)s-ӕн уникалон уа. " + +msgid "Please correct the duplicate values below." +msgstr "Дӕ хорзӕхӕй, бындӕр цы дывӕр рардтӕ ис, уыдон сраст кӕн." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Раст фадат равзар. УКыцы фадат фадӕтты ӕхсӕн нӕй." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s нӕ бӕрӕг кӕны ацы рӕстӕджы тагы %(current_timezone)s; гӕнӕн ис " +"бирӕнысанон у кӕнӕ та нӕй." + +msgid "Clear" +msgstr "Сыгъдӕг" + +msgid "Currently" +msgstr "Ныр" + +msgid "Change" +msgstr "Фӕивын" + +msgid "Unknown" +msgstr "Ӕнӕбӕрӕг" + +msgid "Yes" +msgstr "О" + +msgid "No" +msgstr "Нӕ" + +msgid "yes,no,maybe" +msgstr "о,нӕ,гӕнӕн ис" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" +msgstr[1] "%(size)d байты" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s ГБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "ӕ.ф." + +msgid "a.m." +msgstr "ӕ.р." + +msgid "PM" +msgstr "ӔФ" + +msgid "AM" +msgstr "ӔР" + +msgid "midnight" +msgstr "ӕмбисӕхсӕв" + +msgid "noon" +msgstr "ӕмбисбон" + +msgid "Monday" +msgstr "Къуырисӕр" + +msgid "Tuesday" +msgstr "Дыццӕг" + +msgid "Wednesday" +msgstr "Ӕртыццӕг" + +msgid "Thursday" +msgstr "Цыппӕрӕм" + +msgid "Friday" +msgstr "Майрӕмбон" + +msgid "Saturday" +msgstr "Сабат" + +msgid "Sunday" +msgstr "Хуыцаубон" + +msgid "Mon" +msgstr "Крс" + +msgid "Tue" +msgstr "Дцг" + +msgid "Wed" +msgstr "Ӕрт" + +msgid "Thu" +msgstr "Цпр" + +msgid "Fri" +msgstr "Мрб" + +msgid "Sat" +msgstr "Сбт" + +msgid "Sun" +msgstr "Хцб" + +msgid "January" +msgstr "Январь" + +msgid "February" +msgstr "Февраль" + +msgid "March" +msgstr "Мартъи" + +msgid "April" +msgstr "Апрель" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июнь" + +msgid "July" +msgstr "Июль" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябрь" + +msgid "October" +msgstr "Октябрь" + +msgid "November" +msgstr "Ноябрь" + +msgid "December" +msgstr "Декабрь" + +msgid "jan" +msgstr "янв" + +msgid "feb" +msgstr "фев" + +msgid "mar" +msgstr "мар" + +msgid "apr" +msgstr "апр" + +msgid "may" +msgstr "май" + +msgid "jun" +msgstr "июн" + +msgid "jul" +msgstr "июл" + +msgid "aug" +msgstr "авг" + +msgid "sep" +msgstr "сен" + +msgid "oct" +msgstr "окт" + +msgid "nov" +msgstr "ноя" + +msgid "dec" +msgstr "дек" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Янв." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Фев." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Мартъи" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Апрель" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Июнь" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Июль" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Сен." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Ноя." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дек." + +msgctxt "alt. month" +msgid "January" +msgstr "Январь" + +msgctxt "alt. month" +msgid "February" +msgstr "Февраль" + +msgctxt "alt. month" +msgid "March" +msgstr "Мартъи" + +msgctxt "alt. month" +msgid "April" +msgstr "Апрель" + +msgctxt "alt. month" +msgid "May" +msgstr "Май" + +msgctxt "alt. month" +msgid "June" +msgstr "Июнь" + +msgctxt "alt. month" +msgid "July" +msgstr "Июль" + +msgctxt "alt. month" +msgid "August" +msgstr "Август" + +msgctxt "alt. month" +msgid "September" +msgstr "Сентябрь" + +msgctxt "alt. month" +msgid "October" +msgstr "Октябрь" + +msgctxt "alt. month" +msgid "November" +msgstr "Ноябрь" + +msgctxt "alt. month" +msgid "December" +msgstr "Декабрь" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "кӕнӕ" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d аз" +msgstr[1] "%d азы" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d мӕй" +msgstr[1] "%d мӕйы" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d къуыри" +msgstr[1] "%d къуырийы" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d бон" +msgstr[1] "%d боны" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d сахат" +msgstr[1] "%d сахаты" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минуты" + +msgid "0 minutes" +msgstr "0 минуты" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "Аз амынд нӕ уыд" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Мӕй амынд нӕ уыд" + +msgid "No day specified" +msgstr "Бон амынд нӕ уыд" + +msgid "No week specified" +msgstr "Къуыри амынд нӕ уыд" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Ницы %(verbose_name_plural)s ис" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Фидӕн %(verbose_name_plural)s-мӕ бавналӕн нӕй, уымӕн ӕмӕ %(class_name)s." +"allow_future Мӕнг у." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Боны рӕнхъ '%(datestr)s'-ы лӕвӕрд формат '%(format)s' раст нӕу" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Домӕнӕн ницы %(verbose_name)s ӕмбӕлы" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Фарс 'last' нӕу, нӕдӕр ӕй int-мӕ ис гӕнӕн раивын." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Мӕнг фарс (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Номхыгъд афтид у, ӕмӕ '%(class_name)s.allow_empty' мӕнг у." + +msgid "Directory indexes are not allowed here." +msgstr "Ам директориты индекстӕ нӕй гӕнӕн." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" нӕй" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s-ы индекс" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ee95a2b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..3d593df --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,1345 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# sidewinder , 2014 +# Adam Stachowicz , 2015 +# angularcircle, 2011,2013 +# angularcircle, 2011,2013 +# angularcircle, 2014 +# Dariusz Paluch , 2015 +# Jannis Leidel , 2011 +# Janusz Harkot , 2014-2015 +# Kacper Krupa , 2013 +# Karol , 2012 +# konryd , 2011 +# konryd , 2011 +# Łukasz Rekucki (lqc) , 2011 +# m_aciek , 2016-2019 +# m_aciek , 2015 +# Michał Pasternak , 2013 +# p , 2012 +# Piotr Meuś , 2014 +# p , 2012 +# Quadric , 2014 +# Radek Czajka , 2013 +# Radek Czajka , 2013 +# Roman Barczyński, 2012 +# sidewinder , 2014 +# Tomasz Kajtoch , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-26 20:41+0000\n" +"Last-Translator: m_aciek \n" +"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" +"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" +"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgid "Afrikaans" +msgstr "afrykanerski" + +msgid "Arabic" +msgstr "arabski" + +msgid "Asturian" +msgstr "asturyjski" + +msgid "Azerbaijani" +msgstr "azerski" + +msgid "Bulgarian" +msgstr "bułgarski" + +msgid "Belarusian" +msgstr "białoruski" + +msgid "Bengali" +msgstr "bengalski" + +msgid "Breton" +msgstr "bretoński" + +msgid "Bosnian" +msgstr "bośniacki" + +msgid "Catalan" +msgstr "kataloński" + +msgid "Czech" +msgstr "czeski" + +msgid "Welsh" +msgstr "walijski" + +msgid "Danish" +msgstr "duński" + +msgid "German" +msgstr "niemiecki" + +msgid "Lower Sorbian" +msgstr "dolnołużycki" + +msgid "Greek" +msgstr "grecki" + +msgid "English" +msgstr "angielski" + +msgid "Australian English" +msgstr "australijski angielski" + +msgid "British English" +msgstr "brytyjski angielski" + +msgid "Esperanto" +msgstr "esperanto" + +msgid "Spanish" +msgstr "hiszpański" + +msgid "Argentinian Spanish" +msgstr "hiszpański argentyński" + +msgid "Colombian Spanish" +msgstr "hiszpański kolumbijski" + +msgid "Mexican Spanish" +msgstr "hiszpański meksykański" + +msgid "Nicaraguan Spanish" +msgstr "hiszpański nikaraguański" + +msgid "Venezuelan Spanish" +msgstr "hiszpański wenezuelski" + +msgid "Estonian" +msgstr "estoński" + +msgid "Basque" +msgstr "baskijski" + +msgid "Persian" +msgstr "perski" + +msgid "Finnish" +msgstr "fiński" + +msgid "French" +msgstr "francuski" + +msgid "Frisian" +msgstr "fryzyjski" + +msgid "Irish" +msgstr "irlandzki" + +msgid "Scottish Gaelic" +msgstr "Szkocki gaelicki" + +msgid "Galician" +msgstr "galicyjski" + +msgid "Hebrew" +msgstr "hebrajski" + +msgid "Hindi" +msgstr "hindi" + +msgid "Croatian" +msgstr "chorwacki" + +msgid "Upper Sorbian" +msgstr "górnołużycki" + +msgid "Hungarian" +msgstr "węgierski" + +msgid "Armenian" +msgstr "ormiański" + +msgid "Interlingua" +msgstr "interlingua" + +msgid "Indonesian" +msgstr "indonezyjski" + +msgid "Ido" +msgstr "ido" + +msgid "Icelandic" +msgstr "islandzki" + +msgid "Italian" +msgstr "włoski" + +msgid "Japanese" +msgstr "japoński" + +msgid "Georgian" +msgstr "gruziński" + +msgid "Kabyle" +msgstr "kabylski" + +msgid "Kazakh" +msgstr "kazachski" + +msgid "Khmer" +msgstr "khmerski" + +msgid "Kannada" +msgstr "kannada" + +msgid "Korean" +msgstr "koreański" + +msgid "Luxembourgish" +msgstr "luksemburski" + +msgid "Lithuanian" +msgstr "litewski" + +msgid "Latvian" +msgstr "łotewski" + +msgid "Macedonian" +msgstr "macedoński" + +msgid "Malayalam" +msgstr "malajski" + +msgid "Mongolian" +msgstr "mongolski" + +msgid "Marathi" +msgstr "marathi" + +msgid "Burmese" +msgstr "birmański" + +msgid "Norwegian Bokmål" +msgstr "norweski (bokmål)" + +msgid "Nepali" +msgstr "nepalski" + +msgid "Dutch" +msgstr "holenderski" + +msgid "Norwegian Nynorsk" +msgstr "norweski (nynorsk)" + +msgid "Ossetic" +msgstr "osetyjski" + +msgid "Punjabi" +msgstr "pendżabski" + +msgid "Polish" +msgstr "polski" + +msgid "Portuguese" +msgstr "portugalski" + +msgid "Brazilian Portuguese" +msgstr "portugalski brazylijski" + +msgid "Romanian" +msgstr "rumuński" + +msgid "Russian" +msgstr "rosyjski" + +msgid "Slovak" +msgstr "słowacki" + +msgid "Slovenian" +msgstr "słoweński" + +msgid "Albanian" +msgstr "albański" + +msgid "Serbian" +msgstr "serbski" + +msgid "Serbian Latin" +msgstr "serbski (łaciński)" + +msgid "Swedish" +msgstr "szwedzki" + +msgid "Swahili" +msgstr "suahili" + +msgid "Tamil" +msgstr "tamilski" + +msgid "Telugu" +msgstr "telugu" + +msgid "Thai" +msgstr "tajski" + +msgid "Turkish" +msgstr "turecki" + +msgid "Tatar" +msgstr "tatarski" + +msgid "Udmurt" +msgstr "udmurcki" + +msgid "Ukrainian" +msgstr "ukraiński" + +msgid "Urdu" +msgstr "urdu" + +msgid "Vietnamese" +msgstr "wietnamski" + +msgid "Simplified Chinese" +msgstr "chiński uproszczony" + +msgid "Traditional Chinese" +msgstr "chiński tradycyjny" + +msgid "Messages" +msgstr "Wiadomości" + +msgid "Site Maps" +msgstr "Mapy stron" + +msgid "Static Files" +msgstr "Pliki statyczne" + +msgid "Syndication" +msgstr "Syndykacja treści" + +msgid "That page number is not an integer" +msgstr "Ten numer strony nie jest liczbą całkowitą" + +msgid "That page number is less than 1" +msgstr "Ten numer strony jest mniejszy niż 1" + +msgid "That page contains no results" +msgstr "Ta strona nie zawiera wyników" + +msgid "Enter a valid value." +msgstr "Wpisz poprawną wartość." + +msgid "Enter a valid URL." +msgstr "Wpisz poprawny URL." + +msgid "Enter a valid integer." +msgstr "Wprowadź poprawną liczbę całkowitą." + +msgid "Enter a valid email address." +msgstr "Wprowadź poprawny adres email." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Wpisz poprawną uproszczoną nazwę zawierającą jedynie litery, cyfry, " +"podkreślenia i myślniki." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Wpisz poprawną uproszczoną nazwę zawierającą jedynie litery Unicode, cyfry, " +"podkreślenia i myślniki." + +msgid "Enter a valid IPv4 address." +msgstr "Wprowadź poprawny adres IPv4." + +msgid "Enter a valid IPv6 address." +msgstr "Wprowadź poprawny adres IPv6." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Wprowadź poprawny adres IPv4 lub IPv6." + +msgid "Enter only digits separated by commas." +msgstr "Wpisz tylko cyfry oddzielone przecinkami." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Upewnij się, że ta wartość jest %(limit_value)s (jest %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Upewnij się, że ta wartość jest większa lub równa %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znak (obecnie ma " +"%(show_value)d)." +msgstr[1] "" +"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaki (obecnie ma " +"%(show_value)d)." +msgstr[2] "" +"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " +"ma %(show_value)d)." +msgstr[3] "" +"Upewnij się, że ta wartość ma przynajmniej %(limit_value)d znaków (obecnie " +"ma %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znak (obecnie ma " +"%(show_value)d)." +msgstr[1] "" +"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaki (obecnie ma " +"%(show_value)d)." +msgstr[2] "" +"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " +"%(show_value)d)." +msgstr[3] "" +"Upewnij się, że ta wartość ma co najwyżej %(limit_value)d znaków (obecnie ma " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Wpisz liczbę." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." +msgstr[1] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfry." +msgstr[2] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." +msgstr[3] "Upewnij się, że łącznie nie ma więcej niż %(max)s cyfr." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę po przecinku." +msgstr[1] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry po przecinku." +msgstr[2] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." +msgstr[3] "Upewnij się, że liczba ma nie więcej niż %(max)s cyfr po przecinku." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfrę przed przecinkiem." +msgstr[1] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfry przed przecinkiem." +msgstr[2] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." +msgstr[3] "" +"Upewnij się, że liczba ma nie więcej niż %(max)s cyfr przed przecinkiem." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Rozszerzenie pliku '%(extension)s' jest niedozwolone. Dozwolone rozszerzenia " +"to: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Znaki null są niedozwolone." + +msgid "and" +msgstr "i" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s z tymi %(field_labels)s już istnieje." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Wartość %(value)r nie jest poprawnym wyborem." + +msgid "This field cannot be null." +msgstr "To pole nie może być puste." + +msgid "This field cannot be blank." +msgstr "To pole nie może być puste." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Istnieje już %(model_name)s z tą wartością pola %(field_label)s." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"Wartość pola %(field_label)s musi być unikatowa dla %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Pole typu: %(field_type)s" + +msgid "Integer" +msgstr "Liczba całkowita" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "wartość '%(value)s' musi być liczbą całkowitą." + +msgid "Big (8 byte) integer" +msgstr "Duża liczba całkowita (8 bajtów)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "wartość '%(value)s' musi być True lub False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "Wartość „%(value)s” musi być True, False lub None." + +msgid "Boolean (Either True or False)" +msgstr "Wartość logiczna (True lub False – prawda lub fałsz)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Ciąg znaków (do %(max_length)s znaków)" + +msgid "Comma-separated integers" +msgstr "Liczby całkowite rozdzielone przecinkami" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Wartość '%(value)s' ma nieprawidłowy format daty. Musi być ona w formacie " +"YYYY-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Wartość '%(value)s' ma prawidłowy format (YYYY-MM-DD), ale jest " +"nieprawidłową datą." + +msgid "Date (without time)" +msgstr "Data (bez godziny)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Wartość '%(value)s' ma nieprawidłowy format. Musi być ona w formacie YYYY-MM-" +"DD HH:MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Wartość '%(value)s' ma prawidłowy format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), ale jest nieprawidłową datą/godziną." + +msgid "Date (with time)" +msgstr "Data (z godziną)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "wartość '%(value)s' musi być liczbą dziesiętną." + +msgid "Decimal number" +msgstr "Liczba dziesiętna" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"Wartość '%(value)s' ma błędny format. Poprawny format to [DD] [HH:[MM:]]ss[." +"uuuuuu]." + +msgid "Duration" +msgstr "Czas trwania" + +msgid "Email address" +msgstr "Adres e-mail" + +msgid "File path" +msgstr "Ścieżka do pliku" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "wartość '%(value)s' musi być liczbą zmiennoprzecinkową." + +msgid "Floating point number" +msgstr "Liczba zmiennoprzecinkowa" + +msgid "IPv4 address" +msgstr "adres IPv4" + +msgid "IP address" +msgstr "Adres IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Wartość '%(value)s' musi być None, True lub False." + +msgid "Boolean (Either True, False or None)" +msgstr "Wartość logiczna (True, False, None – prawda, fałsz lub nic)" + +msgid "Positive integer" +msgstr "Dodatnia liczba całkowita" + +msgid "Positive small integer" +msgstr "Dodatnia mała liczba całkowita" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (max. %(max_length)s znaków)" + +msgid "Small integer" +msgstr "Mała liczba całkowita" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Wartość '%(value)s' ma nieprawidłowy format. Musi być ona w formacie HH:MM[:" +"ss[.uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Wartość '%(value)s' ma prawidłowy format (HH:MM[:ss[.uuuuuu]]), ale jest " +"nieprawidłową godziną." + +msgid "Time" +msgstr "Czas" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Dane w postaci binarnej" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "Wartość '%(value)s' nie jest poprawnym UUID." + +msgid "Universally unique identifier" +msgstr "Uniwersalnie unikalny identyfikator" + +msgid "File" +msgstr "Plik" + +msgid "Image" +msgstr "Plik graficzny" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s z polem %(field)s o wartości %(value)r nie istnieje." + +msgid "Foreign Key (type determined by related field)" +msgstr "Klucz obcy (typ określony przez pole powiązane)" + +msgid "One-to-one relationship" +msgstr "Powiązanie jeden do jednego" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "powiązanie %(from)s do %(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "powiązania %(from)s do %(to)s" + +msgid "Many-to-many relationship" +msgstr "Powiązanie wiele-do-wielu" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "To pole jest wymagane." + +msgid "Enter a whole number." +msgstr "Wpisz liczbę całkowitą." + +msgid "Enter a valid date." +msgstr "Wpisz poprawną datę." + +msgid "Enter a valid time." +msgstr "Wpisz poprawną godzinę." + +msgid "Enter a valid date/time." +msgstr "Wpisz poprawną datę/godzinę." + +msgid "Enter a valid duration." +msgstr "Wpisz poprawny czas trwania." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Liczba dni musi wynosić między {min_days} a {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza." + +msgid "No file was submitted." +msgstr "Żaden plik nie został przesłany." + +msgid "The submitted file is empty." +msgstr "Wysłany plik jest pusty." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znak (obecnie ma " +"%(length)d)." +msgstr[1] "" +"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaki (obecnie ma " +"%(length)d)." +msgstr[2] "" +"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " +"%(length)d)." +msgstr[3] "" +"Upewnij się, że nazwa pliku ma co najwyżej %(max)d znaków (obecnie ma " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Prześlij plik lub zaznacz by usunąć, ale nie oba na raz." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Prześlij poprawny plik graficzny. Aktualnie przesłany plik nie jest " +"grafiką lub jest uszkodzony." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Wybierz poprawną wartość. %(value)s nie jest żadną z dostępnych opcji." + +msgid "Enter a list of values." +msgstr "Podaj listę wartości." + +msgid "Enter a complete value." +msgstr "Wprowadź kompletną wartość." + +msgid "Enter a valid UUID." +msgstr "Wpisz poprawny UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Ukryte pole %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Brakuje danych ManagementForm lub zostały one zmodyfikowane." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Proszę wysłać %d lub mniej formularzy." +msgstr[1] "Proszę wysłać %d lub mniej formularze." +msgstr[2] "Proszę wysłać %d lub mniej formularzy." +msgstr[3] "Proszę wysłać %d lub mniej formularzy." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Proszę wysłać %d lub więcej formularzy." +msgstr[1] "Proszę wysłać %d lub więcej formularze." +msgstr[2] "Proszę wysłać %d lub więcej formularzy." +msgstr[3] "Proszę wysłać %d lub więcej formularzy." + +msgid "Order" +msgstr "Kolejność" + +msgid "Delete" +msgstr "Usuń" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Popraw zduplikowane dane w %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Popraw zduplikowane dane w %(field)s, które muszą być unikalne." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Popraw zduplikowane dane w %(field_name)s, które wymaga unikalności dla " +"%(lookup)s w polu %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Popraw poniższe zduplikowane wartości." + +msgid "The inline value did not match the parent instance." +msgstr "Wartość inline nie pasuje do obiektu rodzica." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "„%(pk)s” nie jest poprawną wartością." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s nie może być interpretowany w strefie czasowej " +"%(current_timezone)s; może być niejednoznaczne lub nie istnieć." + +msgid "Clear" +msgstr "Wyczyść" + +msgid "Currently" +msgstr "Teraz" + +msgid "Change" +msgstr "Zmień" + +msgid "Unknown" +msgstr "Nieznany" + +msgid "Yes" +msgstr "Tak" + +msgid "No" +msgstr "Nie" + +msgid "yes,no,maybe" +msgstr "tak,nie,może" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bajt" +msgstr[1] "%(size)d bajty" +msgstr[2] "%(size)d bajtów" +msgstr[3] "%(size)d bajtów" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "po południu" + +msgid "a.m." +msgstr "rano" + +msgid "PM" +msgstr "po południu" + +msgid "AM" +msgstr "rano" + +msgid "midnight" +msgstr "północ" + +msgid "noon" +msgstr "południe" + +msgid "Monday" +msgstr "Poniedziałek" + +msgid "Tuesday" +msgstr "Wtorek" + +msgid "Wednesday" +msgstr "Środa" + +msgid "Thursday" +msgstr "Czwartek" + +msgid "Friday" +msgstr "Piątek" + +msgid "Saturday" +msgstr "Sobota" + +msgid "Sunday" +msgstr "Niedziela" + +msgid "Mon" +msgstr "Pon" + +msgid "Tue" +msgstr "Wt" + +msgid "Wed" +msgstr "Śr" + +msgid "Thu" +msgstr "Czw" + +msgid "Fri" +msgstr "Pt" + +msgid "Sat" +msgstr "So" + +msgid "Sun" +msgstr "Nd" + +msgid "January" +msgstr "Styczeń" + +msgid "February" +msgstr "Luty" + +msgid "March" +msgstr "Marzec" + +msgid "April" +msgstr "Kwiecień" + +msgid "May" +msgstr "Maj" + +msgid "June" +msgstr "Czerwiec" + +msgid "July" +msgstr "Lipiec" + +msgid "August" +msgstr "Sierpień" + +msgid "September" +msgstr "Wrzesień" + +msgid "October" +msgstr "Październik" + +msgid "November" +msgstr "Listopad" + +msgid "December" +msgstr "Grudzień" + +msgid "jan" +msgstr "sty" + +msgid "feb" +msgstr "lut" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "kwi" + +msgid "may" +msgstr "maj" + +msgid "jun" +msgstr "cze" + +msgid "jul" +msgstr "lip" + +msgid "aug" +msgstr "sie" + +msgid "sep" +msgstr "wrz" + +msgid "oct" +msgstr "paź" + +msgid "nov" +msgstr "lis" + +msgid "dec" +msgstr "gru" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Sty." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Lut." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mar." + +msgctxt "abbrev. month" +msgid "April" +msgstr "Kwi." + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Cze." + +msgctxt "abbrev. month" +msgid "July" +msgstr "Lip." + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Sie." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Wrz." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Paź." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Lis." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Gru" + +msgctxt "alt. month" +msgid "January" +msgstr "stycznia" + +msgctxt "alt. month" +msgid "February" +msgstr "lutego" + +msgctxt "alt. month" +msgid "March" +msgstr "marca" + +msgctxt "alt. month" +msgid "April" +msgstr "kwietnia" + +msgctxt "alt. month" +msgid "May" +msgstr "maja" + +msgctxt "alt. month" +msgid "June" +msgstr "czerwca" + +msgctxt "alt. month" +msgid "July" +msgstr "lipca" + +msgctxt "alt. month" +msgid "August" +msgstr "sierpnia" + +msgctxt "alt. month" +msgid "September" +msgstr "września" + +msgctxt "alt. month" +msgid "October" +msgstr "października" + +msgctxt "alt. month" +msgid "November" +msgstr "listopada" + +msgctxt "alt. month" +msgid "December" +msgstr "grudnia" + +msgid "This is not a valid IPv6 address." +msgstr "To nie jest poprawny adres IPv6." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "lub" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d rok" +msgstr[1] "%d lata" +msgstr[2] "%d lat" +msgstr[3] "%d lat" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d miesiąc" +msgstr[1] "%d miesiące" +msgstr[2] "%d miesięcy" +msgstr[3] "%d miesięcy" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d tydzień" +msgstr[1] "%d tygodnie" +msgstr[2] "%d tygodni" +msgstr[3] "%d tygodni" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dzień" +msgstr[1] "%d dni" +msgstr[2] "%d dni" +msgstr[3] "%d dni" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d godzina" +msgstr[1] "%d godziny" +msgstr[2] "%d godzin" +msgstr[3] "%d godzin" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuty" +msgstr[2] "%d minut" +msgstr[3] "%d minut" + +msgid "0 minutes" +msgstr "0 minut" + +msgid "Forbidden" +msgstr "Dostęp zabroniony" + +msgid "CSRF verification failed. Request aborted." +msgstr "Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Widzisz tą wiadomość, ponieważ ta witryna HTTPS wymaga aby przeglądarka " +"wysłała nagłówek 'Referer header', a żaden nie został wysłany. Nagłówek ten " +"jest wymagane ze względów bezpieczeństwa, aby upewnić się, że Twoja " +"przeglądarka nie została przechwycona przez osoby trzecie." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Jeżeli nagłówki „Referer” w Twojej przeglądarce są wyłączone, to proszę " +"włącz je ponownie. Przynajmniej dla tej strony, połączeń HTTPS lub zapytań " +"typu „same-origin”." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Jeśli używasz taga lub " +"umieszczasz nagłówek „Referrer-Policy: no-referrer”, prosimy je usunąć. " +"Ochrona przed atakami CSRF wymaga nagłówka „Referer”, aby wykonać ścisłe " +"sprawdzenie referera HTTP. Jeśli zależy ci na prywatności, użyj alternatyw " +"takich jak dla linków do stron osób trzecich." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Widzisz tą wiadomość, ponieważ ta witryna wymaga ciasteczka CSRF do " +"przesyłania formularza. Ciasteczko to jest wymagane ze względów " +"bezpieczeństwa, aby upewnić się, że Twoja przeglądarka nie została " +"przechwycona przez osoby trzecie." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Jeżeli ciasteczka w Twojej przeglądarce są wyłączone, to proszę włącz je " +"ponownie. Przynajmniej dla tej strony lub żadań typu „same-origin”." + +msgid "More information is available with DEBUG=True." +msgstr "Więcej informacji jest dostępnych po ustawieniu DEBUG=True." + +msgid "No year specified" +msgstr "Nie określono roku" + +msgid "Date out of range" +msgstr "Data poza zakresem" + +msgid "No month specified" +msgstr "Nie określono miesiąca" + +msgid "No day specified" +msgstr "Nie określono dnia" + +msgid "No week specified" +msgstr "Nie określono tygodnia" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s nie są dostępne" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Wyświetlanie %(verbose_name_plural)s z datą przyszłą jest niedostępne, gdyż " +"atrybut '%(class_name)s.allow_future' ma wartość 'False'." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"Ciąg znaków '%(datestr)s' jest niezgodny z podanym formatem daty '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Nie znaleziono %(verbose_name)s spełniających wybrane kryteria" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" +"Podanego numeru strony nie można przekształcić na liczbę całkowitą, nie " +"przyjął on również wartości 'last' oznaczającej ostatnią stronę z dostępnego " +"zakresu." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Nieprawidłowy numer strony (%(page_number)s): %(message)s " + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" +"Lista nie zawiera żadnych elementów, a atrybut '%(class_name)s.allow_empty' " +"ma wartość 'False'." + +msgid "Directory indexes are not allowed here." +msgstr "Wyświetlanie zawartości katalogu jest tu niedozwolone." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\" %(path)s \" nie istnieje" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Zawartość %(directory)s " + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: framework WWW dla perfekcjonistów z deadline'ami." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Zobacz informacje o wydaniu dla Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacja przebiegła pomyślnie! Gratulacje!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Widzisz tę stronę, ponieważ w swoim pliku ustawień masz DEBUG=True i nie skonfigurowałeś żadnych URL-i." + +msgid "Django Documentation" +msgstr "Dokumentacja Django" + +msgid "Topics, references, & how-to's" +msgstr "Przewodniki tematyczne, podręczniki i przewodniki „jak to zrobić”" + +msgid "Tutorial: A Polling App" +msgstr "Samouczek: Aplikacja ankietowa" + +msgid "Get started with Django" +msgstr "Pierwsze kroki z Django" + +msgid "Django Community" +msgstr "Społeczność Django" + +msgid "Connect, get help, or contribute" +msgstr "Nawiąż kontakt, uzyskaj pomoc lub wnieś swój wkład" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/pt/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/pt/formats.py new file mode 100644 index 0000000..5789cd8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/pt/formats.py @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = r'j \d\e F \d\e Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = r'j \d\e F \d\e Y à\s H:i' +YEAR_MONTH_FORMAT = r'F \d\e Y' +MONTH_DAY_FORMAT = r'j \d\e F' +SHORT_DATE_FORMAT = 'd/m/Y' +SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# Kept ISO formats as they are in first position +DATE_INPUT_FORMATS = [ + '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06' + # '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' + # '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '25 de Outubro, 2006' +] +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' + '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' + '%d/%m/%Y %H:%M', # '25/10/2006 14:30' + '%d/%m/%Y', # '25/10/2006' + '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' + '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' + '%d/%m/%y %H:%M', # '25/10/06 14:30' + '%d/%m/%y', # '25/10/06' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..86fafd7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,1295 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# amcorreia , 2018 +# andrewsmedina , 2014-2015 +# Arthur Silva , 2017 +# bruno.devpod , 2014 +# Camilo B. Moreira , 2017 +# Carlos Leite , 2016 +# Filipe Cifali Stangler , 2016 +# dudanogueira , 2012 +# dudanogueira , 2019 +# Elyézer Rezende , 2013 +# Fábio C. Barrionuevo da Luz , 2014-2015 +# Felipe Rodrigues , 2016 +# Gladson , 2013 +# semente, 2011-2014 +# Igor Cavalcante , 2017 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +# Luiz Boaretto , 2017 +# Marcelo Moro Brondani , 2018 +# Sandro , 2011 +# Sergio Garcia , 2015 +# Tânia Andrea , 2017 +# Wiliam Souza , 2015 +# Xico Petry , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-18 17:13+0000\n" +"Last-Translator: dudanogueira \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Afrikaans" +msgstr "Africânder" + +msgid "Arabic" +msgstr "Árabe" + +msgid "Asturian" +msgstr "Asturiano" + +msgid "Azerbaijani" +msgstr "Azerbaijão" + +msgid "Bulgarian" +msgstr "Búlgaro" + +msgid "Belarusian" +msgstr "Bielorrussa" + +msgid "Bengali" +msgstr "Bengali" + +msgid "Breton" +msgstr "Bretão" + +msgid "Bosnian" +msgstr "Bósnio" + +msgid "Catalan" +msgstr "Catalão" + +msgid "Czech" +msgstr "Tcheco" + +msgid "Welsh" +msgstr "Galês" + +msgid "Danish" +msgstr "Dinamarquês" + +msgid "German" +msgstr "Alemão" + +msgid "Lower Sorbian" +msgstr "Sorábio Baixo" + +msgid "Greek" +msgstr "Grego" + +msgid "English" +msgstr "Inglês" + +msgid "Australian English" +msgstr "Inglês Australiano" + +msgid "British English" +msgstr "Inglês Britânico" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Espanhol" + +msgid "Argentinian Spanish" +msgstr "Espanhol Argentino" + +msgid "Colombian Spanish" +msgstr "Espanhol Colombiano" + +msgid "Mexican Spanish" +msgstr "Espanhol Mexicano" + +msgid "Nicaraguan Spanish" +msgstr "Espanhol Nicaraguense" + +msgid "Venezuelan Spanish" +msgstr "Espanhol Venuzuelano" + +msgid "Estonian" +msgstr "Estoniano" + +msgid "Basque" +msgstr "Basco" + +msgid "Persian" +msgstr "Persa" + +msgid "Finnish" +msgstr "Finlandês" + +msgid "French" +msgstr "Francês" + +msgid "Frisian" +msgstr "Frísia" + +msgid "Irish" +msgstr "Irlandês" + +msgid "Scottish Gaelic" +msgstr "Gaélico Escocês" + +msgid "Galician" +msgstr "Galiciano" + +msgid "Hebrew" +msgstr "Hebraico" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Croata" + +msgid "Upper Sorbian" +msgstr "Sorábio Alto" + +msgid "Hungarian" +msgstr "Húngaro" + +msgid "Armenian" +msgstr "Armênio" + +msgid "Interlingua" +msgstr "Interlíngua" + +msgid "Indonesian" +msgstr "Indonésio" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandês" + +msgid "Italian" +msgstr "Italiano" + +msgid "Japanese" +msgstr "Japonês" + +msgid "Georgian" +msgstr "Georgiano" + +msgid "Kabyle" +msgstr "Cabila" + +msgid "Kazakh" +msgstr "Cazaque" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Canarês" + +msgid "Korean" +msgstr "Coreano" + +msgid "Luxembourgish" +msgstr "Luxemburguês" + +msgid "Lithuanian" +msgstr "Lituano" + +msgid "Latvian" +msgstr "Letão" + +msgid "Macedonian" +msgstr "Macedônio" + +msgid "Malayalam" +msgstr "Malaiala" + +msgid "Mongolian" +msgstr "Mongol" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Burmese" +msgstr "Birmanês" + +msgid "Norwegian Bokmål" +msgstr "Dano-norueguês" + +msgid "Nepali" +msgstr "Nepalês" + +msgid "Dutch" +msgstr "Neerlandês" + +msgid "Norwegian Nynorsk" +msgstr "Novo Norueguês" + +msgid "Ossetic" +msgstr "Osseto" + +msgid "Punjabi" +msgstr "Punjabi" + +msgid "Polish" +msgstr "Polonês" + +msgid "Portuguese" +msgstr "Português" + +msgid "Brazilian Portuguese" +msgstr "Português Brasileiro" + +msgid "Romanian" +msgstr "Romeno" + +msgid "Russian" +msgstr "Russo" + +msgid "Slovak" +msgstr "Eslovaco" + +msgid "Slovenian" +msgstr "Esloveno" + +msgid "Albanian" +msgstr "Albanesa" + +msgid "Serbian" +msgstr "Sérvio" + +msgid "Serbian Latin" +msgstr "Sérvio Latino" + +msgid "Swedish" +msgstr "Sueco" + +msgid "Swahili" +msgstr "Suaíli" + +msgid "Tamil" +msgstr "Tâmil" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Thai" +msgstr "Tailandês" + +msgid "Turkish" +msgstr "Turco" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Ukrainian" +msgstr "Ucraniano" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vietnamita" + +msgid "Simplified Chinese" +msgstr "Chinês Simplificado" + +msgid "Traditional Chinese" +msgstr "Chinês Tradicional" + +msgid "Messages" +msgstr "Mensagens" + +msgid "Site Maps" +msgstr "Site Maps" + +msgid "Static Files" +msgstr "Arquivos Estáticos" + +msgid "Syndication" +msgstr "Syndication" + +msgid "That page number is not an integer" +msgstr "Esse número de página não é um número inteiro" + +msgid "That page number is less than 1" +msgstr "Esse número de página é menor que 1" + +msgid "That page contains no results" +msgstr "Essa página não contém resultados" + +msgid "Enter a valid value." +msgstr "Informe um valor válido." + +msgid "Enter a valid URL." +msgstr "Informe uma URL válida." + +msgid "Enter a valid integer." +msgstr "Insira um número inteiro válido." + +msgid "Enter a valid email address." +msgstr "Informe um endereço de email válido." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Insira um \"slug\" válido consistindo de letras, números, sublinhados (_) ou " +"hífens." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Insira um 'slug' válido composto de letras Unicode, números, sublinhados ou " +"hífens." + +msgid "Enter a valid IPv4 address." +msgstr "Insira um endereço IPv4 válido." + +msgid "Enter a valid IPv6 address." +msgstr "Insira um endereço IPv6 válido." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Insira um endereço IPv4 ou IPv6 válido." + +msgid "Enter only digits separated by commas." +msgstr "Insira apenas dígitos separados por vírgulas." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Certifique-se de que o valor é %(limit_value)s (ele é %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Certifique-se que este valor seja menor ou igual a %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Certifique-se que este valor seja maior ou igual a %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Certifique-se de que o valor tenha no mínimo %(limit_value)d caractere (ele " +"possui %(show_value)d)." +msgstr[1] "" +"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " +"possui %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Certifique-se de que o valor tenha no máximo %(limit_value)d caractere (ele " +"possui %(show_value)d)." +msgstr[1] "" +"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " +"possui %(show_value)d)." + +msgid "Enter a number." +msgstr "Informe um número." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Certifique-se de que não tenha mais de %(max)s dígito no total." +msgstr[1] "Certifique-se de que não tenha mais de %(max)s dígitos no total." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Certifique-se de que não tenha mais de %(max)s casa decimal." +msgstr[1] "Certifique-se de que não tenha mais de %(max)s casas decimais." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Certifique-se de que não tenha mais de %(max)s dígito antes do ponto decimal." +msgstr[1] "" +"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " +"decimal." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"A extensão de arquivo '%(extension)s' não é permitida. As extensões " +"permitidas são: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Caracteres nulos não são permitidos." + +msgid "and" +msgstr "e" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s com este %(field_labels)s já existe." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Valor %(value)r não é uma opção válida." + +msgid "This field cannot be null." +msgstr "Este campo não pode ser nulo." + +msgid "This field cannot be blank." +msgstr "Este campo não pode estar vazio." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s com este %(field_label)s já existe." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s deve ser único para %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Campo do tipo: %(field_type)s" + +msgid "Integer" +msgstr "Inteiro" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "'%(value)s' valor deve ser um inteiro." + +msgid "Big (8 byte) integer" +msgstr "Inteiro grande (8 byte)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "'%(value)s' valor deve ser True ou False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "O valor '%(value)s' deve ser True, False ou Nenhum." + +msgid "Boolean (Either True or False)" +msgstr "Booleano (Verdadeiro ou Falso)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (até %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Inteiros separados por vírgula" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"'%(value)s' valor tem um formato de data inválido. Ele deve estar no formato " +"AAAA-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"'%(value)s' valor tem o formato correto (AAAA-MM-DD), mas é uma data " +"inválida." + +msgid "Date (without time)" +msgstr "Data (sem hora)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"'%(value)s' valor tem um formato inválido. Ele deve estar no formato AAAA-MM-" +"DD HH: MM [:. Ss [uuuuuu]] [TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"'%(value)s' valor tem o formato correto (AAAA-MM-DD HH: MM [:. Ss [uuuuuu]] " +"[TZ]), mas é uma data/hora inválida." + +msgid "Date (with time)" +msgstr "Data (com hora)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "'%(value)s' valor deve ser um número decimal." + +msgid "Decimal number" +msgstr "Número decimal" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"O valor '%(value)s' está em um formato inválido. Ele deve estar no formato " +"[DD] [HH:[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Duração" + +msgid "Email address" +msgstr "Endereço de e-mail" + +msgid "File path" +msgstr "Caminho do arquivo" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "'%(value)s' valor deve ser um float." + +msgid "Floating point number" +msgstr "Número de ponto flutuante" + +msgid "IPv4 address" +msgstr "Endereço IPv4" + +msgid "IP address" +msgstr "Endereço IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "'%(value)s' valor deve ser None, verdadeiro ou falso." + +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (Verdadeiro, Falso ou Nada)" + +msgid "Positive integer" +msgstr "Inteiro positivo" + +msgid "Positive small integer" +msgstr "Inteiro curto positivo" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (até %(max_length)s)" + +msgid "Small integer" +msgstr "Inteiro curto" + +msgid "Text" +msgstr "Texto" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"'%(value)s' valor tem um formato inválido. Deve ser no formato HH: MM [: ss " +"[uuuuuu].] Formato." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"'%(value)s' valor tem o formato correto (HH: MM [:. Ss [uuuuuu]]), mas é uma " +"hora inválida." + +msgid "Time" +msgstr "Hora" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Dados binários bruto" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' não é um UUID válido." + +msgid "Universally unique identifier" +msgstr "Identificador único universal" + +msgid "File" +msgstr "Arquivo" + +msgid "Image" +msgstr "Imagem" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "A instância de %(model)s com %(field)s %(value)r não existe." + +msgid "Foreign Key (type determined by related field)" +msgstr "Chave Estrangeira (tipo determinado pelo campo relacionado)" + +msgid "One-to-one relationship" +msgstr "Relacionamento um-para-um" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Relacionamento %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Relacionamentos %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Relacionamento muitos-para-muitos" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Este campo é obrigatório." + +msgid "Enter a whole number." +msgstr "Informe um número inteiro." + +msgid "Enter a valid date." +msgstr "Informe uma data válida." + +msgid "Enter a valid time." +msgstr "Informe uma hora válida." + +msgid "Enter a valid date/time." +msgstr "Informe uma data/hora válida." + +msgid "Enter a valid duration." +msgstr "Insira uma duração válida." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "O número de dias deve ser entre {min_days} e {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Nenhum arquivo enviado. Verifique o tipo de codificação do formulário." + +msgid "No file was submitted." +msgstr "Nenhum arquivo foi enviado." + +msgid "The submitted file is empty." +msgstr "O arquivo enviado está vazio." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Certifique-se de que o arquivo tenha no máximo %(max)d caractere (ele possui " +"%(length)d)." +msgstr[1] "" +"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " +"possui %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Por favor, envie um arquivo ou marque o checkbox, mas não ambos." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está " +"corrompido." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Faça uma escolha válida. %(value)s não é uma das escolhas disponíveis." + +msgid "Enter a list of values." +msgstr "Informe uma lista de valores." + +msgid "Enter a complete value." +msgstr "Insira um valor completo." + +msgid "Enter a valid UUID." +msgstr "Insira um UUID válido." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Campo oculto %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Os dados do ManagementForm não foram encontrados ou foram adulterados" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Por favor envie %d ou menos formulário." +msgstr[1] "Por favor envie %d ou menos formulários." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Por favor envie %d ou mais formulários." +msgstr[1] "Por favor envie %d ou mais formulários." + +msgid "Order" +msgstr "Ordem" + +msgid "Delete" +msgstr "Remover" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Por favor, corrija o valor duplicado para %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Por favor, corrija o valor duplicado para %(field)s, o qual deve ser único." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Por favor, corrija o dado duplicado para %(field_name)s, o qual deve ser " +"único para %(lookup)s em %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Por favor, corrija os valores duplicados abaixo." + +msgid "The inline value did not match the parent instance." +msgstr "O valor na linha não correspondeu com a instância pai." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Faça uma escolha válida. Sua escolha não é uma das disponíveis." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" não é um valor válido." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +" %(datetime)s não pôde ser interpretado no fuso horário " +"%(current_timezone)s; pode estar ambíguo ou pode não existir." + +msgid "Clear" +msgstr "Limpar" + +msgid "Currently" +msgstr "Atualmente" + +msgid "Change" +msgstr "Modificar" + +msgid "Unknown" +msgstr "Desconhecido" + +msgid "Yes" +msgstr "Sim" + +msgid "No" +msgstr "Não" + +msgid "yes,no,maybe" +msgstr "sim,não,talvez" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "meia-noite" + +msgid "noon" +msgstr "meio-dia" + +msgid "Monday" +msgstr "Segunda-feira" + +msgid "Tuesday" +msgstr "Terça-feira" + +msgid "Wednesday" +msgstr "Quarta-feira" + +msgid "Thursday" +msgstr "Quinta-feira" + +msgid "Friday" +msgstr "Sexta-feira" + +msgid "Saturday" +msgstr "Sábado" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Mon" +msgstr "Seg" + +msgid "Tue" +msgstr "Ter" + +msgid "Wed" +msgstr "Qua" + +msgid "Thu" +msgstr "Qui" + +msgid "Fri" +msgstr "Sex" + +msgid "Sat" +msgstr "Sab" + +msgid "Sun" +msgstr "Dom" + +msgid "January" +msgstr "Janeiro" + +msgid "February" +msgstr "Fevereiro" + +msgid "March" +msgstr "Março" + +msgid "April" +msgstr "Abril" + +msgid "May" +msgstr "Maio" + +msgid "June" +msgstr "Junho" + +msgid "July" +msgstr "Julho" + +msgid "August" +msgstr "Agosto" + +msgid "September" +msgstr "Setembro" + +msgid "October" +msgstr "Outubro" + +msgid "November" +msgstr "Novembro" + +msgid "December" +msgstr "Dezembro" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "fev" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "abr" + +msgid "may" +msgstr "mai" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ago" + +msgid "sep" +msgstr "set" + +msgid "oct" +msgstr "out" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dez" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Fev." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Março" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Abril" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maio" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Junho" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julho" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ago." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Set." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Out." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dez." + +msgctxt "alt. month" +msgid "January" +msgstr "Janeiro" + +msgctxt "alt. month" +msgid "February" +msgstr "Fevereiro" + +msgctxt "alt. month" +msgid "March" +msgstr "Março" + +msgctxt "alt. month" +msgid "April" +msgstr "Abril" + +msgctxt "alt. month" +msgid "May" +msgstr "Maio" + +msgctxt "alt. month" +msgid "June" +msgstr "Junho" + +msgctxt "alt. month" +msgid "July" +msgstr "Julho" + +msgctxt "alt. month" +msgid "August" +msgstr "Agosto" + +msgctxt "alt. month" +msgid "September" +msgstr "Setembro" + +msgctxt "alt. month" +msgid "October" +msgstr "Outubro" + +msgctxt "alt. month" +msgid "November" +msgstr "Novembro" + +msgctxt "alt. month" +msgid "December" +msgstr "Dezembro" + +msgid "This is not a valid IPv6 address." +msgstr "Este não é um endereço IPv6 válido." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +msgid "or" +msgstr "ou" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d ano" +msgstr[1] "%d anos" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mês" +msgstr[1] "%d meses" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dia" +msgstr[1] "%d dias" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +msgid "0 minutes" +msgstr "0 minutos" + +msgid "Forbidden" +msgstr "Proibido" + +msgid "CSRF verification failed. Request aborted." +msgstr "Verificação CSRF falhou. Pedido cancelado." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Você está vendo esta mensagem, porque este site HTTPS exige que um " +"'cabeçalho Referer' seja enviado pelo seu navegador, mas nenhum foi enviado. " +"Este cabeçalho é necessário por razões de segurança, para garantir que o seu " +"browser não está sendo invadido por terceiros." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Se você tiver configurado seu navegador para desativar os cabeçalhos " +"'Referer', por favor ative-os novamente, pelo menos para este site, ou para " +"conexões HTTPS ou para pedidos de 'mesma origem'." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Se você estiver usando a tag ou incluindo o cabeçalho \"Referrer-Policy: no-referrer\", remova-os. A " +"proteção contra CSRF requer que o cabeçalho 'Referer' faça uma verificação " +"rigorosa do referenciador. Se você estiver preocupado com a privacidade, use " +"alternativas para links para sites de terceiros." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Você está vendo esta mensagem, porque este site requer um cookie CSRF no " +"envio de formulários. Este cookie é necessário por razões de segurança, para " +"garantir que o seu browser não está sendo sequestrado por terceiros." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Se você tiver configurado seu browser para desativar os cookies, por favor " +"ative-os novamente, pelo menos para este site, ou para pedidos de 'mesma " +"origem'." + +msgid "More information is available with DEBUG=True." +msgstr "Mais informações estão disponíveis com DEBUG=True." + +msgid "No year specified" +msgstr "Ano não especificado" + +msgid "Date out of range" +msgstr "Data fora de alcance" + +msgid "No month specified" +msgstr "Mês não especificado" + +msgid "No day specified" +msgstr "Dia não especificado" + +msgid "No week specified" +msgstr "Semana não especificada" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Nenhum(a) %(verbose_name_plural)s disponível" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s futuros não disponíveis pois %(class_name)s." +"allow_future é False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "' %(datestr)s ' string de data inválida dado o formato ' %(format)s '" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "%(verbose_name)s não encontrado de acordo com a consulta" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" +"A página não é 'final', nem tampouco pode ser convertido para um inteiro." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Página inválida (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Lista vazia e '%(class_name)s.allow_empty' é False." + +msgid "Directory indexes are not allowed here." +msgstr "Índices de diretório não são permitidos aqui." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" não existe" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Índice de %(directory)s " + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: o framework web para perfeccionistas com prazo de entrega." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Ver as notas de lançamento do Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "A instalação foi com sucesso! Parabéns!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Você está vendo esta página pois possui DEBUG=True no seu arquivo de configurações e não configurou nenhuma " +"URL." + +msgid "Django Documentation" +msgstr "Documentação do Django" + +msgid "Topics, references, & how-to's" +msgstr "Tópicos, referências, & how-to's" + +msgid "Tutorial: A Polling App" +msgstr "Tutorial: Um aplicativo de votação" + +msgid "Get started with Django" +msgstr "Comece a usar Django" + +msgid "Django Community" +msgstr "Comunidade Django" + +msgid "Connect, get help, or contribute" +msgstr "Conecte-se, obtenha ajuda ou contribua" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/pt_BR/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/pt_BR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..62de5aa Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ro/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/ro/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f5124ee Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..3a0b6c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,1349 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mingun , 2014 +# Anton Bazhanov , 2017 +# Denis Darii , 2011 +# Dimmus , 2011 +# eigrad , 2012 +# Eugene , 2013 +# eXtractor , 2015 +# Igor Melnyk, 2014 +# Ivan Khomutov , 2017 +# Jannis Leidel , 2011 +# lilo.panic, 2016 +# Mikhail Zholobov , 2013 +# Nikolay Korotkiy , 2018 +# Вася Аникин , 2017 +# Алексей Борискин , 2013-2017,2019 +# Дмитрий Шатера , 2016,2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-18 21:13+0000\n" +"Last-Translator: Алексей Борискин \n" +"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "Afrikaans" +msgstr "Бурский" + +msgid "Arabic" +msgstr "Арабский" + +msgid "Asturian" +msgstr "Астурийский" + +msgid "Azerbaijani" +msgstr "Азербайджанский" + +msgid "Bulgarian" +msgstr "Болгарский" + +msgid "Belarusian" +msgstr "Белоруский" + +msgid "Bengali" +msgstr "Бенгальский" + +msgid "Breton" +msgstr "Бретонский" + +msgid "Bosnian" +msgstr "Боснийский" + +msgid "Catalan" +msgstr "Каталанский" + +msgid "Czech" +msgstr "Чешский" + +msgid "Welsh" +msgstr "Уэльский" + +msgid "Danish" +msgstr "Датский" + +msgid "German" +msgstr "Немецкий" + +msgid "Lower Sorbian" +msgstr "Нижнелужицкий" + +msgid "Greek" +msgstr "Греческий" + +msgid "English" +msgstr "Английский" + +msgid "Australian English" +msgstr "Австралийский английский" + +msgid "British English" +msgstr "Британский английский" + +msgid "Esperanto" +msgstr "Эсперанто" + +msgid "Spanish" +msgstr "Испанский" + +msgid "Argentinian Spanish" +msgstr "Аргентинский испанский" + +msgid "Colombian Spanish" +msgstr "Колумбийский испанский" + +msgid "Mexican Spanish" +msgstr "Мексиканский испанский" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуанский испанский" + +msgid "Venezuelan Spanish" +msgstr "Венесуэльский Испанский" + +msgid "Estonian" +msgstr "Эстонский" + +msgid "Basque" +msgstr "Баскский" + +msgid "Persian" +msgstr "Персидский" + +msgid "Finnish" +msgstr "Финский" + +msgid "French" +msgstr "Французский" + +msgid "Frisian" +msgstr "Фризский" + +msgid "Irish" +msgstr "Ирландский" + +msgid "Scottish Gaelic" +msgstr "Шотландский гэльский" + +msgid "Galician" +msgstr "Галисийский" + +msgid "Hebrew" +msgstr "Иврит" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Хорватский" + +msgid "Upper Sorbian" +msgstr "Верхнелужицкий" + +msgid "Hungarian" +msgstr "Венгерский" + +msgid "Armenian" +msgstr "Армянский" + +msgid "Interlingua" +msgstr "Интерлингва" + +msgid "Indonesian" +msgstr "Индонезийский" + +msgid "Ido" +msgstr "Идо" + +msgid "Icelandic" +msgstr "Исландский" + +msgid "Italian" +msgstr "Итальянский" + +msgid "Japanese" +msgstr "Японский" + +msgid "Georgian" +msgstr "Грузинский" + +msgid "Kabyle" +msgstr "Кабильский" + +msgid "Kazakh" +msgstr "Казахский" + +msgid "Khmer" +msgstr "Кхмерский" + +msgid "Kannada" +msgstr "Каннада" + +msgid "Korean" +msgstr "Корейский" + +msgid "Luxembourgish" +msgstr "Люксембургский" + +msgid "Lithuanian" +msgstr "Литовский" + +msgid "Latvian" +msgstr "Латвийский" + +msgid "Macedonian" +msgstr "Македонский" + +msgid "Malayalam" +msgstr "Малаялам" + +msgid "Mongolian" +msgstr "Монгольский" + +msgid "Marathi" +msgstr "Маратхи" + +msgid "Burmese" +msgstr "Бирманский" + +msgid "Norwegian Bokmål" +msgstr "Норвежский (Букмол)" + +msgid "Nepali" +msgstr "Непальский" + +msgid "Dutch" +msgstr "Голландский" + +msgid "Norwegian Nynorsk" +msgstr "Норвежский (Нюнорск)" + +msgid "Ossetic" +msgstr "Осетинский" + +msgid "Punjabi" +msgstr "Панджаби" + +msgid "Polish" +msgstr "Польский" + +msgid "Portuguese" +msgstr "Португальский" + +msgid "Brazilian Portuguese" +msgstr "Бразильский португальский" + +msgid "Romanian" +msgstr "Румынский" + +msgid "Russian" +msgstr "Русский" + +msgid "Slovak" +msgstr "Словацкий" + +msgid "Slovenian" +msgstr "Словенский" + +msgid "Albanian" +msgstr "Албанский" + +msgid "Serbian" +msgstr "Сербский" + +msgid "Serbian Latin" +msgstr "Сербский (латиница)" + +msgid "Swedish" +msgstr "Шведский" + +msgid "Swahili" +msgstr "Суахили" + +msgid "Tamil" +msgstr "Тамильский" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Thai" +msgstr "Тайский" + +msgid "Turkish" +msgstr "Турецкий" + +msgid "Tatar" +msgstr "Татарский" + +msgid "Udmurt" +msgstr "Удмуртский" + +msgid "Ukrainian" +msgstr "Украинский" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнамский" + +msgid "Simplified Chinese" +msgstr "Упрощенный китайский" + +msgid "Traditional Chinese" +msgstr "Традиционный китайский" + +msgid "Messages" +msgstr "Сообщения" + +msgid "Site Maps" +msgstr "Карта сайта" + +msgid "Static Files" +msgstr "Статические файлы" + +msgid "Syndication" +msgstr "Ленты новостей" + +msgid "That page number is not an integer" +msgstr "Номер страницы не является натуральным числом" + +msgid "That page number is less than 1" +msgstr "Номер страницы меньше 1" + +msgid "That page contains no results" +msgstr "Страница не содержит результатов" + +msgid "Enter a valid value." +msgstr "Введите правильное значение." + +msgid "Enter a valid URL." +msgstr "Введите правильный URL." + +msgid "Enter a valid integer." +msgstr "Введите правильное число." + +msgid "Enter a valid email address." +msgstr "Введите правильный адрес электронной почты." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Значение должно состоять только из букв, цифр, знаков подчеркивания или " +"дефиса." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Значение должно состоять только из букв, цифр, символов подчёркивания или " +"дефисов, входящих в стандарт Юникод." + +msgid "Enter a valid IPv4 address." +msgstr "Введите правильный IPv4 адрес." + +msgid "Enter a valid IPv6 address." +msgstr "Введите действительный IPv6 адрес." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Введите действительный IPv4 или IPv6 адрес." + +msgid "Enter only digits separated by commas." +msgstr "Введите цифры, разделенные запятыми." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Убедитесь, что это значение — %(limit_value)s (сейчас оно — %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Убедитесь, что это значение меньше либо равно %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Убедитесь, что это значение больше либо равно %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Убедитесь, что это значение содержит не менее %(limit_value)d символ (сейчас " +"%(show_value)d)." +msgstr[1] "" +"Убедитесь, что это значение содержит не менее %(limit_value)d символов " +"(сейчас %(show_value)d)." +msgstr[2] "" +"Убедитесь, что это значение содержит не менее %(limit_value)d символов " +"(сейчас %(show_value)d)." +msgstr[3] "" +"Убедитесь, что это значение содержит не менее %(limit_value)d символов " +"(сейчас %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Убедитесь, что это значение содержит не более %(limit_value)d символ (сейчас " +"%(show_value)d)." +msgstr[1] "" +"Убедитесь, что это значение содержит не более %(limit_value)d символов " +"(сейчас %(show_value)d)." +msgstr[2] "" +"Убедитесь, что это значение содержит не более %(limit_value)d символов " +"(сейчас %(show_value)d)." +msgstr[3] "" +"Убедитесь, что это значение содержит не более %(limit_value)d символов " +"(сейчас %(show_value)d)." + +msgid "Enter a number." +msgstr "Введите число." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры." +msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр." +msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр." +msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры после запятой." +msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." +msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." +msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр после запятой." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Убедитесь, что вы ввели не более %(max)s цифры перед запятой." +msgstr[1] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." +msgstr[2] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." +msgstr[3] "Убедитесь, что вы ввели не более %(max)s цифр перед запятой." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Формат файлов '%(extension)s' не поддерживается. Поддерживаемые форматы " +"файлов: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Данные содержат запрещённый символ: ноль-байт" + +msgid "and" +msgstr "и" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" +"%(model_name)s с такими значениями полей %(field_labels)s уже существует." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Значения %(value)r нет среди допустимых вариантов." + +msgid "This field cannot be null." +msgstr "Это поле не может иметь значение NULL." + +msgid "This field cannot be blank." +msgstr "Это поле не может быть пустым." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s с таким %(field_label)s уже существует." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"Значение в поле «%(field_label)s» должно быть уникальным для фрагмента " +"«%(lookup_type)s» даты в поле %(date_field_label)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Поле типа %(field_type)s" + +msgid "Integer" +msgstr "Целое" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Значение '%(value)s' должно быть целым числом." + +msgid "Big (8 byte) integer" +msgstr "Длинное целое (8 байт)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Значение '%(value)s' должно быть True или False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "Значение '%(value)s' должно быть True, False или None." + +msgid "Boolean (Either True or False)" +msgstr "Логическое (True или False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Строка (до %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Целые, разделенные запятыми" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Значение '%(value)s' имеет неверный формат даты. Оно должно быть в формате " +"YYYY-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Значение '%(value)s' имеет корректный формат (YYYY-MM-DD), но это " +"недействительная дата." + +msgid "Date (without time)" +msgstr "Дата (без указания времени)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Значение '%(value)s' имеет неверный формат. Оно должно быть в формате YYYY-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Значение '%(value)s' имеет корректный формат (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), но это недействительные дата/время." + +msgid "Date (with time)" +msgstr "Дата (с указанием времени)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Значение '%(value)s' должно быть числом с фиксированной запятой." + +msgid "Decimal number" +msgstr "Число с фиксированной запятой" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"Значение '%(value)s' имеет неверный формат. Оно должно быть в формате [DD] " +"[HH:[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Продолжительность" + +msgid "Email address" +msgstr "Адрес электронной почты" + +msgid "File path" +msgstr "Путь к файлу" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "Значение '%(value)s' должно быть числом с плавающей запятой." + +msgid "Floating point number" +msgstr "Число с плавающей запятой" + +msgid "IPv4 address" +msgstr "IPv4 адрес" + +msgid "IP address" +msgstr "IP-адрес" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Значение '%(value)s' должно быть None, True или False." + +msgid "Boolean (Either True, False or None)" +msgstr "Логическое (True, False или None)" + +msgid "Positive integer" +msgstr "Положительное целое число" + +msgid "Positive small integer" +msgstr "Положительное малое целое число" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Слаг (до %(max_length)s)" + +msgid "Small integer" +msgstr "Малое целое число" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Значение '%(value)s' имеет неверный формат. Оно должно быть в формате HH:MM[:" +"ss[.uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Значение '%(value)s' имеет корректный формат (HH:MM[:ss[.uuuuuu]]), но это " +"недействительное время." + +msgid "Time" +msgstr "Время" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Необработанные двоичные данные" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "Значение '%(value)s' не является верным UUID-ом." + +msgid "Universally unique identifier" +msgstr "Поле для UUID, универсального уникального идентификатора" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Изображение" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" +"Объект модели %(model)s со значением поля %(field)s, равным %(value)r, не " +"существует." + +msgid "Foreign Key (type determined by related field)" +msgstr "Внешний Ключ (тип определен по связанному полю)" + +msgid "One-to-one relationship" +msgstr "Связь \"один к одному\"" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Связь %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Связьи %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Связь \"многие ко многим\"" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Обязательное поле." + +msgid "Enter a whole number." +msgstr "Введите целое число." + +msgid "Enter a valid date." +msgstr "Введите правильную дату." + +msgid "Enter a valid time." +msgstr "Введите правильное время." + +msgid "Enter a valid date/time." +msgstr "Введите правильную дату и время." + +msgid "Enter a valid duration." +msgstr "Введите правильную продолжительность." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Количество дней должно быть в диапазоне от {min_days} до {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Ни одного файла не было отправлено. Проверьте тип кодировки формы." + +msgid "No file was submitted." +msgstr "Ни одного файла не было отправлено." + +msgid "The submitted file is empty." +msgstr "Отправленный файл пуст." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Убедитесь, что это имя файла содержит не более %(max)d символ (сейчас " +"%(length)d)." +msgstr[1] "" +"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " +"%(length)d)." +msgstr[2] "" +"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " +"%(length)d)." +msgstr[3] "" +"Убедитесь, что это имя файла содержит не более %(max)d символов (сейчас " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Пожалуйста, загрузите файл или поставьте флажок \"Очистить\", но не " +"совершайте оба действия одновременно." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Загрузите правильное изображение. Файл, который вы загрузили, поврежден или " +"не является изображением." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Выберите корректный вариант. %(value)s нет среди допустимых значений." + +msgid "Enter a list of values." +msgstr "Введите список значений." + +msgid "Enter a complete value." +msgstr "Введите весь список значений." + +msgid "Enter a valid UUID." +msgstr "Введите правильный UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Скрытое поле %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Данные управляющей формы отсутствуют или были повреждены" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Пожалуйста, заполните не более %d формы." +msgstr[1] "Пожалуйста, заполните не более %d форм." +msgstr[2] "Пожалуйста, заполните не более %d форм." +msgstr[3] "Пожалуйста, заполните не более %d форм." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Пожалуйста, отправьте как минимум %d форму." +msgstr[1] "Пожалуйста, отправьте как минимум %d формы." +msgstr[2] "Пожалуйста, отправьте как минимум %d форм." +msgstr[3] "Пожалуйста, отправьте как минимум %d форм." + +msgid "Order" +msgstr "Порядок" + +msgid "Delete" +msgstr "Удалить" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Пожалуйста, измените повторяющееся значение в поле \"%(field)s\"." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Пожалуйста, измените значение в поле %(field)s, оно должно быть уникальным." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Пожалуйста, измените значение в поле %(field_name)s, оно должно быть " +"уникальным для %(lookup)s в поле %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Пожалуйста, измените повторяющиеся значения ниже." + +msgid "The inline value did not match the parent instance." +msgstr "Значение во вложенной форме не совпадает со значением в базовой форме." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Выберите корректный вариант. Вашего варианта нет среди допустимых значений." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" не является верным значением." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s не может быть интерпретирована в часовом поясе " +"%(current_timezone)s; дата может быть неоднозначной или оказаться " +"несуществующей." + +msgid "Clear" +msgstr "Очистить" + +msgid "Currently" +msgstr "На данный момент" + +msgid "Change" +msgstr "Изменить" + +msgid "Unknown" +msgstr "Неизвестно" + +msgid "Yes" +msgstr "Да" + +msgid "No" +msgstr "Нет" + +msgid "yes,no,maybe" +msgstr "да,нет,может быть" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" +msgstr[1] "%(size)d байта" +msgstr[2] "%(size)d байт" +msgstr[3] "%(size)d байт" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s ГБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "п.п." + +msgid "a.m." +msgstr "д.п." + +msgid "PM" +msgstr "ПП" + +msgid "AM" +msgstr "ДП" + +msgid "midnight" +msgstr "полночь" + +msgid "noon" +msgstr "полдень" + +msgid "Monday" +msgstr "Понедельник" + +msgid "Tuesday" +msgstr "Вторник" + +msgid "Wednesday" +msgstr "Среда" + +msgid "Thursday" +msgstr "Четверг" + +msgid "Friday" +msgstr "Пятница" + +msgid "Saturday" +msgstr "Суббота" + +msgid "Sunday" +msgstr "Воскресенье" + +msgid "Mon" +msgstr "Пн" + +msgid "Tue" +msgstr "Вт" + +msgid "Wed" +msgstr "Ср" + +msgid "Thu" +msgstr "Чт" + +msgid "Fri" +msgstr "Пт" + +msgid "Sat" +msgstr "Сб" + +msgid "Sun" +msgstr "Вс" + +msgid "January" +msgstr "Январь" + +msgid "February" +msgstr "Февраль" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрель" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июнь" + +msgid "July" +msgstr "Июль" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябрь" + +msgid "October" +msgstr "Октябрь" + +msgid "November" +msgstr "Ноябрь" + +msgid "December" +msgstr "Декабрь" + +msgid "jan" +msgstr "янв" + +msgid "feb" +msgstr "фев" + +msgid "mar" +msgstr "мар" + +msgid "apr" +msgstr "апр" + +msgid "may" +msgstr "май" + +msgid "jun" +msgstr "июн" + +msgid "jul" +msgstr "июл" + +msgid "aug" +msgstr "авг" + +msgid "sep" +msgstr "сен" + +msgid "oct" +msgstr "окт" + +msgid "nov" +msgstr "ноя" + +msgid "dec" +msgstr "дек" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Янв." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Фев." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Март" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Апрель" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Июнь" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Июль" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Сен." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Ноя." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дек." + +msgctxt "alt. month" +msgid "January" +msgstr "января" + +msgctxt "alt. month" +msgid "February" +msgstr "февраля" + +msgctxt "alt. month" +msgid "March" +msgstr "марта" + +msgctxt "alt. month" +msgid "April" +msgstr "апреля" + +msgctxt "alt. month" +msgid "May" +msgstr "мая" + +msgctxt "alt. month" +msgid "June" +msgstr "июня" + +msgctxt "alt. month" +msgid "July" +msgstr "июля" + +msgctxt "alt. month" +msgid "August" +msgstr "августа" + +msgctxt "alt. month" +msgid "September" +msgstr "сентября" + +msgctxt "alt. month" +msgid "October" +msgstr "октября" + +msgctxt "alt. month" +msgid "November" +msgstr "ноября" + +msgctxt "alt. month" +msgid "December" +msgstr "декабря" + +msgid "This is not a valid IPv6 address." +msgstr "Значение не является корректным адресом IPv6." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "или" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d год" +msgstr[1] "%d года" +msgstr[2] "%d лет" +msgstr[3] "%d лет" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d месяц" +msgstr[1] "%d месяца" +msgstr[2] "%d месяцев" +msgstr[3] "%d месяцев" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d неделя" +msgstr[1] "%d недели" +msgstr[2] "%d недель" +msgstr[3] "%d недель" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d день" +msgstr[1] "%d дня" +msgstr[2] "%d дней" +msgstr[3] "%d дней" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d час" +msgstr[1] "%d часа" +msgstr[2] "%d часов" +msgstr[3] "%d часов" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минута" +msgstr[1] "%d минуты" +msgstr[2] "%d минут" +msgstr[3] "%d минут" + +msgid "0 minutes" +msgstr "0 минут" + +msgid "Forbidden" +msgstr "Ошибка доступа" + +msgid "CSRF verification failed. Request aborted." +msgstr "Ошибка проверки CSRF. Запрос отклонён." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Вы видите это сообщение, потому что данный сайт использует защищённое " +"соединение и требует, чтобы заголовок 'Referer' был передан вашим браузером, " +"но он не был им передан. Данный заголовок необходим по соображениям " +"безопасности, чтобы убедиться, что ваш браузер не был взломан, а запрос к " +"серверу не был перехвачен или подменён." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Если вы настроили свой браузер таким образом, чтобы запретить ему передавать " +"заголовок 'Referer', пожалуйста, разрешите ему отсылать данный заголовок по " +"крайней мере для данного сайта, или для всех HTTPS-соединений, или для " +"запросов, домен и порт назначения совпадают с доменом и портом текущей " +"страницы." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Если Вы используете HTML-тэг или добавили HTTP-заголовок 'Referrer-Policy: no-referrer', пожалуйста " +"удалите их. CSRF защите необходим заголовок 'Referer' для строгой проверки " +"адреса ссылающейся страницы. Если Вы беспокоитесь о приватности, используйте " +"альтернативы, например , для ссылок на сайты " +"третьих лиц." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Вы видите это сообщение, потому что данный сайт требует, чтобы при отправке " +"форм была отправлена и CSRF-cookie. Данный тип cookie необходим по " +"соображениям безопасности, чтобы убедиться, что ваш браузер не был взломан и " +"не выполняет от вашего лица действий, запрограммированных третьими лицами." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Если вы настроили свой браузер таким образом, чтобы он не передавал или не " +"хранил cookie, пожалуйста, включите эту функцию вновь, по крайней мере для " +"этого сайта, или для запросов, чьи домен и порт совпадают с доменом и портом " +"текущей страницы." + +msgid "More information is available with DEBUG=True." +msgstr "" +"В отладочном режиме доступно больше информации. Включить отладочный режим " +"можно, установив значение переменной DEBUG=True." + +msgid "No year specified" +msgstr "Не указан год" + +msgid "Date out of range" +msgstr "Дата выходит за пределы диапазона" + +msgid "No month specified" +msgstr "Не указан месяц" + +msgid "No day specified" +msgstr "Не указан день" + +msgid "No week specified" +msgstr "Не указана неделя" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s не доступен" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Будущие %(verbose_name_plural)s недоступны, потому что %(class_name)s." +"allow_future выставлен в значение \"Ложь\"." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"Не удалось распознать строку с датой '%(datestr)s', используя формат " +"'%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Не найден ни один %(verbose_name)s, соответствующий запросу" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" +"Номер страницы не содержит особое значение 'last', и его не удалось " +"преобразовать к целому числу." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Неправильная страница (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" +"Список пуст, но '%(class_name)s.allow_empty' выставлено в значение \"Ложь\", " +"что запрещает показывать пустые списки." + +msgid "Directory indexes are not allowed here." +msgstr "Просмотр списка файлов директории здесь не разрешен." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" не существует" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Список файлов директории %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: веб-фреймворк для перфекционистов с дедлайнами." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Посмотреть замечания к выпуску для Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Установка прошла успешно! Поздравляем!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Вы видите данную страницу, потому что указали DEBUG=True в файле настроек и не настроили ни одного " +"обработчика URL-адресов." + +msgid "Django Documentation" +msgstr "Документация Django" + +msgid "Topics, references, & how-to's" +msgstr "Разделы, справочник, & примеры" + +msgid "Tutorial: A Polling App" +msgstr "Руководство: Приложение для голосования" + +msgid "Get started with Django" +msgstr "Начало работы с Django" + +msgid "Django Community" +msgstr "Сообщество Django" + +msgid "Connect, get help, or contribute" +msgstr "Присоединяйтесь, получайте помощь или помогайте в разработке" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6f59009 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/sk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ac3953d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..41d42e3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,1278 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011-2014 +# Besnik , 2015-2019 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-30 10:51+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arabe" + +msgid "Asturian" +msgstr "Asturiase" + +msgid "Azerbaijani" +msgstr "Azerbaixhanase" + +msgid "Bulgarian" +msgstr "Bulgare" + +msgid "Belarusian" +msgstr "Bjelloruse" + +msgid "Bengali" +msgstr "Bengaleze" + +msgid "Breton" +msgstr "Bretone" + +msgid "Bosnian" +msgstr "Boshnjake" + +msgid "Catalan" +msgstr "Katalane" + +msgid "Czech" +msgstr "Çeke" + +msgid "Welsh" +msgstr "Uellsiane" + +msgid "Danish" +msgstr "Daneze" + +msgid "German" +msgstr "Gjermane" + +msgid "Lower Sorbian" +msgstr "Sorbiane e Poshtme" + +msgid "Greek" +msgstr "Greke" + +msgid "English" +msgstr "Angleze" + +msgid "Australian English" +msgstr "Angleze Australiane" + +msgid "British English" +msgstr "Angleze Britanike" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spanjolle" + +msgid "Argentinian Spanish" +msgstr "Spanjolle Argjentinase" + +msgid "Colombian Spanish" +msgstr "Spanjolle Kolumbiane" + +msgid "Mexican Spanish" +msgstr "Spanjolle Meksikane" + +msgid "Nicaraguan Spanish" +msgstr "Spanjolle Nikaraguane" + +msgid "Venezuelan Spanish" +msgstr "Spanjolle Venezuelane" + +msgid "Estonian" +msgstr "Estoneze" + +msgid "Basque" +msgstr "Baske" + +msgid "Persian" +msgstr "Persiane" + +msgid "Finnish" +msgstr "Finlandeze" + +msgid "French" +msgstr "Frënge" + +msgid "Frisian" +msgstr "Frisiane" + +msgid "Irish" +msgstr "Irlandeze" + +msgid "Scottish Gaelic" +msgstr "Skoceze Gaelike" + +msgid "Galician" +msgstr "Galike" + +msgid "Hebrew" +msgstr "Hebraishte" + +msgid "Hindi" +msgstr "Indiane" + +msgid "Croatian" +msgstr "Kroate" + +msgid "Upper Sorbian" +msgstr "Sorbiane e Sipërme" + +msgid "Hungarian" +msgstr "Hungareze" + +msgid "Armenian" +msgstr "Armenisht" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indoneziane" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandeze" + +msgid "Italian" +msgstr "Italiane" + +msgid "Japanese" +msgstr "Japoneze" + +msgid "Georgian" +msgstr "Gjeorgjiane" + +msgid "Kabyle" +msgstr "Kabilase" + +msgid "Kazakh" +msgstr "Kazake" + +msgid "Khmer" +msgstr "Khmere" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreane" + +msgid "Luxembourgish" +msgstr "Luksemburgase" + +msgid "Lithuanian" +msgstr "Lituaneze" + +msgid "Latvian" +msgstr "Letoneze" + +msgid "Macedonian" +msgstr "Maqedone" + +msgid "Malayalam" +msgstr "Malajalame" + +msgid "Mongolian" +msgstr "Mongoliane" + +msgid "Marathi" +msgstr "Marati" + +msgid "Burmese" +msgstr "Burmeze" + +msgid "Norwegian Bokmål" +msgstr "Norvegjeze Bokmal" + +msgid "Nepali" +msgstr "Nepaleze" + +msgid "Dutch" +msgstr "Holandeze" + +msgid "Norwegian Nynorsk" +msgstr "Norvegjeze Nynorsk" + +msgid "Ossetic" +msgstr "Osetishte" + +msgid "Punjabi" +msgstr "Panxhabe" + +msgid "Polish" +msgstr "Polake" + +msgid "Portuguese" +msgstr "Portugeze" + +msgid "Brazilian Portuguese" +msgstr "Portugeze Braziliane" + +msgid "Romanian" +msgstr "Rumune" + +msgid "Russian" +msgstr "Ruse" + +msgid "Slovak" +msgstr "Sllovake " + +msgid "Slovenian" +msgstr "Slovene" + +msgid "Albanian" +msgstr "Shqipe" + +msgid "Serbian" +msgstr "Serbe" + +msgid "Serbian Latin" +msgstr "Serbe Latine" + +msgid "Swedish" +msgstr "Suedeze" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamileze" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Thai" +msgstr "Tajlandeze" + +msgid "Turkish" +msgstr "Turke" + +msgid "Tatar" +msgstr "Tatare" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Ukrainian" +msgstr "Ukrainase" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Vietnamese" +msgstr "Vietnameze" + +msgid "Simplified Chinese" +msgstr "Kineze e Thjeshtuar" + +msgid "Traditional Chinese" +msgstr "Kineze Tradicionale" + +msgid "Messages" +msgstr "Mesazhe" + +msgid "Site Maps" +msgstr "Harta Sajti" + +msgid "Static Files" +msgstr "Kartela Statike" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "Ai numër faqeje s’është numër i plotë" + +msgid "That page number is less than 1" +msgstr "Ai numër faqeje është më i vogël se 1" + +msgid "That page contains no results" +msgstr "Ajo faqe s’përmban përfundime" + +msgid "Enter a valid value." +msgstr "Jepni një vlerë të vlefshme." + +msgid "Enter a valid URL." +msgstr "Jepni një URL të vlefshme." + +msgid "Enter a valid integer." +msgstr "Jepni një numër të plotë të vlefshëm." + +msgid "Enter a valid email address." +msgstr "Jepni një adresë email të vlefshme." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Jepni një 'slug' të vlefshëm, të përbërë nga shkronja, numra, nënvija ose " +"vija në mes." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Jeoni një 'slug' të vlefshëm, të përbërë nga shkronja, numra, nënvija ose " +"vija ndarëse Unikod." + +msgid "Enter a valid IPv4 address." +msgstr "Jepni një adresë IPv4 të vlefshme." + +msgid "Enter a valid IPv6 address." +msgstr "Jepni një adresë IPv6 të vlefshme." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Jepni një adresë IPv4 ose IPv6 të vlefshme." + +msgid "Enter only digits separated by commas." +msgstr "Jepni vetëm shifra të ndara nga presje." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Siguroni që kjo vlerë të jetë %(limit_value)s (është %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Siguroni që kjo vlerë të jetë më e vogël ose baras me %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Siguroni që kjo vlerë është më e madhe ose baras me %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Sigurohuni që kjo vlerë ka të paktën %(limit_value)d shenjë (ka " +"%(show_value)d)." +msgstr[1] "" +"Sigurohuni që kjo vlerë ka të paktën %(limit_value)d shenja (ka " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Sigurohuni që kjo vlerë ka të shumtën %(limit_value)d shenjë (ka " +"%(show_value)d)." +msgstr[1] "" +"Sigurohuni që kjo vlerë ka të shumtën %(limit_value)d shenja (ka " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Jepni një numër." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Sigurohuni që s’ka më tepër se %(max)s shifër gjithsej." +msgstr[1] "Sigurohuni që s’ka më tepër se %(max)s shifra gjithsej." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Sigurohuni që s’ka më shumë se %(max)s vend dhjetor." +msgstr[1] "Sigurohuni që s’ka më shumë se %(max)s vende dhjetore." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Sigurohuni që s’ka më tepër se %(max)s shifër para presjes dhjetore." +msgstr[1] "" +"Sigurohuni që s’ka më tepër se %(max)s shifra para presjes dhjetore." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Zgjatimi '%(extension)s' për kartela nuk lejohet. Zgjatime të lejuara janë: " +"'%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "Nuk lejohen shenja null." + +msgid "and" +msgstr "dhe " + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Ka tashmë %(model_name)s me këtë %(field_labels)s." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Vlera %(value)r s’është zgjedhje e vlefshme." + +msgid "This field cannot be null." +msgstr "Kjo fushë s’mund të përmbajë shenja null." + +msgid "This field cannot be blank." +msgstr "Kjo fushë s’mund të jetë e paplotësuar." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Ka tashmë një %(model_name)s me këtë %(field_label)s." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s duhet të jetë unike për %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Fushë e llojit: %(field_type)s" + +msgid "Integer" +msgstr "Numër i plotë" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Vlera '%(value)s' duhet të jetë një numër i plotë." + +msgid "Big (8 byte) integer" +msgstr "Numër i plotë i madh (8 bajte)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Vlera '%(value)s' duhet të jetë True ose False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "Vlera për '%(value)s' duhet të jetë ose True, ose False, ose None." + +msgid "Boolean (Either True or False)" +msgstr "Buleane (Ose True, ose False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Varg (deri në %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Numra të plotë të ndarë me presje" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Vlera '%(value)s' ka një format të pavlefshëm datash. Duhet të jetë në " +"formatin YYYY-MM-DD." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Vlera '%(value)s' ka formatin e saktë (YYYY-MM-DD), por është datë e " +"pavlefshme." + +msgid "Date (without time)" +msgstr "Datë (pa kohë)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Vlera '%(value)s' ka një format të pavlefshëm. Duhet të jetë në formatin " +"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Vlera '%(value)s' ka format të saktë (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), " +"por është datë/kohë e pavlefshme." + +msgid "Date (with time)" +msgstr "Datë (me kohë)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Vlera '%(value)s' duhet të jetë një numër dhjetor." + +msgid "Decimal number" +msgstr "Numër dhjetor" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"Vlera '%(value)s' ka format të pavlefshëm. Duhet të jetë në formatin [DD] " +"[HH:[MM:]]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Kohëzgjatje" + +msgid "Email address" +msgstr "Adresë email" + +msgid "File path" +msgstr "Shteg kartele" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "" + +msgid "IPv4 address" +msgstr "Adresë IPv4" + +msgid "IP address" +msgstr "Adresë IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Vlera '%(value)s' duhet të jetë None, True ose False." + +msgid "Boolean (Either True, False or None)" +msgstr "Buleane (Ose True, ose False, ose None)" + +msgid "Positive integer" +msgstr "Numër i plotë pozitiv" + +msgid "Positive small integer" +msgstr "Numër i plotë pozitiv i vogël" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Identifikues (deri në %(max_length)s)" + +msgid "Small integer" +msgstr "Numër i plotë i vogël" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Vlera '%(value)s' ka format të pavlefshëm. Duhet të jetë në formatin HH:MM[:" +"ss[.uuuuuu]]." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Vlera '%(value)s' ka formatin e saktë (HH:MM[:ss[.uuuuuu]]) por është kohë e " +"pavlefshme." + +msgid "Time" +msgstr "Kohë" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Të dhëna dyore të papërpunuara" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' s’është UUID i vlefshëm." + +msgid "Universally unique identifier" +msgstr "Identifikues universalisht unik" + +msgid "File" +msgstr "Kartelë" + +msgid "Image" +msgstr "Figurë" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "Instanca %(model)s me %(field)s %(value)r s’ekziston." + +msgid "Foreign Key (type determined by related field)" +msgstr "Kyç i Jashtëm (lloj i përcaktuar nga fusha përkatëse)" + +msgid "One-to-one relationship" +msgstr "Marrëdhënie një-për-një" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Marrëdhënie %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Marrëdhënie %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Marrëdhënie shumë-për-shumë" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Kjo fushë është e domosdoshme." + +msgid "Enter a whole number." +msgstr "Jepni një numër të tërë." + +msgid "Enter a valid date." +msgstr "Jepni një datë të vlefshme." + +msgid "Enter a valid time." +msgstr "Jepni një kohë të vlefshme." + +msgid "Enter a valid date/time." +msgstr "Jepni një datë/kohë të vlefshme." + +msgid "Enter a valid duration." +msgstr "Jepni një kohëzgjatje të vlefshme." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Numri i ditëve duhet të jetë mes {min_days} dhe {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"S’u parashtrua ndonjë kartelë. Kontrolloni llojin e kodimit te formulari." + +msgid "No file was submitted." +msgstr "S’u parashtrua kartelë." + +msgid "The submitted file is empty." +msgstr "Kartela e parashtruar është e zbrazët." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenjë (it has " +"%(length)d)." +msgstr[1] "" +"Sigurohuni që ky emër kartele ka të shumtën %(max)d shenja (it has " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Ju lutemi, ose parashtroni një kartelë, ose i vini shenjë kutizës për " +"pastrim, jo që të dyja." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Ngarkoni një figurë të vlefshme. Kartela që ngarkuat ose nuk qe figurë, ose " +"qe figurë e dëmtuar." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Përzgjidhni një zgjedhje të vlefshme. %(value)s s’është një nga zgjedhjet e " +"mundshme." + +msgid "Enter a list of values." +msgstr "Jepni një listë vlerash." + +msgid "Enter a complete value." +msgstr "Jepni një vlerë të plotë." + +msgid "Enter a valid UUID." +msgstr "Jepni një UUID të vlefshëm." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Fushë e fshehur %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Të dhënat ManagementForm mungojnë ose është vënë dorë mbi to" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Ju lutemi, parashtroni %d ose më pak formularë." +msgstr[1] "Ju lutemi, parashtroni %d ose më pak formularë." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Ju lutemi, parashtroni %d ose më shumë formularë." +msgstr[1] "Ju lutemi, parashtroni %d ose më shumë formularë." + +msgid "Order" +msgstr "Renditi" + +msgid "Delete" +msgstr "Fshije" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field)s, të cilat duhet të " +"jenë unike." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Ju lutemi, ndreqni të dhënat e përsëdytura për %(field_name)s të cilat duhet " +"të jenë unike për %(lookup)s te %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Ju lutemi, ndreqni më poshtë vlerat e përsëdytura." + +msgid "The inline value did not match the parent instance." +msgstr "Vlera e brendshme s’u përputh me instancën prind." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Përzgjidhni një zgjedhje të vlefshme. Ajo zgjedhje nuk është një nga " +"zgjedhjet e mundshme." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" s’është vlerë e vlefshme." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s s’u interpretua dot brenda zonës kohore %(current_timezone)s; " +"mund të jetë e dykuptimtë, ose mund të mos ekzistojë." + +msgid "Clear" +msgstr "Pastroje" + +msgid "Currently" +msgstr "Tani" + +msgid "Change" +msgstr "Ndryshoje" + +msgid "Unknown" +msgstr "E panjohur" + +msgid "Yes" +msgstr "Po" + +msgid "No" +msgstr "Jo" + +msgid "yes,no,maybe" +msgstr "po,jo,ndoshta" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bajt" +msgstr[1] "%(size)d bajte" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "mesnatë" + +msgid "noon" +msgstr "mesditë" + +msgid "Monday" +msgstr "E hënë" + +msgid "Tuesday" +msgstr "E martë" + +msgid "Wednesday" +msgstr "E mërkurë" + +msgid "Thursday" +msgstr "E enjte" + +msgid "Friday" +msgstr "E premte" + +msgid "Saturday" +msgstr "E shtunë" + +msgid "Sunday" +msgstr "E dielë" + +msgid "Mon" +msgstr "Hën" + +msgid "Tue" +msgstr "Mar" + +msgid "Wed" +msgstr "Mër" + +msgid "Thu" +msgstr "Enj" + +msgid "Fri" +msgstr "Pre" + +msgid "Sat" +msgstr "Sht" + +msgid "Sun" +msgstr "Die" + +msgid "January" +msgstr "Janar" + +msgid "February" +msgstr "Shkurt" + +msgid "March" +msgstr "Mars" + +msgid "April" +msgstr "Prill" + +msgid "May" +msgstr "Maj" + +msgid "June" +msgstr "Qershor" + +msgid "July" +msgstr "Korrik" + +msgid "August" +msgstr "Gusht" + +msgid "September" +msgstr "Shtator" + +msgid "October" +msgstr "Tetor" + +msgid "November" +msgstr "Nëntor" + +msgid "December" +msgstr "Dhjetor" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "shk" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "pri" + +msgid "may" +msgstr "maj" + +msgid "jun" +msgstr "qer" + +msgid "jul" +msgstr "kor" + +msgid "aug" +msgstr "gus" + +msgid "sep" +msgstr "sht" + +msgid "oct" +msgstr "tet" + +msgid "nov" +msgstr "nën" + +msgid "dec" +msgstr "dhj" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Shk." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mars" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Prill" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Qershor" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Korrik" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Gus." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Shta." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Tet." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nën." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dhj." + +msgctxt "alt. month" +msgid "January" +msgstr "Janar" + +msgctxt "alt. month" +msgid "February" +msgstr "Shkurt" + +msgctxt "alt. month" +msgid "March" +msgstr "Mars" + +msgctxt "alt. month" +msgid "April" +msgstr "Prill" + +msgctxt "alt. month" +msgid "May" +msgstr "Maj" + +msgctxt "alt. month" +msgid "June" +msgstr "Qershor" + +msgctxt "alt. month" +msgid "July" +msgstr "Korrik" + +msgctxt "alt. month" +msgid "August" +msgstr "Gusht" + +msgctxt "alt. month" +msgid "September" +msgstr "Shtator" + +msgctxt "alt. month" +msgid "October" +msgstr "Tetor" + +msgctxt "alt. month" +msgid "November" +msgstr "Nëntor" + +msgctxt "alt. month" +msgid "December" +msgstr "Dhjetor" + +msgid "This is not a valid IPv6 address." +msgstr "Kjo s’është adresë IPv6 e vlefshme." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "ose" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d vit" +msgstr[1] "%d vjet" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d muaj" +msgstr[1] "%d muaj" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d javë" +msgstr[1] "%d javë" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d ditë" +msgstr[1] "%d ditë" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d orë" +msgstr[1] "%d orë" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutë" +msgstr[1] "%d minuta" + +msgid "0 minutes" +msgstr "0 minuta" + +msgid "Forbidden" +msgstr "E ndaluar" + +msgid "CSRF verification failed. Request aborted." +msgstr "Verifikimi CSRF dështoi. Kërkesa u ndërpre." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Këtë mesazh po e shihni ngaqë ky sajt HTTPS e ka të domosdoshme dërgimin e " +"'Referer header' te shfletuesi juaj Web, por s’u dërgua ndonjë i tillë. Kjo " +"krye është e domosdoshme për arsye sigurie, për të bërë të mundur që " +"shfletuesi juaj të mos komprometohet nga palë të treta." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Nëse e keni formësuar shfletuesin tuaj t’i çaktivizojë kryet 'Referer', ju " +"lutemi, riaktivizojini ato, të paktën për këtë sajt, ose për lidhjet HTTPS, " +"ose për kërkesat 'same-origin'." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Nëse përdorni etiketën ose " +"kryet e përfshira 'Referrer-Policy: no-referrer', ju lutemi, hiqini. " +"Mbrojtja CSRF lyp që kryet 'Referer' të kryejnë kontroll strikt referuesi. " +"Nëse shqetësoheni për privatësinë, përdorni alternativa si për lidhje te sajte palësh të treta." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Këtë mesazh po e shihni ngaqë ky sajt lyp një cookie CSRF, kur parashtrohen " +"formularë. Kjo cookie është e domosdoshme për arsye sigurie, për të bërë të " +"mundur që shfletuesi juaj të mos komprometohet nga palë të treta." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Nëse e keni formësuar shfletuesin tuaj të çaktivizojë cookie-t, ju lutemi, " +"riaktivizojini ato, të paktën për këtë sajt, ose për kërkesa 'same-origin'." + +msgid "More information is available with DEBUG=True." +msgstr "Më tepër të dhëna mund të gjeni me DEBUG=True." + +msgid "No year specified" +msgstr "Nuk është caktuar vit" + +msgid "Date out of range" +msgstr "Datë jashtë intervali" + +msgid "No month specified" +msgstr "Nuk është caktuar muaj" + +msgid "No day specified" +msgstr "Nuk është caktuar ditë" + +msgid "No week specified" +msgstr "Nuk është caktuar javë" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Nuk ka %(verbose_name_plural)s të përcaktuar" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s i ardhshëm jo i passhëm, ngaqë %(class_name)s." +"allow_future është False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" +"U dha varg i pavlefshëm date '%(datestr)s' formati i dhënë '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "S’u gjetën %(verbose_name)s me përputhje" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Faqja s’është 'last', as mund të shndërrohet në një int." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Faqe e pavlefshme (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Listë e zbrazët dhe '%(class_name)s.allow_empty' është False." + +msgid "Directory indexes are not allowed here." +msgstr "Këtu s’lejohen tregues drejtorish." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" s’ekziston" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Tregues i %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: platforma Web për perfeksionistë me afate." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Shihni shënimet për hedhjen në qarkullim të " +"Django %(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Instalimi funksionoi me sukses! Përgëzime!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Po e shihni këtë faqe ngaqë te kartela juaj e rregullimeve gjendet DEBUG=True dhe s’keni formësuar ndonjë URL." + +msgid "Django Documentation" +msgstr "Dokumentim i Django-s" + +msgid "Topics, references, & how-to's" +msgstr "Tema, referenca, & how-to" + +msgid "Tutorial: A Polling App" +msgstr "Përkujdesore: Një Aplikacion Për Sondazhe" + +msgid "Get started with Django" +msgstr "Si t’ia filloni me Django-n" + +msgid "Django Community" +msgstr "Bashkësia Django" + +msgid "Connect, get help, or contribute" +msgstr "Lidhuni, merrni ndihmë, ose jepni ndihmesë" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sq/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/sq/formats.py new file mode 100644 index 0000000..2f0da0d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/sq/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'd F Y' +TIME_FORMAT = 'g.i.A' +# DATETIME_FORMAT = +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'Y-m-d' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..81df886 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,1290 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +# Igor Jerosimić, 2019 +# Jannis Leidel , 2011 +# Janos Guljas , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-06-27 19:31+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Afrikaans" +msgstr "африкански" + +msgid "Arabic" +msgstr "арапски" + +msgid "Asturian" +msgstr "астуријски" + +msgid "Azerbaijani" +msgstr "азербејџански" + +msgid "Bulgarian" +msgstr "бугарски" + +msgid "Belarusian" +msgstr "белоруски" + +msgid "Bengali" +msgstr "бенгалски" + +msgid "Breton" +msgstr "бретонски" + +msgid "Bosnian" +msgstr "босански" + +msgid "Catalan" +msgstr "каталонски" + +msgid "Czech" +msgstr "чешки" + +msgid "Welsh" +msgstr "велшки" + +msgid "Danish" +msgstr "дански" + +msgid "German" +msgstr "немачки" + +msgid "Lower Sorbian" +msgstr "доњолужичкосрпски" + +msgid "Greek" +msgstr "грчки" + +msgid "English" +msgstr "енглески" + +msgid "Australian English" +msgstr "аустралијски енглески" + +msgid "British English" +msgstr "британски енглески" + +msgid "Esperanto" +msgstr "есперанто" + +msgid "Spanish" +msgstr "шпански" + +msgid "Argentinian Spanish" +msgstr "аргентински шпански" + +msgid "Colombian Spanish" +msgstr "колумбијски шпански" + +msgid "Mexican Spanish" +msgstr "мексички шпански" + +msgid "Nicaraguan Spanish" +msgstr "никарагвански шпански" + +msgid "Venezuelan Spanish" +msgstr "венецуелански шпански" + +msgid "Estonian" +msgstr "естонски" + +msgid "Basque" +msgstr "баскијски" + +msgid "Persian" +msgstr "персијски" + +msgid "Finnish" +msgstr "фински" + +msgid "French" +msgstr "француски" + +msgid "Frisian" +msgstr "фризијски" + +msgid "Irish" +msgstr "ирски" + +msgid "Scottish Gaelic" +msgstr "шкотски гелски" + +msgid "Galician" +msgstr "галицијски" + +msgid "Hebrew" +msgstr "хебрејски" + +msgid "Hindi" +msgstr "хинду" + +msgid "Croatian" +msgstr "хрватски" + +msgid "Upper Sorbian" +msgstr "горњолужичкосрпски" + +msgid "Hungarian" +msgstr "мађарски" + +msgid "Armenian" +msgstr "јерменски" + +msgid "Interlingua" +msgstr "интерлингва" + +msgid "Indonesian" +msgstr "индонежански" + +msgid "Ido" +msgstr "идо" + +msgid "Icelandic" +msgstr "исландски" + +msgid "Italian" +msgstr "италијански" + +msgid "Japanese" +msgstr "јапански" + +msgid "Georgian" +msgstr "грузијски" + +msgid "Kabyle" +msgstr "кабилски" + +msgid "Kazakh" +msgstr "казашки" + +msgid "Khmer" +msgstr "кмерски" + +msgid "Kannada" +msgstr "канада" + +msgid "Korean" +msgstr "корејски" + +msgid "Luxembourgish" +msgstr "луксембуршки" + +msgid "Lithuanian" +msgstr "литвански" + +msgid "Latvian" +msgstr "латвијски" + +msgid "Macedonian" +msgstr "македонски" + +msgid "Malayalam" +msgstr "малајаламски" + +msgid "Mongolian" +msgstr "монголски" + +msgid "Marathi" +msgstr "маратхи" + +msgid "Burmese" +msgstr "бурмански" + +msgid "Norwegian Bokmål" +msgstr "норвешки књижевни" + +msgid "Nepali" +msgstr "непалски" + +msgid "Dutch" +msgstr "холандски" + +msgid "Norwegian Nynorsk" +msgstr "норвешки нови" + +msgid "Ossetic" +msgstr "осетински" + +msgid "Punjabi" +msgstr "панџаби" + +msgid "Polish" +msgstr "пољски" + +msgid "Portuguese" +msgstr "португалски" + +msgid "Brazilian Portuguese" +msgstr "бразилски португалски" + +msgid "Romanian" +msgstr "румунски" + +msgid "Russian" +msgstr "руски" + +msgid "Slovak" +msgstr "словачки" + +msgid "Slovenian" +msgstr "словеначки" + +msgid "Albanian" +msgstr "албански" + +msgid "Serbian" +msgstr "српски" + +msgid "Serbian Latin" +msgstr "српски (латиница)" + +msgid "Swedish" +msgstr "шведски" + +msgid "Swahili" +msgstr "свахили" + +msgid "Tamil" +msgstr "тамилски" + +msgid "Telugu" +msgstr "телугу" + +msgid "Thai" +msgstr "тајландски" + +msgid "Turkish" +msgstr "турски" + +msgid "Tatar" +msgstr "татарски" + +msgid "Udmurt" +msgstr "удмуртски" + +msgid "Ukrainian" +msgstr "украјински" + +msgid "Urdu" +msgstr "урду" + +msgid "Vietnamese" +msgstr "вијетнамски" + +msgid "Simplified Chinese" +msgstr "поједностављени кинески" + +msgid "Traditional Chinese" +msgstr "традиционални кинески" + +msgid "Messages" +msgstr "Poruke" + +msgid "Site Maps" +msgstr "Мапе сајта" + +msgid "Static Files" +msgstr "Статички фајлови" + +msgid "Syndication" +msgstr "Удруживање садржаја" + +msgid "That page number is not an integer" +msgstr "Задати број стране није цео број" + +msgid "That page number is less than 1" +msgstr "Задати број стране је мањи од 1" + +msgid "That page contains no results" +msgstr "Тражена страна не садржи резултате" + +msgid "Enter a valid value." +msgstr "Унесите исправну вредност." + +msgid "Enter a valid URL." +msgstr "Унесите исправан URL." + +msgid "Enter a valid integer." +msgstr "Унесите исправан цео број." + +msgid "Enter a valid email address." +msgstr "Унесите исправну и-мејл адресу." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Унесите исправан 'слаг', који се састоји од слова, бројки, доњих црта или " +"цртица." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Унесите исправан 'слаг', који се састоји од Уникод слова, бројки, доњих црта " +"или цртица." + +msgid "Enter a valid IPv4 address." +msgstr "Унесите исправну IPv4 адресу." + +msgid "Enter a valid IPv6 address." +msgstr "Унесите исправну IPv6 адресу." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Унесите исправну IPv4 или IPv6 адресу." + +msgid "Enter only digits separated by commas." +msgstr "Унесите само цифре раздвојене запетама." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Ово поље мора да буде %(limit_value)s (тренутно има %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Ова вредност мора да буде мања од %(limit_value)s. или тачно толико." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Ово поље мора да има најмање %(limit_value)d карактер (тренутно има " +"%(show_value)d)." +msgstr[1] "" +"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " +"%(show_value)d)." +msgstr[2] "" +"Ово поље мора да има најмање %(limit_value)d карактера (тренутно има " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " +"%(show_value)d)." +msgstr[1] "" +"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " +"%(show_value)d)." +msgstr[2] "" +"Ово поље не сме да има више од %(limit_value)d карактера (тренутно има " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Унесите број." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Укупно не може бити више од %(max)s цифре." +msgstr[1] "Укупно не може бити више од %(max)s цифре." +msgstr[2] "Укупно не може бити више од %(max)s цифара." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Не може бити више од %(max)s децимале." +msgstr[1] "Не може бити више од %(max)s децимале." +msgstr[2] "Не може бити више од %(max)s децимала." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Не може бити више од %(max)s цифре пре децималног зареза." +msgstr[1] "Не може бити више од %(max)s цифре пре децималног зареза." +msgstr[2] "Не може бити више од %(max)s цифара пре децималног зареза." + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" +"Фајл екстензија '%(extension)s' није дозвољена. Дозвољене су следеће " +"екстензије: '%(allowed_extensions)s'." + +msgid "Null characters are not allowed." +msgstr "'Null' карактери нису дозвољени." + +msgid "and" +msgstr "и" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s са пољем %(field_labels)s већ постоји." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Вредност %(value)r није валидна." + +msgid "This field cannot be null." +msgstr "Ово поље не може бити 'null'." + +msgid "This field cannot be blank." +msgstr "Ово поље не може да остане празно." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s са пољем %(field_label)s већ постоји." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s мора бити јединствен(a) за %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Поље типа: %(field_type)s" + +msgid "Integer" +msgstr "Цео број" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Вредност '%(value)s' мора бити цео број." + +msgid "Big (8 byte) integer" +msgstr "Велики (8 бајтова) цео број" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Вредност '%(value)s' мора бити или True или False." + +#, python-format +msgid "'%(value)s' value must be either True, False, or None." +msgstr "'%(value)s' вредност мора бити или True, False, или None." + +msgid "Boolean (Either True or False)" +msgstr "Булова вредност (True или False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Стринг са макс. дужином %(max_length)s" + +msgid "Comma-separated integers" +msgstr "Цели бројеви раздвојени запетама" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Вредност '%(value)s' нема валидан формат датума. Мора бити у формату ГГГГ-ММ-" +"ДД ." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Вредност '%(value)s' има исправан формат (ГГГГ-ММ-ДД) али то није валидан " +"датум." + +msgid "Date (without time)" +msgstr "Датум (без времена)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Вредност '%(value)s' нема валидан формат. Мора бити у формату ГГГГ-ММ-ДД ЧЧ:" +"ММ[:сс[.uuuuuu]][TZ] ." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Вредност '%(value)s' има исправан формат (ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]]" +"[TZ]) али то није валидан датум/време." + +msgid "Date (with time)" +msgstr "Датум (са временом)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Вредност '%(value)s' мора бити децимални број." + +msgid "Decimal number" +msgstr "Децимални број" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" +"'%(value)s' нема валидан формат. Мора бити у формату [ДД] [ЧЧ:[ММ:]]ss[." +"uuuuuu] ." + +msgid "Duration" +msgstr "Временски интервал" + +msgid "Email address" +msgstr "Имејл адреса" + +msgid "File path" +msgstr "Путања фајла" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "Вредност '%(value)s' мора бити 'float'." + +msgid "Floating point number" +msgstr "Број са покретним зарезом" + +msgid "IPv4 address" +msgstr "IPv4 адреса" + +msgid "IP address" +msgstr "IP адреса" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "Вредност '%(value)s' мора бити None, True или False." + +msgid "Boolean (Either True, False or None)" +msgstr "Булова вредност (True, False или None)" + +msgid "Positive integer" +msgstr "Позитиван цео број" + +msgid "Positive small integer" +msgstr "Позитиван мали цео број" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Слаг са макс. дужином %(max_length)s" + +msgid "Small integer" +msgstr "Мали цео број" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Вредност '%(value)s' нема валидан формат. Мора бити у формату ЧЧ:ММ[:сс[." +"uuuuuu]] ." + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Вредност '%(value)s' има исправан формат (ЧЧ:ММ[:сс[.uuuuuu]]) али то није " +"валидно време." + +msgid "Time" +msgstr "Време" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Сирови бинарни подаци" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "'%(value)s' није валидан UUID." + +msgid "Universally unique identifier" +msgstr "Универзално јединствени идентификатор" + +msgid "File" +msgstr "Фајл" + +msgid "Image" +msgstr "Слика" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s инстанца са вредношћу %(value)r у пољу %(field)s не постоји." + +msgid "Foreign Key (type determined by related field)" +msgstr "Спољни кључ (тип је одређен асоцираном колоном)" + +msgid "One-to-one relationship" +msgstr "Релација један на један" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Релација %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Релације %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Релација више на више" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Ово поље се мора попунити." + +msgid "Enter a whole number." +msgstr "Унесите цео број." + +msgid "Enter a valid date." +msgstr "Унесите исправан датум." + +msgid "Enter a valid time." +msgstr "Унесите исправно време" + +msgid "Enter a valid date/time." +msgstr "Унесите исправан датум/време." + +msgid "Enter a valid duration." +msgstr "Унесите исправан временски интервал." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Број дана мора бити између {min_days} и {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Фајл није пребачен. Проверите тип енкодирања на форми." + +msgid "No file was submitted." +msgstr "Фајл није пребачен." + +msgid "The submitted file is empty." +msgstr "Пребачени фајл је празан." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." +msgstr[1] "" +"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." +msgstr[2] "" +"Име фајла не може имати више од %(max)d карактера (тренутно има %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Може се само послати фајл или избрисати, не оба." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Пребаците исправан фајл. Фајл који је пребачен или није слика, или је " +"оштећен." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"%(value)s није међу понуђеним вредностима. Одаберите једну од понуђених." + +msgid "Enter a list of values." +msgstr "Унесите листу вредности." + +msgid "Enter a complete value." +msgstr "Унесите комплетну вредност." + +msgid "Enter a valid UUID." +msgstr "Унесите исправан UUID." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Скривено поље %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "ManagementForm недостаје или је измењена на погрешан начин." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Попуните и проследите највише %d форму." +msgstr[1] "Попуните и проследите највише %d форме." +msgstr[2] "Попуните и проследите највише %d форми." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Попуните и проследите најмање %d форму." +msgstr[1] "Попуните и проследите највише %d форме." +msgstr[2] "Попуните и проследите највише %d форми." + +msgid "Order" +msgstr "Редослед" + +msgid "Delete" +msgstr "Обриши" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Исправите вредност за поље %(field)s - оно мора бити јединствено." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Исправите вредности за поља %(field)s - њихова комбинација мора бити " +"јединствена." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Иправите вредност за поље %(field_name)s, оно мора бити јединствено за " +"%(lookup)s у %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Исправите дуплиране вредности доле." + +msgid "The inline value did not match the parent instance." +msgstr "Директно унета вредност не одговара инстанци родитеља." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Одабрана вредност није међу понуђенима. Одаберите једну од понуђених." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "\"%(pk)s\" није валидна вредност." + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s се не може се представити у временској зони " +"%(current_timezone)s - или је двосмислено или можда не постоји." + +msgid "Clear" +msgstr "Очисти" + +msgid "Currently" +msgstr "Тренутно" + +msgid "Change" +msgstr "Измени" + +msgid "Unknown" +msgstr "Непознато" + +msgid "Yes" +msgstr "Да" + +msgid "No" +msgstr "Не" + +msgid "yes,no,maybe" +msgstr "да,не,можда" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d бајт" +msgstr[1] "%(size)d бајта" +msgstr[2] "%(size)d бајтова" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "по п." + +msgid "a.m." +msgstr "пре п." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "поноћ" + +msgid "noon" +msgstr "подне" + +msgid "Monday" +msgstr "понедељак" + +msgid "Tuesday" +msgstr "уторак" + +msgid "Wednesday" +msgstr "среда" + +msgid "Thursday" +msgstr "четвртак" + +msgid "Friday" +msgstr "петак" + +msgid "Saturday" +msgstr "субота" + +msgid "Sunday" +msgstr "недеља" + +msgid "Mon" +msgstr "пон." + +msgid "Tue" +msgstr "уто." + +msgid "Wed" +msgstr "сре." + +msgid "Thu" +msgstr "чет." + +msgid "Fri" +msgstr "пет." + +msgid "Sat" +msgstr "суб." + +msgid "Sun" +msgstr "нед." + +msgid "January" +msgstr "јануар" + +msgid "February" +msgstr "фебруар" + +msgid "March" +msgstr "март" + +msgid "April" +msgstr "април" + +msgid "May" +msgstr "мај" + +msgid "June" +msgstr "јун" + +msgid "July" +msgstr "јул" + +msgid "August" +msgstr "август" + +msgid "September" +msgstr "септембар" + +msgid "October" +msgstr "октобар" + +msgid "November" +msgstr "новембар" + +msgid "December" +msgstr "децембар" + +msgid "jan" +msgstr "јан." + +msgid "feb" +msgstr "феб." + +msgid "mar" +msgstr "мар." + +msgid "apr" +msgstr "апр." + +msgid "may" +msgstr "мај." + +msgid "jun" +msgstr "јун." + +msgid "jul" +msgstr "јул." + +msgid "aug" +msgstr "ауг." + +msgid "sep" +msgstr "сеп." + +msgid "oct" +msgstr "окт." + +msgid "nov" +msgstr "нов." + +msgid "dec" +msgstr "дец." + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Јан." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Феб." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Март" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Април" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Мај" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Јун" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Јул" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Септ." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Нов." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дец." + +msgctxt "alt. month" +msgid "January" +msgstr "Јануар" + +msgctxt "alt. month" +msgid "February" +msgstr "Фебруар" + +msgctxt "alt. month" +msgid "March" +msgstr "Март" + +msgctxt "alt. month" +msgid "April" +msgstr "Април" + +msgctxt "alt. month" +msgid "May" +msgstr "Мај" + +msgctxt "alt. month" +msgid "June" +msgstr "Јун" + +msgctxt "alt. month" +msgid "July" +msgstr "Јул" + +msgctxt "alt. month" +msgid "August" +msgstr "Август" + +msgctxt "alt. month" +msgid "September" +msgstr "Септембар" + +msgctxt "alt. month" +msgid "October" +msgstr "Октобар" + +msgctxt "alt. month" +msgid "November" +msgstr "Новембар" + +msgctxt "alt. month" +msgid "December" +msgstr "Децембар" + +msgid "This is not a valid IPv6 address." +msgstr "Ово није валидна IPv6 адреса." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "или" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d година" +msgstr[1] "%d године" +msgstr[2] "%d година" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d месец" +msgstr[1] "%d месеца" +msgstr[2] "%d месеци" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d недеља" +msgstr[1] "%d недеље" +msgstr[2] "%d недеља" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d дан" +msgstr[1] "%d дана" +msgstr[2] "%d дана" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d час" +msgstr[1] "%d часа" +msgstr[2] "%d часова" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минута" +msgstr[2] "%d минута" + +msgid "0 minutes" +msgstr "0 минута" + +msgid "Forbidden" +msgstr "Забрањено" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF верификација није прошла. Захтев одбијен." + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Ова порука је приказана јер овај HTTPS сајт захтева да 'Referer header' буде " +"послат од стране вашег интернет претраживача, што тренутно није случај. " +"Поменуто заглавље је потребно ради безбедоносних разлога, да би се осигурало " +"да ваш претраживач није под контролом трећих лица." + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" +"Ако сте конфигурисали интернет претраживач са искљученим 'Referer' " +"заглављима, поново их укључите, барем за овај сајт, или за HTTPS конекције, " +"или за 'same-origin' захтеве." + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Ако користите таг или " +"'Referrer-Policy: no-referrer' заглавље, молимо да их уклоните. CSRF заштита " +"захтева 'Referer' заглавље да би се обавила стриктна 'referrer' провера. " +"Уколико вас брине приватност, користите алтерантиве као за линкове ка другим сајтовима." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Ова порука је приказана јер овај сајт захтева CSRF куки када се прослеђују " +"подаци из форми. Овај куки је потребан из сигурносних разлога, да би се " +"осигурало да ваш претраживач није под контролом трећих лица." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" +"Ако је ваш претраживач конфигурисан са искљученим кукијима, молимо да их " +"укључите, барем за овај сајт, или за 'same-origin' захтеве." + +msgid "More information is available with DEBUG=True." +msgstr "Више информација је доступно са DEBUG=True." + +msgid "No year specified" +msgstr "Година није назначена" + +msgid "Date out of range" +msgstr "Датум ван опсега" + +msgid "No month specified" +msgstr "Месец није назначен" + +msgid "No day specified" +msgstr "Дан није назначен" + +msgid "No week specified" +msgstr "Недеља није назначена" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Недоступни објекти %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Опција „future“ није доступна за „%(verbose_name_plural)s“ јер " +"%(class_name)s.allow_future има вредност False." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Неисправан датум „%(datestr)s“ дат формату „%(format)s“" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Ниједан објекат класе %(verbose_name)s није нађен датим упитом." + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Страница није последња, нити може бити конвертована у тип 'int'." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Неисправна страна (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Празна листа и „%(class_name)s.allow_empty“ има вредност False." + +msgid "Directory indexes are not allowed here." +msgstr "Индекси директоријума нису дозвољени овде." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "„%(path)s“ не постоји" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Индекс директоријума %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Ђанго: веб окружење за перфекционисте са строгим роковима." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Погледајте напомене уз издање за Ђанго " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Инсталација је прошла успешно. Честитке!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Ова страна је приказана јер је DEBUG=True у вашим подешавањима и нисте конфигурисали ниједан URL." + +msgid "Django Documentation" +msgstr "Ђанго документација" + +msgid "Topics, references, & how-to's" +msgstr "Теме, референце, & како-да" + +msgid "Tutorial: A Polling App" +msgstr "Упутство: апликација за гласање" + +msgid "Get started with Django" +msgstr "Почните са Ђангом" + +msgid "Django Community" +msgstr "Ђанго заједница" + +msgid "Connect, get help, or contribute" +msgstr "Повежите се, потражите помоћ или дајте допринос" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sr/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/sr/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sv/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/sv/formats.py new file mode 100644 index 0000000..4dd2f63 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/sv/formats.py @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'j F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'Y-m-d' +SHORT_DATETIME_FORMAT = 'Y-m-d H:i' +FIRST_DAY_OF_WEEK = 1 + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# Kept ISO formats as they are in first position +DATE_INPUT_FORMATS = [ + '%Y-%m-%d', # '2006-10-25' + '%m/%d/%Y', # '10/25/2006' + '%m/%d/%y', # '10/25/06' +] +DATETIME_INPUT_FORMATS = [ + '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' + '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' + '%Y-%m-%d %H:%M', # '2006-10-25 14:30' + '%Y-%m-%d', # '2006-10-25' + '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' + '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' + '%m/%d/%Y %H:%M', # '10/25/2006 14:30' + '%m/%d/%Y', # '10/25/2006' + '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' + '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' + '%m/%d/%y %H:%M', # '10/25/06 14:30' + '%m/%d/%y', # '10/25/06' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '\xa0' # non-breaking space +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..23802e6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,1194 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Machaku , 2015 +# Machaku , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Kiafrikaani" + +msgid "Arabic" +msgstr "Kiarabu" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Kiazerbaijani" + +msgid "Bulgarian" +msgstr "Kibulgaria" + +msgid "Belarusian" +msgstr "Kibelarusi" + +msgid "Bengali" +msgstr "Kibengali" + +msgid "Breton" +msgstr "Kibretoni" + +msgid "Bosnian" +msgstr "Kibosnia" + +msgid "Catalan" +msgstr "Kikatalani" + +msgid "Czech" +msgstr "Kicheki" + +msgid "Welsh" +msgstr "Kiweli" + +msgid "Danish" +msgstr "Kideni" + +msgid "German" +msgstr "Kijerumani" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Kigiriki" + +msgid "English" +msgstr "Kiingereza" + +msgid "Australian English" +msgstr "Kiingereza cha Kiaustalia" + +msgid "British English" +msgstr "Kiingereza cha Uingereza" + +msgid "Esperanto" +msgstr "Kiesperanto" + +msgid "Spanish" +msgstr "Kihispania" + +msgid "Argentinian Spanish" +msgstr "Kihispania cha Argentina" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Kihispania cha Mexico" + +msgid "Nicaraguan Spanish" +msgstr "Kihispania cha Nikaragua" + +msgid "Venezuelan Spanish" +msgstr "Kihispania cha Kivenezuela" + +msgid "Estonian" +msgstr "Kiestonia" + +msgid "Basque" +msgstr "Kibaskyue" + +msgid "Persian" +msgstr "Kipershia" + +msgid "Finnish" +msgstr "Kifini" + +msgid "French" +msgstr "Kifaransa" + +msgid "Frisian" +msgstr "Kifrisi" + +msgid "Irish" +msgstr "Kiairishi" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Kigalatia" + +msgid "Hebrew" +msgstr "Kiyahudi" + +msgid "Hindi" +msgstr "Kihindi" + +msgid "Croatian" +msgstr "Kikroeshia" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Kihangaria" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Kiindonesia" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Kiaiselandi" + +msgid "Italian" +msgstr "Kiitaliano" + +msgid "Japanese" +msgstr "Kijapani" + +msgid "Georgian" +msgstr "Kijiojia" + +msgid "Kazakh" +msgstr "Kizakhi" + +msgid "Khmer" +msgstr "Kihema" + +msgid "Kannada" +msgstr "Kikanada" + +msgid "Korean" +msgstr "Kikorea" + +msgid "Luxembourgish" +msgstr "" + +msgid "Lithuanian" +msgstr "Kilithuania" + +msgid "Latvian" +msgstr "Kilatvia" + +msgid "Macedonian" +msgstr "Kimacedonia" + +msgid "Malayalam" +msgstr "Kimalayalam" + +msgid "Mongolian" +msgstr "Kimongolia" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "Kinepali" + +msgid "Dutch" +msgstr "Kidachi" + +msgid "Norwegian Nynorsk" +msgstr "Kinynorki cha Kinorwei" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Kipanjabi" + +msgid "Polish" +msgstr "Kipolishi" + +msgid "Portuguese" +msgstr "Kireno" + +msgid "Brazilian Portuguese" +msgstr "Kireno cha Kibrazili" + +msgid "Romanian" +msgstr "Kiromania" + +msgid "Russian" +msgstr "Kirusi" + +msgid "Slovak" +msgstr "Kislovakia" + +msgid "Slovenian" +msgstr "Kislovenia" + +msgid "Albanian" +msgstr "Kialbania" + +msgid "Serbian" +msgstr "Kiserbia" + +msgid "Serbian Latin" +msgstr "Kilatini cha Kiserbia" + +msgid "Swedish" +msgstr "Kiswidi" + +msgid "Swahili" +msgstr "Kiswahili" + +msgid "Tamil" +msgstr "Kitamili" + +msgid "Telugu" +msgstr "kitegulu" + +msgid "Thai" +msgstr "Kithai" + +msgid "Turkish" +msgstr "Kituruki" + +msgid "Tatar" +msgstr "Kitatari" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "Kiukreni" + +msgid "Urdu" +msgstr "Kiurdu" + +msgid "Vietnamese" +msgstr "Kivietinamu" + +msgid "Simplified Chinese" +msgstr "Kichina Kilichorahisishwa" + +msgid "Traditional Chinese" +msgstr "Kichina Asilia" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Ingiza thamani halali" + +msgid "Enter a valid URL." +msgstr "Ingiza URL halali." + +msgid "Enter a valid integer." +msgstr "Ingiza namba halali" + +msgid "Enter a valid email address." +msgstr "Ingiza anuani halali ya barua pepe" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "Ingiza slagi halali yenye herufi, namba, \"_\" au \"-\"" + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Ingiza anuani halali ya IPV4" + +msgid "Enter a valid IPv6 address." +msgstr "Ingiza anuani halali ya IPV6" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Ingiza anuani halali za IPV4 au IPV6" + +msgid "Enter only digits separated by commas." +msgstr "Ingiza tarakimu zilizotenganishwa kwa koma tu." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Hakikisha thamani hii ni %(limit_value)s (ni %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Hakikisha thamani hii ni ndogo kuliko au sawa na %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Hakikisha thamani hii ni kubwa kuliko au sawa na %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "na" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Uga huu hauwezi kuwa hauna kitu." + +msgid "This field cannot be blank." +msgstr "Uga huu hauwezi kuwa mtupu" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Tayari kuna %(field_label)s kwa %(model_name)s nyingine." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Uga wa aina %(field_type)s" + +msgid "Integer" +msgstr "Inteja" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "Thamani ya '%(value)s ni lazima iwe inteja." + +msgid "Big (8 byte) integer" +msgstr "Inteja kubwa (baiti 8)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "Thamani ya '%(value)s' ni lazma iwe Kweli au Si kweli" + +msgid "Boolean (Either True or False)" +msgstr "Buleani (Aidha Kweli au Si kweli)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Tungo (hadi %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Inteja zilizotengwa kwa koma" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Tarehe (bila ya muda)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Tarehe (pamoja na muda)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "Thamani ya '%(value)s' ni lazima iwe namba ya desimali." + +msgid "Decimal number" +msgstr "Namba ya desimali" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Anuani ya baruapepe" + +msgid "File path" +msgstr "Njia ya faili" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Namba ya `floating point`" + +msgid "IPv4 address" +msgstr "anuani ya IPV4" + +msgid "IP address" +msgstr "anuani ya IP" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Buleani (Aidha kweli, Si kweli au Hukuna)" + +msgid "Positive integer" +msgstr "Inteja chanya" + +msgid "Positive small integer" +msgstr "Inteja chanya ndogo" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slagi (hadi %(max_length)s)" + +msgid "Small integer" +msgstr "Inteja ndogo" + +msgid "Text" +msgstr "Maandishi" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Muda" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Faili" + +msgid "Image" +msgstr "Picha" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "'Foreign Key' (aina inapatikana kwa uga unaohusiana)" + +msgid "One-to-one relationship" +msgstr "Uhusiano wa moja-kwa-moja" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Uhusiano wa vingi-kwa-vingi" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Sehemu hii inahitajika" + +msgid "Enter a whole number." +msgstr "Ingiza namba kamili" + +msgid "Enter a number." +msgstr "Ingiza namba" + +msgid "Enter a valid date." +msgstr "Ingiza tarehe halali" + +msgid "Enter a valid time." +msgstr "Ingiza muda halali" + +msgid "Enter a valid date/time." +msgstr "Ingiza tarehe/muda halali" + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Hakuna faili lililokusanywa. Angalia aina ya msimbo kwenye fomu." + +msgid "No file was submitted." +msgstr "Hakuna faili lililokusanywa." + +msgid "The submitted file is empty." +msgstr "Faili lililokusanywa ni tupu." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Tafadhali aidha kusanya faili au tiki kisanduku kilicho wazi, si yote." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Pakia picha halali. Faili ulilopakia lilikua aidha si picha au ni picha " +"iliyopotoshwa." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Chagua chaguo halali. %(value)s si moja kati ya machaguo yaliyopo." + +msgid "Enter a list of values." +msgstr "Ingiza orodha ya thamani" + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Panga" + +msgid "Delete" +msgstr "Futa" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Tafadhali rekebisha data zilizojirudia kwa %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Tafadhali rekebisha data zilizojirudia kwa %(field)s, zinazotakiwa kuwa za " +"kipekee." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Tafadhali sahihisha data zilizojirudia kwa %(field_name)s ,uga huu ni lazima " +"kuwa wa pekee kwa %(lookup)s katika %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Tafadhali sahihisha thamani zilizojirudia hapo chini." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Chagua chaguo halali. Chaguo hilo si moja kati ya chaguzi halali" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"Imeshindikana kufasiri %(datetime)s katika majira ya %(current_timezone)s;" +"Inawezekana kuwa kuna utata au kiti hichi hakipo." + +msgid "Clear" +msgstr "Safisha" + +msgid "Currently" +msgstr "Kwa sasa" + +msgid "Change" +msgstr "Badili" + +msgid "Unknown" +msgstr "Haijulikani" + +msgid "Yes" +msgstr "Ndiyo" + +msgid "No" +msgstr "Hapana" + +msgid "yes,no,maybe" +msgstr "ndiyo,hapana,labda" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "baiti %(size)d" +msgstr[1] "baiti %(size)d" + +#, python-format +msgid "%s KB" +msgstr "KB %s" + +#, python-format +msgid "%s MB" +msgstr "MB %s" + +#, python-format +msgid "%s GB" +msgstr "GB %s" + +#, python-format +msgid "%s TB" +msgstr "TB %s" + +#, python-format +msgid "%s PB" +msgstr "PB %s" + +msgid "p.m." +msgstr "p.m" + +msgid "a.m." +msgstr "a.m" + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "usiku wa manane" + +msgid "noon" +msgstr "mchana" + +msgid "Monday" +msgstr "Jumatatu" + +msgid "Tuesday" +msgstr "Jumanne" + +msgid "Wednesday" +msgstr "Jumatano" + +msgid "Thursday" +msgstr "Alhamisi" + +msgid "Friday" +msgstr "Ijumaa" + +msgid "Saturday" +msgstr "Jumamosi" + +msgid "Sunday" +msgstr "Jumapili" + +msgid "Mon" +msgstr "Jtatu" + +msgid "Tue" +msgstr "Jnne" + +msgid "Wed" +msgstr "jtano" + +msgid "Thu" +msgstr "Alh" + +msgid "Fri" +msgstr "Ijmaa" + +msgid "Sat" +msgstr "Jmosi" + +msgid "Sun" +msgstr "Jpili" + +msgid "January" +msgstr "Januari" + +msgid "February" +msgstr "Februari" + +msgid "March" +msgstr "Machi" + +msgid "April" +msgstr "Aprili" + +msgid "May" +msgstr "Mei" + +msgid "June" +msgstr "Juni" + +msgid "July" +msgstr "Julai" + +msgid "August" +msgstr "Agosti" + +msgid "September" +msgstr "Septemba" + +msgid "October" +msgstr "Oktoba" + +msgid "November" +msgstr "Novemba" + +msgid "December" +msgstr "Disemba" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "machi" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "mei" + +msgid "jun" +msgstr "Juni" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ago" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dis" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Machi" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Aprili" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mei" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Juni" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julai" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ago." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sep." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dis." + +msgctxt "alt. month" +msgid "January" +msgstr "Januari" + +msgctxt "alt. month" +msgid "February" +msgstr "Februari" + +msgctxt "alt. month" +msgid "March" +msgstr "Machi" + +msgctxt "alt. month" +msgid "April" +msgstr "Aprili" + +msgctxt "alt. month" +msgid "May" +msgstr "Mei" + +msgctxt "alt. month" +msgid "June" +msgstr "Juni" + +msgctxt "alt. month" +msgid "July" +msgstr "Julai" + +msgctxt "alt. month" +msgid "August" +msgstr "Agosti" + +msgctxt "alt. month" +msgid "September" +msgstr "Septemba" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktoba" + +msgctxt "alt. month" +msgid "November" +msgstr "Novemba" + +msgctxt "alt. month" +msgid "December" +msgstr "Disemba" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "au" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "mwaka %d" +msgstr[1] "miaka %d" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "mwezi %d" +msgstr[1] "miezi %d" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "wiki %d" +msgstr[1] "wiki %d" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "siku %d" +msgstr[1] "siku %d" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "saa %d" +msgstr[1] "saa %d" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "dakika %d" +msgstr[1] "dakika %d" + +msgid "0 minutes" +msgstr "dakika 0" + +msgid "Forbidden" +msgstr "Marufuku" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "Maelezo zaidi yanapatikana ikiwa DEBUG=True" + +msgid "No year specified" +msgstr "Hakuna mwaka maalum uliotajwa" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Hakuna mwezi maalum uliotajwa" + +msgid "No day specified" +msgstr "Hakuna siku maalum iliyitajwa" + +msgid "No week specified" +msgstr "Hakuna wiki maalum iliyotajwa" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Hakujapatikana %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s kutoka wakati ujao haiwezekani kwani `" +"%(class_name)s.allow_future` ni `False`." + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Tungo batili ya tarehe '%(datestr)s' muundo ni '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "hakuna %(verbose_name)s kulingana na ulizo" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Ukurasa huu si 'mwisho', na wala hauwezi kubadilishwa kuwa int." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Ukurasa batili (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Orodha tupu na '%(class_name)s.allow_empty'.ni 'False'." + +msgid "Directory indexes are not allowed here." +msgstr "Sahirisi za saraka haziruhusiwi hapa." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" haipo" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Sahirisi ya %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/ta/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/ta/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/te/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/te/formats.py new file mode 100644 index 0000000..8fb98cf --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/te/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F Y' +TIME_FORMAT = 'g:i A' +# DATETIME_FORMAT = +# YEAR_MONTH_FORMAT = +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'j M Y' +# SHORT_DATETIME_FORMAT = +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +# DECIMAL_SEPARATOR = +# THOUSAND_SEPARATOR = +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/th/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/th/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/th/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/th/formats.py new file mode 100644 index 0000000..d7394eb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/th/formats.py @@ -0,0 +1,33 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'j F Y' +TIME_FORMAT = 'G:i' +DATETIME_FORMAT = 'j F Y, G:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'j M Y' +SHORT_DATETIME_FORMAT = 'j M Y, G:i' +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', # 25/10/2006 + '%d %b %Y', # 25 ต.ค. 2006 + '%d %B %Y', # 25 ตุลาคม 2006 +] +TIME_INPUT_FORMATS = [ + '%H:%M:%S', # 14:30:59 + '%H:%M:%S.%f', # 14:30:59.000200 + '%H:%M', # 14:30 +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', # 25/10/2006 14:30:59 + '%d/%m/%Y %H:%M:%S.%f', # 25/10/2006 14:30:59.000200 + '%d/%m/%Y %H:%M', # 25/10/2006 14:30 +] +DECIMAL_SEPARATOR = '.' +THOUSAND_SEPARATOR = ',' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/tr/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/tr/formats.py new file mode 100644 index 0000000..23012db --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/tr/formats.py @@ -0,0 +1,29 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'd F Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = 'd F Y H:i' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'd F' +SHORT_DATE_FORMAT = 'd M Y' +SHORT_DATETIME_FORMAT = 'd M Y H:i' +FIRST_DAY_OF_WEEK = 1 # Pazartesi + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' + '%y-%m-%d', # '06-10-25' + # '%d %B %Y', '%d %b. %Y', # '25 Ekim 2006', '25 Eki. 2006' +] +DATETIME_INPUT_FORMATS = [ + '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' + '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' + '%d/%m/%Y %H:%M', # '25/10/2006 14:30' + '%d/%m/%Y', # '25/10/2006' +] +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +NUMBER_GROUPING = 3 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..fe28eee --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,1184 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Azat Khasanshin , 2011 +# v_ildar , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "Гарәп теле" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Азәрбайҗан" + +msgid "Bulgarian" +msgstr "Болгар теле" + +msgid "Belarusian" +msgstr "" + +msgid "Bengali" +msgstr "Бенгалия теле" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "Босния теле" + +msgid "Catalan" +msgstr "Каталан теле" + +msgid "Czech" +msgstr "Чех теле" + +msgid "Welsh" +msgstr "Уэльс теле" + +msgid "Danish" +msgstr "Дания теле" + +msgid "German" +msgstr "Алман теле" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Грек теле" + +msgid "English" +msgstr "Инглиз теле" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Британ инглиз теле" + +msgid "Esperanto" +msgstr "Эсперанто теле" + +msgid "Spanish" +msgstr "Испан теле" + +msgid "Argentinian Spanish" +msgstr "Аргентина испан теле" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Мексикалы испан" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуалы испан" + +msgid "Venezuelan Spanish" +msgstr "" + +msgid "Estonian" +msgstr "Эстон теле" + +msgid "Basque" +msgstr "Баск теле" + +msgid "Persian" +msgstr "Фарсы теле" + +msgid "Finnish" +msgstr "Финн теле" + +msgid "French" +msgstr "Француз теле" + +msgid "Frisian" +msgstr "Фриз теле" + +msgid "Irish" +msgstr "Ирланд теле" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Галлий теле" + +msgid "Hebrew" +msgstr "Яһүд теле" + +msgid "Hindi" +msgstr "Хинд теле" + +msgid "Croatian" +msgstr "Хорват теле" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Венгр теле" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Индонезия теле" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Исланд теле" + +msgid "Italian" +msgstr "Итальян теле" + +msgid "Japanese" +msgstr "Япон теле" + +msgid "Georgian" +msgstr "Грузин теле" + +msgid "Kazakh" +msgstr "Казах теле" + +msgid "Khmer" +msgstr "Кхмер теле" + +msgid "Kannada" +msgstr "Каннада теле" + +msgid "Korean" +msgstr "Корея теле" + +msgid "Luxembourgish" +msgstr "Люксембург теле" + +msgid "Lithuanian" +msgstr "Литвалылар теле" + +msgid "Latvian" +msgstr "Латвия теле" + +msgid "Macedonian" +msgstr "Македон теле" + +msgid "Malayalam" +msgstr "Малаялам теле" + +msgid "Mongolian" +msgstr "Монгол теле" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Dutch" +msgstr "Голланд теле" + +msgid "Norwegian Nynorsk" +msgstr "Норвегиялеләр (Нюнорск) теле" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Паджаби теле" + +msgid "Polish" +msgstr "Поляк теле" + +msgid "Portuguese" +msgstr "Португал теле" + +msgid "Brazilian Portuguese" +msgstr "Бразилия португал теле" + +msgid "Romanian" +msgstr "Румын теле" + +msgid "Russian" +msgstr "Рус теле" + +msgid "Slovak" +msgstr "Словак теле" + +msgid "Slovenian" +msgstr "Словен теле" + +msgid "Albanian" +msgstr "Албан теле" + +msgid "Serbian" +msgstr "Серб теле" + +msgid "Serbian Latin" +msgstr "Серб теле (латин алфавиты)" + +msgid "Swedish" +msgstr "Швед теле" + +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "Тамиль теле" + +msgid "Telugu" +msgstr "Телугу теле" + +msgid "Thai" +msgstr "Тай теле" + +msgid "Turkish" +msgstr "Төрек теле" + +msgid "Tatar" +msgstr "Татар теле" + +msgid "Udmurt" +msgstr "" + +msgid "Ukrainian" +msgstr "Украин теле" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнам теле" + +msgid "Simplified Chinese" +msgstr "Гадиләштерелгән кытай теле" + +msgid "Traditional Chinese" +msgstr "Традицион кытай теле" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Дөрес кыйммәтне кертегез." + +msgid "Enter a valid URL." +msgstr "Рөхсәт ителгән URLны кертегез." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Дөрес эл. почта адресны кертегез." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Кыйммәт хәрефләрдән, сан билгеләреннән, астына сызу билгесеннән яки дефистан " +"торырга тиеш." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Рөхсәт ителгән IPv4 адресын кертегез." + +msgid "Enter a valid IPv6 address." +msgstr "" + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +msgid "Enter only digits separated by commas." +msgstr "Өтерләр белән бүленгән сан билгеләрен кертегез" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Бу кыйммәтнең %(limit_value)s булуын тикшерегез (хәзер ул - %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Бу кыйммәтнең %(limit_value)s карата кечерәк яки тигез булуын тикшерегез." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Бу кыйммәтнең %(limit_value)s карата зуррак яки тигез булуын тикшерегез." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "һәм" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Бу кырның кыйммәте NULL булырга тиеш түгел." + +msgid "This field cannot be blank." +msgstr "Бу кыр буш булырга тиеш түгел." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Мондый %(field_label)s белән булган %(model_name)s инде бар." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "%(field_type)s типтагы кыр" + +msgid "Integer" +msgstr "Бөтен сан" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Зур бөтен (8 байт)" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "Логик (True яисә False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Юл (күп дигәндә %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Өтерләр белән бүленгән бөтен саннар" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Дата (вакыт күрсәтмәсе булмаган)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Дата (вакыт күрсәтмәсе белән)" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Унарлы вакланма" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Эл. почта" + +msgid "File path" +msgstr "Файл юлы" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Күчерелүчән өтер белән булган сан" + +msgid "IPv4 address" +msgstr "" + +msgid "IP address" +msgstr "IP-адрес" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "Логик (True, False я None)" + +msgid "Positive integer" +msgstr "" + +msgid "Positive small integer" +msgstr "" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +msgid "Small integer" +msgstr "" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Вакыт" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "" + +msgid "Image" +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Тыш ачкыч (тип бәйле кыр буенча билгеләнгән)" + +msgid "One-to-one relationship" +msgstr "\"Бергә бер\" элемтәсе" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "\"Күпкә куп\" элемтәсе" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Мәҗбүри кыр." + +msgid "Enter a whole number." +msgstr "Бөтен сан кертегез." + +msgid "Enter a number." +msgstr "Сан кертегез." + +msgid "Enter a valid date." +msgstr "Рөхсәт ителгән датаны кертегез." + +msgid "Enter a valid time." +msgstr "Рөхсәт ителгән вакытны кертегез." + +msgid "Enter a valid date/time." +msgstr "Рөхсәт ителгән дата һәм вакытны кертегез." + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Һишбер файл җибәрелмәгән. Форма кодлавын тикшерегез." + +msgid "No file was submitted." +msgstr "Һишбер файл җибәрелмәгән." + +msgid "The submitted file is empty." +msgstr "Җибәрелгән файл буш." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Зинһар, җибәрегез файлны яисә бушайту байракчасын билгеләгез, икесен бергә " +"түгел." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Рөхсәт ителгән рәсемне йөкләгез. Сез йөкләгән файл рәсем түгел яисә бозылган." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында %(value)s юк. " + +msgid "Enter a list of values." +msgstr "Кыйммәтләр исемлеген кертегез." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" + +msgid "Order" +msgstr "Тәртип" + +msgid "Delete" +msgstr "Бетерергә" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Зинһар, %(field)s кырындагы кабатлана торган кыйммәтне төзәтегез." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Зинһар, %(field)s кырындагы кыйммәтне төзәтегез, ул уникаль булырга тиеш." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Зинһар, %(field_name)s кырындагы кыйммәтне төзәтегез, ул %(date_field)s " +"кырындагы %(lookup)s өчен уникаль булырга тиеш." + +msgid "Please correct the duplicate values below." +msgstr "Зинһар, астагы кабатлана торган кыйммәтләрне төзәтегез." + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Дөрес тәкъдимне сайлагыз. Рөхсәт ителгән кыйммәтләр арасында сезнең вариант " +"юк." + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "Бушайтырга" + +msgid "Currently" +msgstr "Хәзерге вакытта" + +msgid "Change" +msgstr "Үзгәртергә" + +msgid "Unknown" +msgstr "Билгесез" + +msgid "Yes" +msgstr "Әйе" + +msgid "No" +msgstr "Юк" + +msgid "yes,no,maybe" +msgstr "әйе,юк,бәлки" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s ГБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "т.с." + +msgid "a.m." +msgstr "т.к." + +msgid "PM" +msgstr "ТС" + +msgid "AM" +msgstr "ТК" + +msgid "midnight" +msgstr "төн уртасы" + +msgid "noon" +msgstr "көн уртасы" + +msgid "Monday" +msgstr "Дүшәмбе" + +msgid "Tuesday" +msgstr "Сишәмбе" + +msgid "Wednesday" +msgstr "Чәршәмбе" + +msgid "Thursday" +msgstr "Пәнҗешәмбе" + +msgid "Friday" +msgstr "Җомга" + +msgid "Saturday" +msgstr "Шимбә" + +msgid "Sunday" +msgstr "Якшәмбе" + +msgid "Mon" +msgstr "Дүш" + +msgid "Tue" +msgstr "Сиш" + +msgid "Wed" +msgstr "Чәр" + +msgid "Thu" +msgstr "Пнҗ" + +msgid "Fri" +msgstr "Җом" + +msgid "Sat" +msgstr "Шим" + +msgid "Sun" +msgstr "Якш" + +msgid "January" +msgstr "Гыйнвар" + +msgid "February" +msgstr "Февраль" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрель" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июнь" + +msgid "July" +msgstr "Июль" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябрь" + +msgid "October" +msgstr "Октябрь" + +msgid "November" +msgstr "Ноябрь" + +msgid "December" +msgstr "Декабрь" + +msgid "jan" +msgstr "гый" + +msgid "feb" +msgstr "фев" + +msgid "mar" +msgstr "мар" + +msgid "apr" +msgstr "апр" + +msgid "may" +msgstr "май" + +msgid "jun" +msgstr "июн" + +msgid "jul" +msgstr "июл" + +msgid "aug" +msgstr "авг" + +msgid "sep" +msgstr "сен" + +msgid "oct" +msgstr "окт" + +msgid "nov" +msgstr "ноя" + +msgid "dec" +msgstr "дек" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Гый." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Фев." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Март" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Апрель" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Июнь" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Июль" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Сен." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Ноя." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дек." + +msgctxt "alt. month" +msgid "January" +msgstr "гыйнвар" + +msgctxt "alt. month" +msgid "February" +msgstr "февраль" + +msgctxt "alt. month" +msgid "March" +msgstr "март" + +msgctxt "alt. month" +msgid "April" +msgstr "апрель" + +msgctxt "alt. month" +msgid "May" +msgstr "май" + +msgctxt "alt. month" +msgid "June" +msgstr "июнь" + +msgctxt "alt. month" +msgid "July" +msgstr "июль" + +msgctxt "alt. month" +msgid "August" +msgstr "август" + +msgctxt "alt. month" +msgid "September" +msgstr "сентябрь" + +msgctxt "alt. month" +msgid "October" +msgstr "октябрь" + +msgctxt "alt. month" +msgid "November" +msgstr "ноябрь" + +msgctxt "alt. month" +msgid "December" +msgstr "декабрь" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "" + +msgid "or" +msgstr "я" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "Ел билгеләнмәгән" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "Ай билгеләнмәгән" + +msgid "No day specified" +msgstr "Көн билгеләнмәгән" + +msgid "No week specified" +msgstr "Атна билгеләнмәгән" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Файдалана алырлык %(verbose_name_plural)s юк" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(class_name)s.allow_future False булуы сәбәпле, киләсе " +"%(verbose_name_plural)s файдалана алырлык түгел" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "Дөрес булмаган дата '%(datestr)s', бирелгән формат '%(format)s'" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Таләпкә туры килгән %(verbose_name)s табылмаган" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "Сәхифә ни соңгы түгел, ни аны бөтен санга әверелдереп булмый" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "Буш исемлек һәм '%(class_name)s.allow_empty' - False" + +msgid "Directory indexes are not allowed here." +msgstr "" + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "" + +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po new file mode 100644 index 0000000..67b600d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/udm/LC_MESSAGES/django.po @@ -0,0 +1,1171 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-15 16:15+0100\n" +"PO-Revision-Date: 2017-11-16 01:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Udmurt (http://www.transifex.com/django/django/language/" +"udm/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: udm\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "Африкаанс" + +msgid "Arabic" +msgstr "Араб" + +msgid "Asturian" +msgstr "" + +msgid "Azerbaijani" +msgstr "Азербайджан" + +msgid "Bulgarian" +msgstr "Болгар" + +msgid "Belarusian" +msgstr "Беларус" + +msgid "Bengali" +msgstr "Бенгал" + +msgid "Breton" +msgstr "Бретон" + +msgid "Bosnian" +msgstr "Босниец" + +msgid "Catalan" +msgstr "Каталан" + +msgid "Czech" +msgstr "Чех" + +msgid "Welsh" +msgstr "Уэльс" + +msgid "Danish" +msgstr "Датчан" + +msgid "German" +msgstr "Немец" + +msgid "Lower Sorbian" +msgstr "" + +msgid "Greek" +msgstr "Грек" + +msgid "English" +msgstr "Англи" + +msgid "Australian English" +msgstr "" + +msgid "British English" +msgstr "Британиысь англи" + +msgid "Esperanto" +msgstr "Эсперанто" + +msgid "Spanish" +msgstr "Испан" + +msgid "Argentinian Spanish" +msgstr "Аргентинаысь испан" + +msgid "Colombian Spanish" +msgstr "" + +msgid "Mexican Spanish" +msgstr "Мексикаысь испан" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуаысь испан" + +msgid "Venezuelan Spanish" +msgstr "Венесуэлаысь испан" + +msgid "Estonian" +msgstr "Эстон" + +msgid "Basque" +msgstr "Баск" + +msgid "Persian" +msgstr "Перс" + +msgid "Finnish" +msgstr "Финн" + +msgid "French" +msgstr "Француз" + +msgid "Frisian" +msgstr "Фриз" + +msgid "Irish" +msgstr "Ирланд" + +msgid "Scottish Gaelic" +msgstr "" + +msgid "Galician" +msgstr "Галисий" + +msgid "Hebrew" +msgstr "Иврит" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Хорват" + +msgid "Upper Sorbian" +msgstr "" + +msgid "Hungarian" +msgstr "Венгер" + +msgid "Interlingua" +msgstr "Интерлингва" + +msgid "Indonesian" +msgstr "Индонези" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Исланд" + +msgid "Italian" +msgstr "Итальян" + +msgid "Japanese" +msgstr "Япон" + +msgid "Georgian" +msgstr "Грузин" + +msgid "Kazakh" +msgstr "Казах" + +msgid "Khmer" +msgstr "Кхмер" + +msgid "Kannada" +msgstr "Каннада" + +msgid "Korean" +msgstr "Корей" + +msgid "Luxembourgish" +msgstr "Люксембург" + +msgid "Lithuanian" +msgstr "Литва" + +msgid "Latvian" +msgstr "Латвий" + +msgid "Macedonian" +msgstr "Македон" + +msgid "Malayalam" +msgstr "Малаялам" + +msgid "Mongolian" +msgstr "Монгол" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "" + +msgid "Nepali" +msgstr "Непал" + +msgid "Dutch" +msgstr "Голланд" + +msgid "Norwegian Nynorsk" +msgstr "Норвег (нюнорск)" + +msgid "Ossetic" +msgstr "" + +msgid "Punjabi" +msgstr "Панджаби" + +msgid "Polish" +msgstr "Поляк" + +msgid "Portuguese" +msgstr "Португал" + +msgid "Brazilian Portuguese" +msgstr "Бразилиысь португал" + +msgid "Romanian" +msgstr "Румын" + +msgid "Russian" +msgstr "Ӟуч" + +msgid "Slovak" +msgstr "Словак" + +msgid "Slovenian" +msgstr "Словен" + +msgid "Albanian" +msgstr "Албан" + +msgid "Serbian" +msgstr "Серб" + +msgid "Serbian Latin" +msgstr "Серб (латиницаен)" + +msgid "Swedish" +msgstr "Швед" + +msgid "Swahili" +msgstr "Суахили" + +msgid "Tamil" +msgstr "Тамиль" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Thai" +msgstr "Тай" + +msgid "Turkish" +msgstr "Турок" + +msgid "Tatar" +msgstr "Бигер" + +msgid "Udmurt" +msgstr "Удмурт" + +msgid "Ukrainian" +msgstr "Украин" + +msgid "Urdu" +msgstr "Урду" + +msgid "Vietnamese" +msgstr "Вьетнам" + +msgid "Simplified Chinese" +msgstr "Китай (капчиятэм)" + +msgid "Traditional Chinese" +msgstr "Китай (традици)" + +msgid "Messages" +msgstr "" + +msgid "Site Maps" +msgstr "" + +msgid "Static Files" +msgstr "" + +msgid "Syndication" +msgstr "" + +msgid "That page number is not an integer" +msgstr "" + +msgid "That page number is less than 1" +msgstr "" + +msgid "That page contains no results" +msgstr "" + +msgid "Enter a valid value." +msgstr "Тазэ шонер гожтэ." + +msgid "Enter a valid URL." +msgstr "Шонер URL гожтэ." + +msgid "Enter a valid integer." +msgstr "" + +msgid "Enter a valid email address." +msgstr "Электорн почта адресэз шонер гожтэ" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Татчын букваос, лыдпусъёс, улӥ гож пусъёс но дефисъёс гинэ гожтыны яра." + +msgid "" +"Enter a valid 'slug' consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +msgid "Enter a valid IPv4 address." +msgstr "Шонер IPv4-адрес гожтэ." + +msgid "Enter a valid IPv6 address." +msgstr "Шонер IPv6-адрес гожтэ." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Шонер IPv4 яке IPv6 адрес гожтэ." + +msgid "Enter only digits separated by commas." +msgstr "Запятойёсын висъям лыдпусъёсты гожтэ" + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Эскере, та %(limit_value)s шуыса. Али татын %(show_value)s." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Талы %(limit_value)s-лэсь бадӟымгес луыны уг яра." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Талы %(limit_value)s-лэсь ӧжытгес луыны уг яра." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" + +#, python-format +msgid "" +"File extension '%(extension)s' is not allowed. Allowed extensions are: " +"'%(allowed_extensions)s'." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "" + +msgid "and" +msgstr "но" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +msgid "This field cannot be null." +msgstr "Та NULL луыны уг яра." + +msgid "This field cannot be blank." +msgstr "Та буш луыны уг яра." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Таӵе %(field_label)s-ен %(model_name)s вань ини." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "%(field_type)s типъем бусы" + +msgid "Integer" +msgstr "целой" + +#, python-format +msgid "'%(value)s' value must be an integer." +msgstr "" + +msgid "Big (8 byte) integer" +msgstr "Бадӟым (8 байтъем) целой лыд" + +#, python-format +msgid "'%(value)s' value must be either True or False." +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "True яке False" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Чур (%(max_length)s пусозь кузьда)" + +msgid "Comma-separated integers" +msgstr "Запятоен висъям быдэс лыдъёс" + +#, python-format +msgid "" +"'%(value)s' value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +msgid "Date (without time)" +msgstr "Дата (час-минут пусйытэк)" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +msgid "Date (with time)" +msgstr "Дата но час-минут" + +#, python-format +msgid "'%(value)s' value must be a decimal number." +msgstr "" + +msgid "Decimal number" +msgstr "Десятичной лыд." + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in [DD] [HH:[MM:]]ss[." +"uuuuuu] format." +msgstr "" + +msgid "Duration" +msgstr "" + +msgid "Email address" +msgstr "Электрон почта адрес" + +msgid "File path" +msgstr "Файллэн нимыз" + +#, python-format +msgid "'%(value)s' value must be a float." +msgstr "" + +msgid "Floating point number" +msgstr "Вещественной лыд" + +msgid "IPv4 address" +msgstr "IPv4 адрес" + +msgid "IP address" +msgstr "IP адрес" + +#, python-format +msgid "'%(value)s' value must be either None, True or False." +msgstr "" + +msgid "Boolean (Either True, False or None)" +msgstr "True, False яке None" + +msgid "Positive integer" +msgstr "Целой, нольлэсь бадӟым лыд" + +msgid "Positive small integer" +msgstr "Нольлэсь бадӟым пичи целой лыд" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Компьютерной ним (%(max_length)s пусозь кузьда)" + +msgid "Small integer" +msgstr "Пичи целой лыд" + +msgid "Text" +msgstr "Текст" + +#, python-format +msgid "" +"'%(value)s' value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#, python-format +msgid "" +"'%(value)s' value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +msgid "Time" +msgstr "Час-минут" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "" + +#, python-format +msgid "'%(value)s' is not a valid UUID." +msgstr "" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Суред" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +msgid "Foreign Key (type determined by related field)" +msgstr "Мукет моделен герӟет (тип герӟано бусыя валамын)." + +msgid "One-to-one relationship" +msgstr "Одӥг-одӥг герӟет" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +msgid "Many-to-many relationship" +msgstr "Трос-трос герӟет" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr "" + +msgid "This field is required." +msgstr "Та клуэ." + +msgid "Enter a whole number." +msgstr "Целой лыд гожтэ." + +msgid "Enter a number." +msgstr "Лыд гожтэ." + +msgid "Enter a valid date." +msgstr "Шонер дата гожтэ." + +msgid "Enter a valid time." +msgstr "Шонер час-минут гожтэ." + +msgid "Enter a valid date/time." +msgstr "Шонер дата но час-минут гожтэ." + +msgid "Enter a valid duration." +msgstr "" + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Одӥг файл но лэзьымтэ. Формалэсь код." + +msgid "No file was submitted." +msgstr "Файл лэземын ӧвӧл." + +msgid "The submitted file is empty." +msgstr "Лэзем файл буш." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Файл лэзе яке файл ӵушоно шуыса пусъе, огдыръя соиз но, таиз но уг яра." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Суред лэзе. Тӥляд файлды лэзьымтэ яке со суред ӧвӧл." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Шонер вариант быръе. %(value)s вариантъёс пӧлын ӧвӧл." + +msgid "Enter a list of values." +msgstr "Список лэзе." + +msgid "Enter a complete value." +msgstr "" + +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr "" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" + +msgid "Order" +msgstr "Рад" + +msgid "Delete" +msgstr "Ӵушоно" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +msgid "Please correct the duplicate values below." +msgstr "" + +msgid "The inline value did not match the parent instance." +msgstr "" + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#, python-format +msgid "\"%(pk)s\" is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s couldn't be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." + +msgid "Clear" +msgstr "Буш кароно" + +msgid "Currently" +msgstr "Али" + +msgid "Change" +msgstr "Тупатъяно" + +msgid "Unknown" +msgstr "Тодымтэ" + +msgid "Yes" +msgstr "Бен" + +msgid "No" +msgstr "Ӧвӧл" + +msgid "yes,no,maybe" +msgstr "бен,ӧвӧл,уг тодӥськы" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d байт" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s МБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "лымшор бере" + +msgid "a.m." +msgstr "лымшор азе" + +msgid "PM" +msgstr "лымшор бере" + +msgid "AM" +msgstr "лымшор азе" + +msgid "midnight" +msgstr "уйшор" + +msgid "noon" +msgstr "лымшор" + +msgid "Monday" +msgstr "Вордӥськон" + +msgid "Tuesday" +msgstr "Пуксён" + +msgid "Wednesday" +msgstr "Вирнунал" + +msgid "Thursday" +msgstr "Покчиарня" + +msgid "Friday" +msgstr "Удмуртарня" + +msgid "Saturday" +msgstr "Кӧснунал" + +msgid "Sunday" +msgstr "Арнянунал" + +msgid "Mon" +msgstr "врд" + +msgid "Tue" +msgstr "пкс" + +msgid "Wed" +msgstr "врн" + +msgid "Thu" +msgstr "пкч" + +msgid "Fri" +msgstr "удм" + +msgid "Sat" +msgstr "ксн" + +msgid "Sun" +msgstr "арн" + +msgid "January" +msgstr "толшор" + +msgid "February" +msgstr "тулыспал" + +msgid "March" +msgstr "южтолэзь" + +msgid "April" +msgstr "оштолэзь" + +msgid "May" +msgstr "куартолэзь" + +msgid "June" +msgstr "инвожо" + +msgid "July" +msgstr "пӧсьтолэзь" + +msgid "August" +msgstr "гудырикошкон" + +msgid "September" +msgstr "куарусён" + +msgid "October" +msgstr "коньывуон" + +msgid "November" +msgstr "шуркынмон" + +msgid "December" +msgstr "толсур" + +msgid "jan" +msgstr "тшт" + +msgid "feb" +msgstr "тпт" + +msgid "mar" +msgstr "южт" + +msgid "apr" +msgstr "ошт" + +msgid "may" +msgstr "крт" + +msgid "jun" +msgstr "ивт" + +msgid "jul" +msgstr "пст" + +msgid "aug" +msgstr "гкт" + +msgid "sep" +msgstr "кут" + +msgid "oct" +msgstr "квт" + +msgid "nov" +msgstr "шкт" + +msgid "dec" +msgstr "тст" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "тшт" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "тпт" + +msgctxt "abbrev. month" +msgid "March" +msgstr "южт" + +msgctxt "abbrev. month" +msgid "April" +msgstr "ошт" + +msgctxt "abbrev. month" +msgid "May" +msgstr "крт" + +msgctxt "abbrev. month" +msgid "June" +msgstr "ивт" + +msgctxt "abbrev. month" +msgid "July" +msgstr "пст" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "гкт" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "кут" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "квт" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "шкт" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "тст" + +msgctxt "alt. month" +msgid "January" +msgstr "толшоре" + +msgctxt "alt. month" +msgid "February" +msgstr "тулыспалэ" + +msgctxt "alt. month" +msgid "March" +msgstr "южтолэзе" + +msgctxt "alt. month" +msgid "April" +msgstr "оштолэзе" + +msgctxt "alt. month" +msgid "May" +msgstr "куартолэзе" + +msgctxt "alt. month" +msgid "June" +msgstr "инвожое" + +msgctxt "alt. month" +msgid "July" +msgstr "пӧсьтолэзе" + +msgctxt "alt. month" +msgid "August" +msgstr "гудырикошконэ" + +msgctxt "alt. month" +msgid "September" +msgstr "куарусёнэ" + +msgctxt "alt. month" +msgid "October" +msgstr "коньывуонэ" + +msgctxt "alt. month" +msgid "November" +msgstr "шуркынмонэ" + +msgctxt "alt. month" +msgid "December" +msgstr "толсуре" + +msgid "This is not a valid IPv6 address." +msgstr "" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s..." +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "яке" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" + +msgid "0 minutes" +msgstr "" + +msgid "Forbidden" +msgstr "" + +msgid "CSRF verification failed. Request aborted." +msgstr "" + +msgid "" +"You are seeing this message because this HTTPS site requires a 'Referer " +"header' to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable 'Referer' headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for 'same-" +"origin' requests." +msgstr "" + +msgid "" +"If you are using the tag or " +"including the 'Referrer-Policy: no-referrer' header, please remove them. The " +"CSRF protection requires the 'Referer' header to do strict referer checking. " +"If you're concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for 'same-origin' requests." +msgstr "" + +msgid "More information is available with DEBUG=True." +msgstr "" + +msgid "No year specified" +msgstr "" + +msgid "Date out of range" +msgstr "" + +msgid "No month specified" +msgstr "" + +msgid "No day specified" +msgstr "" + +msgid "No week specified" +msgstr "" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#, python-format +msgid "Invalid date string '%(datestr)s' given format '%(format)s'" +msgstr "" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +msgid "Page is not 'last', nor can it be converted to an int." +msgstr "" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#, python-format +msgid "Empty list and '%(class_name)s.allow_empty' is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "Папкаослэсь пуштроссэс татын учкыны уг яра." + +#, python-format +msgid "\"%(path)s\" does not exist" +msgstr "\"%(path)s\" ӧвӧл" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s папкалэн пушторсэз" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +msgid "Django Documentation" +msgstr "" + +msgid "Topics, references, & how-to's" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "" + +msgid "Get started with Django" +msgstr "" + +msgid "Django Community" +msgstr "" + +msgid "Connect, get help, or contribute" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/uk/__init__.py b/venv/lib/python3.7/site-packages/django/conf/locale/uk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..def7a4d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/conf/locale/vi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/conf/locale/vi/formats.py b/venv/lib/python3.7/site-packages/django/conf/locale/vi/formats.py new file mode 100644 index 0000000..495b6f7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/locale/vi/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = r'\N\gà\y d \t\há\n\g n \nă\m Y' +TIME_FORMAT = 'H:i' +DATETIME_FORMAT = r'H:i \N\gà\y d \t\há\n\g n \nă\m Y' +YEAR_MONTH_FORMAT = 'F Y' +MONTH_DAY_FORMAT = 'j F' +SHORT_DATE_FORMAT = 'd-m-Y' +SHORT_DATETIME_FORMAT = 'H:i d-m-Y' +# FIRST_DAY_OF_WEEK = + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = ',' +THOUSAND_SEPARATOR = '.' +# NUMBER_GROUPING = diff --git a/venv/lib/python3.7/site-packages/django/conf/project_template/manage.py-tpl b/venv/lib/python3.7/site-packages/django/conf/project_template/manage.py-tpl new file mode 100755 index 0000000..9525fd7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/project_template/manage.py-tpl @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', '{{ project_name }}.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/venv/lib/python3.7/site-packages/django/conf/urls/__init__.py b/venv/lib/python3.7/site-packages/django/conf/urls/__init__.py new file mode 100644 index 0000000..7bda345 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/conf/urls/__init__.py @@ -0,0 +1,13 @@ +from django.urls import include, re_path +from django.views import defaults + +__all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url'] + +handler400 = defaults.bad_request +handler403 = defaults.permission_denied +handler404 = defaults.page_not_found +handler500 = defaults.server_error + + +def url(regex, view, kwargs=None, name=None): + return re_path(regex, view, kwargs, name) diff --git a/venv/lib/python3.7/site-packages/django/contrib/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/actions.py b/venv/lib/python3.7/site-packages/django/contrib/admin/actions.py new file mode 100644 index 0000000..1e1c3bd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/actions.py @@ -0,0 +1,79 @@ +""" +Built-in, globally-available admin actions. +""" + +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import model_ngettext +from django.core.exceptions import PermissionDenied +from django.template.response import TemplateResponse +from django.utils.translation import gettext as _, gettext_lazy + + +def delete_selected(modeladmin, request, queryset): + """ + Default action which deletes the selected objects. + + This action first displays a confirmation page which shows all the + deletable objects, or, if the user has no permission one of the related + childs (foreignkeys), a "permission denied" message. + + Next, it deletes all selected objects and redirects back to the change list. + """ + opts = modeladmin.model._meta + app_label = opts.app_label + + # Populate deletable_objects, a data structure of all related objects that + # will also be deleted. + deletable_objects, model_count, perms_needed, protected = modeladmin.get_deleted_objects(queryset, request) + + # The user has already confirmed the deletion. + # Do the deletion and return None to display the change list view again. + if request.POST.get('post') and not protected: + if perms_needed: + raise PermissionDenied + n = queryset.count() + if n: + for obj in queryset: + obj_display = str(obj) + modeladmin.log_deletion(request, obj, obj_display) + modeladmin.delete_queryset(request, queryset) + modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { + "count": n, "items": model_ngettext(modeladmin.opts, n) + }, messages.SUCCESS) + # Return None to display the change list page again. + return None + + objects_name = model_ngettext(queryset) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": objects_name} + else: + title = _("Are you sure?") + + context = { + **modeladmin.admin_site.each_context(request), + 'title': title, + 'objects_name': str(objects_name), + 'deletable_objects': [deletable_objects], + 'model_count': dict(model_count).items(), + 'queryset': queryset, + 'perms_lacking': perms_needed, + 'protected': protected, + 'opts': opts, + 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, + 'media': modeladmin.media, + } + + request.current_app = modeladmin.admin_site.name + + # Display the confirmation page + return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [ + "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name), + "admin/%s/delete_selected_confirmation.html" % app_label, + "admin/delete_selected_confirmation.html" + ], context) + + +delete_selected.allowed_permissions = ('delete',) +delete_selected.short_description = gettext_lazy("Delete selected %(verbose_name_plural)s") diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/checks.py b/venv/lib/python3.7/site-packages/django/contrib/admin/checks.py new file mode 100644 index 0000000..aa54994 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/checks.py @@ -0,0 +1,1134 @@ +import warnings +from itertools import chain + +from django.apps import apps +from django.conf import settings +from django.contrib.admin.utils import ( + NotRelationField, flatten, get_fields_from_path, +) +from django.core import checks +from django.core.exceptions import FieldDoesNotExist +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Combinable, F, OrderBy +from django.forms.models import ( + BaseModelForm, BaseModelFormSet, _get_foreign_key, +) +from django.template import engines +from django.template.backends.django import DjangoTemplates +from django.utils.deprecation import RemovedInDjango30Warning +from django.utils.inspect import get_func_args +from django.utils.module_loading import import_string + + +def _issubclass(cls, classinfo): + """ + issubclass() variant that doesn't raise an exception if cls isn't a + class. + """ + try: + return issubclass(cls, classinfo) + except TypeError: + return False + + +def _contains_subclass(class_path, candidate_paths): + """ + Return whether or not a dotted class path (or a subclass of that class) is + found in a list of candidate paths. + """ + cls = import_string(class_path) + for path in candidate_paths: + try: + candidate_cls = import_string(path) + except ImportError: + # ImportErrors are raised elsewhere. + continue + if _issubclass(candidate_cls, cls): + return True + return False + + +def check_admin_app(app_configs, **kwargs): + from django.contrib.admin.sites import all_sites + errors = [] + for site in all_sites: + errors.extend(site.check(app_configs)) + return errors + + +def check_dependencies(**kwargs): + """ + Check that the admin's dependencies are correctly installed. + """ + if not apps.is_installed('django.contrib.admin'): + return [] + errors = [] + app_dependencies = ( + ('django.contrib.contenttypes', 401), + ('django.contrib.auth', 405), + ('django.contrib.messages', 406), + ) + for app_name, error_code in app_dependencies: + if not apps.is_installed(app_name): + errors.append(checks.Error( + "'%s' must be in INSTALLED_APPS in order to use the admin " + "application." % app_name, + id='admin.E%d' % error_code, + )) + for engine in engines.all(): + if isinstance(engine, DjangoTemplates): + django_templates_instance = engine.engine + break + else: + django_templates_instance = None + if not django_templates_instance: + errors.append(checks.Error( + "A 'django.template.backends.django.DjangoTemplates' instance " + "must be configured in TEMPLATES in order to use the admin " + "application.", + id='admin.E403', + )) + else: + if ('django.contrib.auth.context_processors.auth' + not in django_templates_instance.context_processors and + _contains_subclass('django.contrib.auth.backends.ModelBackend', settings.AUTHENTICATION_BACKENDS)): + errors.append(checks.Error( + "'django.contrib.auth.context_processors.auth' must be " + "enabled in DjangoTemplates (TEMPLATES) if using the default " + "auth backend in order to use the admin application.", + id='admin.E402', + )) + if ('django.contrib.messages.context_processors.messages' + not in django_templates_instance.context_processors): + errors.append(checks.Error( + "'django.contrib.messages.context_processors.messages' must " + "be enabled in DjangoTemplates (TEMPLATES) in order to use " + "the admin application.", + id='admin.E404', + )) + + if not _contains_subclass('django.contrib.auth.middleware.AuthenticationMiddleware', settings.MIDDLEWARE): + errors.append(checks.Error( + "'django.contrib.auth.middleware.AuthenticationMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id='admin.E408', + )) + if not _contains_subclass('django.contrib.messages.middleware.MessageMiddleware', settings.MIDDLEWARE): + errors.append(checks.Error( + "'django.contrib.messages.middleware.MessageMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id='admin.E409', + )) + if not _contains_subclass('django.contrib.sessions.middleware.SessionMiddleware', settings.MIDDLEWARE): + errors.append(checks.Error( + "'django.contrib.sessions.middleware.SessionMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id='admin.E410', + )) + return errors + + +class BaseModelAdminChecks: + + def check(self, admin_obj, **kwargs): + return [ + *self._check_autocomplete_fields(admin_obj), + *self._check_raw_id_fields(admin_obj), + *self._check_fields(admin_obj), + *self._check_fieldsets(admin_obj), + *self._check_exclude(admin_obj), + *self._check_form(admin_obj), + *self._check_filter_vertical(admin_obj), + *self._check_filter_horizontal(admin_obj), + *self._check_radio_fields(admin_obj), + *self._check_prepopulated_fields(admin_obj), + *self._check_view_on_site_url(admin_obj), + *self._check_ordering(admin_obj), + *self._check_readonly_fields(admin_obj), + ] + + def _check_autocomplete_fields(self, obj): + """ + Check that `autocomplete_fields` is a list or tuple of model fields. + """ + if not isinstance(obj.autocomplete_fields, (list, tuple)): + return must_be('a list or tuple', option='autocomplete_fields', obj=obj, id='admin.E036') + else: + return list(chain.from_iterable([ + self._check_autocomplete_fields_item(obj, field_name, 'autocomplete_fields[%d]' % index) + for index, field_name in enumerate(obj.autocomplete_fields) + ])) + + def _check_autocomplete_fields_item(self, obj, field_name, label): + """ + Check that an item in `autocomplete_fields` is a ForeignKey or a + ManyToManyField and that the item has a related ModelAdmin with + search_fields defined. + """ + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E037') + else: + if not field.many_to_many and not isinstance(field, models.ForeignKey): + return must_be( + 'a foreign key or a many-to-many field', + option=label, obj=obj, id='admin.E038' + ) + related_admin = obj.admin_site._registry.get(field.remote_field.model) + if related_admin is None: + return [ + checks.Error( + 'An admin for model "%s" has to be registered ' + 'to be referenced by %s.autocomplete_fields.' % ( + field.remote_field.model.__name__, + type(obj).__name__, + ), + obj=obj.__class__, + id='admin.E039', + ) + ] + elif not related_admin.search_fields: + return [ + checks.Error( + '%s must define "search_fields", because it\'s ' + 'referenced by %s.autocomplete_fields.' % ( + related_admin.__class__.__name__, + type(obj).__name__, + ), + obj=obj.__class__, + id='admin.E040', + ) + ] + return [] + + def _check_raw_id_fields(self, obj): + """ Check that `raw_id_fields` only contains field names that are listed + on the model. """ + + if not isinstance(obj.raw_id_fields, (list, tuple)): + return must_be('a list or tuple', option='raw_id_fields', obj=obj, id='admin.E001') + else: + return list(chain.from_iterable( + self._check_raw_id_fields_item(obj, field_name, 'raw_id_fields[%d]' % index) + for index, field_name in enumerate(obj.raw_id_fields) + )) + + def _check_raw_id_fields_item(self, obj, field_name, label): + """ Check an item of `raw_id_fields`, i.e. check that field named + `field_name` exists in model `model` and is a ForeignKey or a + ManyToManyField. """ + + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E002') + else: + if not field.many_to_many and not isinstance(field, models.ForeignKey): + return must_be('a foreign key or a many-to-many field', option=label, obj=obj, id='admin.E003') + else: + return [] + + def _check_fields(self, obj): + """ Check that `fields` only refer to existing fields, doesn't contain + duplicates. Check if at most one of `fields` and `fieldsets` is defined. + """ + + if obj.fields is None: + return [] + elif not isinstance(obj.fields, (list, tuple)): + return must_be('a list or tuple', option='fields', obj=obj, id='admin.E004') + elif obj.fieldsets: + return [ + checks.Error( + "Both 'fieldsets' and 'fields' are specified.", + obj=obj.__class__, + id='admin.E005', + ) + ] + fields = flatten(obj.fields) + if len(fields) != len(set(fields)): + return [ + checks.Error( + "The value of 'fields' contains duplicate field(s).", + obj=obj.__class__, + id='admin.E006', + ) + ] + + return list(chain.from_iterable( + self._check_field_spec(obj, field_name, 'fields') + for field_name in obj.fields + )) + + def _check_fieldsets(self, obj): + """ Check that fieldsets is properly formatted and doesn't contain + duplicates. """ + + if obj.fieldsets is None: + return [] + elif not isinstance(obj.fieldsets, (list, tuple)): + return must_be('a list or tuple', option='fieldsets', obj=obj, id='admin.E007') + else: + seen_fields = [] + return list(chain.from_iterable( + self._check_fieldsets_item(obj, fieldset, 'fieldsets[%d]' % index, seen_fields) + for index, fieldset in enumerate(obj.fieldsets) + )) + + def _check_fieldsets_item(self, obj, fieldset, label, seen_fields): + """ Check an item of `fieldsets`, i.e. check that this is a pair of a + set name and a dictionary containing "fields" key. """ + + if not isinstance(fieldset, (list, tuple)): + return must_be('a list or tuple', option=label, obj=obj, id='admin.E008') + elif len(fieldset) != 2: + return must_be('of length 2', option=label, obj=obj, id='admin.E009') + elif not isinstance(fieldset[1], dict): + return must_be('a dictionary', option='%s[1]' % label, obj=obj, id='admin.E010') + elif 'fields' not in fieldset[1]: + return [ + checks.Error( + "The value of '%s[1]' must contain the key 'fields'." % label, + obj=obj.__class__, + id='admin.E011', + ) + ] + elif not isinstance(fieldset[1]['fields'], (list, tuple)): + return must_be('a list or tuple', option="%s[1]['fields']" % label, obj=obj, id='admin.E008') + + seen_fields.extend(flatten(fieldset[1]['fields'])) + if len(seen_fields) != len(set(seen_fields)): + return [ + checks.Error( + "There are duplicate field(s) in '%s[1]'." % label, + obj=obj.__class__, + id='admin.E012', + ) + ] + return list(chain.from_iterable( + self._check_field_spec(obj, fieldset_fields, '%s[1]["fields"]' % label) + for fieldset_fields in fieldset[1]['fields'] + )) + + def _check_field_spec(self, obj, fields, label): + """ `fields` should be an item of `fields` or an item of + fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a + field name or a tuple of field names. """ + + if isinstance(fields, tuple): + return list(chain.from_iterable( + self._check_field_spec_item(obj, field_name, "%s[%d]" % (label, index)) + for index, field_name in enumerate(fields) + )) + else: + return self._check_field_spec_item(obj, fields, label) + + def _check_field_spec_item(self, obj, field_name, label): + if field_name in obj.readonly_fields: + # Stuff can be put in fields that isn't actually a model field if + # it's in readonly_fields, readonly_fields will handle the + # validation of such things. + return [] + else: + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + # If we can't find a field on the model that matches, it could + # be an extra field on the form. + return [] + else: + if (isinstance(field, models.ManyToManyField) and + not field.remote_field.through._meta.auto_created): + return [ + checks.Error( + "The value of '%s' cannot include the ManyToManyField '%s', " + "because that field manually specifies a relationship model." + % (label, field_name), + obj=obj.__class__, + id='admin.E013', + ) + ] + else: + return [] + + def _check_exclude(self, obj): + """ Check that exclude is a sequence without duplicates. """ + + if obj.exclude is None: # default value is None + return [] + elif not isinstance(obj.exclude, (list, tuple)): + return must_be('a list or tuple', option='exclude', obj=obj, id='admin.E014') + elif len(obj.exclude) > len(set(obj.exclude)): + return [ + checks.Error( + "The value of 'exclude' contains duplicate field(s).", + obj=obj.__class__, + id='admin.E015', + ) + ] + else: + return [] + + def _check_form(self, obj): + """ Check that form subclasses BaseModelForm. """ + if not _issubclass(obj.form, BaseModelForm): + return must_inherit_from(parent='BaseModelForm', option='form', + obj=obj, id='admin.E016') + else: + return [] + + def _check_filter_vertical(self, obj): + """ Check that filter_vertical is a sequence of field names. """ + if not isinstance(obj.filter_vertical, (list, tuple)): + return must_be('a list or tuple', option='filter_vertical', obj=obj, id='admin.E017') + else: + return list(chain.from_iterable( + self._check_filter_item(obj, field_name, "filter_vertical[%d]" % index) + for index, field_name in enumerate(obj.filter_vertical) + )) + + def _check_filter_horizontal(self, obj): + """ Check that filter_horizontal is a sequence of field names. """ + if not isinstance(obj.filter_horizontal, (list, tuple)): + return must_be('a list or tuple', option='filter_horizontal', obj=obj, id='admin.E018') + else: + return list(chain.from_iterable( + self._check_filter_item(obj, field_name, "filter_horizontal[%d]" % index) + for index, field_name in enumerate(obj.filter_horizontal) + )) + + def _check_filter_item(self, obj, field_name, label): + """ Check one item of `filter_vertical` or `filter_horizontal`, i.e. + check that given field exists and is a ManyToManyField. """ + + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E019') + else: + if not field.many_to_many: + return must_be('a many-to-many field', option=label, obj=obj, id='admin.E020') + else: + return [] + + def _check_radio_fields(self, obj): + """ Check that `radio_fields` is a dictionary. """ + if not isinstance(obj.radio_fields, dict): + return must_be('a dictionary', option='radio_fields', obj=obj, id='admin.E021') + else: + return list(chain.from_iterable( + self._check_radio_fields_key(obj, field_name, 'radio_fields') + + self._check_radio_fields_value(obj, val, 'radio_fields["%s"]' % field_name) + for field_name, val in obj.radio_fields.items() + )) + + def _check_radio_fields_key(self, obj, field_name, label): + """ Check that a key of `radio_fields` dictionary is name of existing + field and that the field is a ForeignKey or has `choices` defined. """ + + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E022') + else: + if not (isinstance(field, models.ForeignKey) or field.choices): + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not an " + "instance of ForeignKey, and does not have a 'choices' definition." % ( + label, field_name + ), + obj=obj.__class__, + id='admin.E023', + ) + ] + else: + return [] + + def _check_radio_fields_value(self, obj, val, label): + """ Check type of a value of `radio_fields` dictionary. """ + + from django.contrib.admin.options import HORIZONTAL, VERTICAL + + if val not in (HORIZONTAL, VERTICAL): + return [ + checks.Error( + "The value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL." % label, + obj=obj.__class__, + id='admin.E024', + ) + ] + else: + return [] + + def _check_view_on_site_url(self, obj): + if not callable(obj.view_on_site) and not isinstance(obj.view_on_site, bool): + return [ + checks.Error( + "The value of 'view_on_site' must be a callable or a boolean value.", + obj=obj.__class__, + id='admin.E025', + ) + ] + else: + return [] + + def _check_prepopulated_fields(self, obj): + """ Check that `prepopulated_fields` is a dictionary containing allowed + field types. """ + if not isinstance(obj.prepopulated_fields, dict): + return must_be('a dictionary', option='prepopulated_fields', obj=obj, id='admin.E026') + else: + return list(chain.from_iterable( + self._check_prepopulated_fields_key(obj, field_name, 'prepopulated_fields') + + self._check_prepopulated_fields_value(obj, val, 'prepopulated_fields["%s"]' % field_name) + for field_name, val in obj.prepopulated_fields.items() + )) + + def _check_prepopulated_fields_key(self, obj, field_name, label): + """ Check a key of `prepopulated_fields` dictionary, i.e. check that it + is a name of existing field and the field is one of the allowed types. + """ + + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E027') + else: + if isinstance(field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField)): + return [ + checks.Error( + "The value of '%s' refers to '%s', which must not be a DateTimeField, " + "a ForeignKey, a OneToOneField, or a ManyToManyField." % (label, field_name), + obj=obj.__class__, + id='admin.E028', + ) + ] + else: + return [] + + def _check_prepopulated_fields_value(self, obj, val, label): + """ Check a value of `prepopulated_fields` dictionary, i.e. it's an + iterable of existing fields. """ + + if not isinstance(val, (list, tuple)): + return must_be('a list or tuple', option=label, obj=obj, id='admin.E029') + else: + return list(chain.from_iterable( + self._check_prepopulated_fields_value_item(obj, subfield_name, "%s[%r]" % (label, index)) + for index, subfield_name in enumerate(val) + )) + + def _check_prepopulated_fields_value_item(self, obj, field_name, label): + """ For `prepopulated_fields` equal to {"slug": ("title",)}, + `field_name` is "title". """ + + try: + obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E030') + else: + return [] + + def _check_ordering(self, obj): + """ Check that ordering refers to existing fields or is random. """ + + # ordering = None + if obj.ordering is None: # The default value is None + return [] + elif not isinstance(obj.ordering, (list, tuple)): + return must_be('a list or tuple', option='ordering', obj=obj, id='admin.E031') + else: + return list(chain.from_iterable( + self._check_ordering_item(obj, field_name, 'ordering[%d]' % index) + for index, field_name in enumerate(obj.ordering) + )) + + def _check_ordering_item(self, obj, field_name, label): + """ Check that `ordering` refers to existing fields. """ + if isinstance(field_name, (Combinable, OrderBy)): + if not isinstance(field_name, OrderBy): + field_name = field_name.asc() + if isinstance(field_name.expression, F): + field_name = field_name.expression.name + else: + return [] + if field_name == '?' and len(obj.ordering) != 1: + return [ + checks.Error( + "The value of 'ordering' has the random ordering marker '?', " + "but contains other fields as well.", + hint='Either remove the "?", or remove the other fields.', + obj=obj.__class__, + id='admin.E032', + ) + ] + elif field_name == '?': + return [] + elif LOOKUP_SEP in field_name: + # Skip ordering in the format field1__field2 (FIXME: checking + # this format would be nice, but it's a little fiddly). + return [] + else: + if field_name.startswith('-'): + field_name = field_name[1:] + if field_name == 'pk': + return [] + try: + obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E033') + else: + return [] + + def _check_readonly_fields(self, obj): + """ Check that readonly_fields refers to proper attribute or field. """ + + if obj.readonly_fields == (): + return [] + elif not isinstance(obj.readonly_fields, (list, tuple)): + return must_be('a list or tuple', option='readonly_fields', obj=obj, id='admin.E034') + else: + return list(chain.from_iterable( + self._check_readonly_fields_item(obj, field_name, "readonly_fields[%d]" % index) + for index, field_name in enumerate(obj.readonly_fields) + )) + + def _check_readonly_fields_item(self, obj, field_name, label): + if callable(field_name): + return [] + elif hasattr(obj, field_name): + return [] + elif hasattr(obj.model, field_name): + return [] + else: + try: + obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return [ + checks.Error( + "The value of '%s' is not a callable, an attribute of '%s', or an attribute of '%s.%s'." % ( + label, obj.__class__.__name__, obj.model._meta.app_label, obj.model._meta.object_name + ), + obj=obj.__class__, + id='admin.E035', + ) + ] + else: + return [] + + +class ModelAdminChecks(BaseModelAdminChecks): + + def check(self, admin_obj, **kwargs): + return [ + *super().check(admin_obj), + *self._check_save_as(admin_obj), + *self._check_save_on_top(admin_obj), + *self._check_inlines(admin_obj), + *self._check_list_display(admin_obj), + *self._check_list_display_links(admin_obj), + *self._check_list_filter(admin_obj), + *self._check_list_select_related(admin_obj), + *self._check_list_per_page(admin_obj), + *self._check_list_max_show_all(admin_obj), + *self._check_list_editable(admin_obj), + *self._check_search_fields(admin_obj), + *self._check_date_hierarchy(admin_obj), + *self._check_action_permission_methods(admin_obj), + *self._check_actions_uniqueness(admin_obj), + ] + + def _check_save_as(self, obj): + """ Check save_as is a boolean. """ + + if not isinstance(obj.save_as, bool): + return must_be('a boolean', option='save_as', + obj=obj, id='admin.E101') + else: + return [] + + def _check_save_on_top(self, obj): + """ Check save_on_top is a boolean. """ + + if not isinstance(obj.save_on_top, bool): + return must_be('a boolean', option='save_on_top', + obj=obj, id='admin.E102') + else: + return [] + + def _check_inlines(self, obj): + """ Check all inline model admin classes. """ + + if not isinstance(obj.inlines, (list, tuple)): + return must_be('a list or tuple', option='inlines', obj=obj, id='admin.E103') + else: + return list(chain.from_iterable( + self._check_inlines_item(obj, item, "inlines[%d]" % index) + for index, item in enumerate(obj.inlines) + )) + + def _check_inlines_item(self, obj, inline, label): + """ Check one inline model admin. """ + try: + inline_label = inline.__module__ + '.' + inline.__name__ + except AttributeError: + return [ + checks.Error( + "'%s' must inherit from 'InlineModelAdmin'." % obj, + obj=obj.__class__, + id='admin.E104', + ) + ] + + from django.contrib.admin.options import InlineModelAdmin + + if not _issubclass(inline, InlineModelAdmin): + return [ + checks.Error( + "'%s' must inherit from 'InlineModelAdmin'." % inline_label, + obj=obj.__class__, + id='admin.E104', + ) + ] + elif not inline.model: + return [ + checks.Error( + "'%s' must have a 'model' attribute." % inline_label, + obj=obj.__class__, + id='admin.E105', + ) + ] + elif not _issubclass(inline.model, models.Model): + return must_be('a Model', option='%s.model' % inline_label, obj=obj, id='admin.E106') + else: + return inline(obj.model, obj.admin_site).check() + + def _check_list_display(self, obj): + """ Check that list_display only contains fields or usable attributes. + """ + + if not isinstance(obj.list_display, (list, tuple)): + return must_be('a list or tuple', option='list_display', obj=obj, id='admin.E107') + else: + return list(chain.from_iterable( + self._check_list_display_item(obj, item, "list_display[%d]" % index) + for index, item in enumerate(obj.list_display) + )) + + def _check_list_display_item(self, obj, item, label): + if callable(item): + return [] + elif hasattr(obj, item): + return [] + elif hasattr(obj.model, item): + try: + field = obj.model._meta.get_field(item) + except FieldDoesNotExist: + return [] + else: + if isinstance(field, models.ManyToManyField): + return [ + checks.Error( + "The value of '%s' must not be a ManyToManyField." % label, + obj=obj.__class__, + id='admin.E109', + ) + ] + return [] + else: + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not a callable, " + "an attribute of '%s', or an attribute or method on '%s.%s'." % ( + label, item, obj.__class__.__name__, + obj.model._meta.app_label, obj.model._meta.object_name, + ), + obj=obj.__class__, + id='admin.E108', + ) + ] + + def _check_list_display_links(self, obj): + """ Check that list_display_links is a unique subset of list_display. + """ + from django.contrib.admin.options import ModelAdmin + + if obj.list_display_links is None: + return [] + elif not isinstance(obj.list_display_links, (list, tuple)): + return must_be('a list, a tuple, or None', option='list_display_links', obj=obj, id='admin.E110') + # Check only if ModelAdmin.get_list_display() isn't overridden. + elif obj.get_list_display.__func__ is ModelAdmin.get_list_display: + return list(chain.from_iterable( + self._check_list_display_links_item(obj, field_name, "list_display_links[%d]" % index) + for index, field_name in enumerate(obj.list_display_links) + )) + return [] + + def _check_list_display_links_item(self, obj, field_name, label): + if field_name not in obj.list_display: + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not defined in 'list_display'." % ( + label, field_name + ), + obj=obj.__class__, + id='admin.E111', + ) + ] + else: + return [] + + def _check_list_filter(self, obj): + if not isinstance(obj.list_filter, (list, tuple)): + return must_be('a list or tuple', option='list_filter', obj=obj, id='admin.E112') + else: + return list(chain.from_iterable( + self._check_list_filter_item(obj, item, "list_filter[%d]" % index) + for index, item in enumerate(obj.list_filter) + )) + + def _check_list_filter_item(self, obj, item, label): + """ + Check one item of `list_filter`, i.e. check if it is one of three options: + 1. 'field' -- a basic field filter, possibly w/ relationships (e.g. + 'field__rel') + 2. ('field', SomeFieldListFilter) - a field-based list filter class + 3. SomeListFilter - a non-field list filter class + """ + + from django.contrib.admin import ListFilter, FieldListFilter + + if callable(item) and not isinstance(item, models.Field): + # If item is option 3, it should be a ListFilter... + if not _issubclass(item, ListFilter): + return must_inherit_from(parent='ListFilter', option=label, + obj=obj, id='admin.E113') + # ... but not a FieldListFilter. + elif issubclass(item, FieldListFilter): + return [ + checks.Error( + "The value of '%s' must not inherit from 'FieldListFilter'." % label, + obj=obj.__class__, + id='admin.E114', + ) + ] + else: + return [] + elif isinstance(item, (tuple, list)): + # item is option #2 + field, list_filter_class = item + if not _issubclass(list_filter_class, FieldListFilter): + return must_inherit_from(parent='FieldListFilter', option='%s[1]' % label, obj=obj, id='admin.E115') + else: + return [] + else: + # item is option #1 + field = item + + # Validate the field string + try: + get_fields_from_path(obj.model, field) + except (NotRelationField, FieldDoesNotExist): + return [ + checks.Error( + "The value of '%s' refers to '%s', which does not refer to a Field." % (label, field), + obj=obj.__class__, + id='admin.E116', + ) + ] + else: + return [] + + def _check_list_select_related(self, obj): + """ Check that list_select_related is a boolean, a list or a tuple. """ + + if not isinstance(obj.list_select_related, (bool, list, tuple)): + return must_be('a boolean, tuple or list', option='list_select_related', obj=obj, id='admin.E117') + else: + return [] + + def _check_list_per_page(self, obj): + """ Check that list_per_page is an integer. """ + + if not isinstance(obj.list_per_page, int): + return must_be('an integer', option='list_per_page', obj=obj, id='admin.E118') + else: + return [] + + def _check_list_max_show_all(self, obj): + """ Check that list_max_show_all is an integer. """ + + if not isinstance(obj.list_max_show_all, int): + return must_be('an integer', option='list_max_show_all', obj=obj, id='admin.E119') + else: + return [] + + def _check_list_editable(self, obj): + """ Check that list_editable is a sequence of editable fields from + list_display without first element. """ + + if not isinstance(obj.list_editable, (list, tuple)): + return must_be('a list or tuple', option='list_editable', obj=obj, id='admin.E120') + else: + return list(chain.from_iterable( + self._check_list_editable_item(obj, item, "list_editable[%d]" % index) + for index, item in enumerate(obj.list_editable) + )) + + def _check_list_editable_item(self, obj, field_name, label): + try: + field = obj.model._meta.get_field(field_name) + except FieldDoesNotExist: + return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E121') + else: + if field_name not in obj.list_display: + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not " + "contained in 'list_display'." % (label, field_name), + obj=obj.__class__, + id='admin.E122', + ) + ] + elif obj.list_display_links and field_name in obj.list_display_links: + return [ + checks.Error( + "The value of '%s' cannot be in both 'list_editable' and 'list_display_links'." % field_name, + obj=obj.__class__, + id='admin.E123', + ) + ] + # If list_display[0] is in list_editable, check that + # list_display_links is set. See #22792 and #26229 for use cases. + elif (obj.list_display[0] == field_name and not obj.list_display_links and + obj.list_display_links is not None): + return [ + checks.Error( + "The value of '%s' refers to the first field in 'list_display' ('%s'), " + "which cannot be used unless 'list_display_links' is set." % ( + label, obj.list_display[0] + ), + obj=obj.__class__, + id='admin.E124', + ) + ] + elif not field.editable: + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not editable through the admin." % ( + label, field_name + ), + obj=obj.__class__, + id='admin.E125', + ) + ] + else: + return [] + + def _check_search_fields(self, obj): + """ Check search_fields is a sequence. """ + + if not isinstance(obj.search_fields, (list, tuple)): + return must_be('a list or tuple', option='search_fields', obj=obj, id='admin.E126') + else: + return [] + + def _check_date_hierarchy(self, obj): + """ Check that date_hierarchy refers to DateField or DateTimeField. """ + + if obj.date_hierarchy is None: + return [] + else: + try: + field = get_fields_from_path(obj.model, obj.date_hierarchy)[-1] + except (NotRelationField, FieldDoesNotExist): + return [ + checks.Error( + "The value of 'date_hierarchy' refers to '%s', which " + "does not refer to a Field." % obj.date_hierarchy, + obj=obj.__class__, + id='admin.E127', + ) + ] + else: + if not isinstance(field, (models.DateField, models.DateTimeField)): + return must_be('a DateField or DateTimeField', option='date_hierarchy', obj=obj, id='admin.E128') + else: + return [] + + def _check_action_permission_methods(self, obj): + """ + Actions with an allowed_permission attribute require the ModelAdmin to + implement a has__permission() method for each permission. + """ + actions = obj._get_base_actions() + errors = [] + for func, name, _ in actions: + if not hasattr(func, 'allowed_permissions'): + continue + for permission in func.allowed_permissions: + method_name = 'has_%s_permission' % permission + if not hasattr(obj, method_name): + errors.append( + checks.Error( + '%s must define a %s() method for the %s action.' % ( + obj.__class__.__name__, + method_name, + func.__name__, + ), + obj=obj.__class__, + id='admin.E129', + ) + ) + return errors + + def _check_actions_uniqueness(self, obj): + """Check that every action has a unique __name__.""" + names = [name for _, name, _ in obj._get_base_actions()] + if len(names) != len(set(names)): + return [checks.Error( + '__name__ attributes of actions defined in %s must be ' + 'unique.' % obj.__class__, + obj=obj.__class__, + id='admin.E130', + )] + return [] + + +class InlineModelAdminChecks(BaseModelAdminChecks): + + def check(self, inline_obj, **kwargs): + self._check_has_add_permission(inline_obj) + parent_model = inline_obj.parent_model + return [ + *super().check(inline_obj), + *self._check_relation(inline_obj, parent_model), + *self._check_exclude_of_parent_model(inline_obj, parent_model), + *self._check_extra(inline_obj), + *self._check_max_num(inline_obj), + *self._check_min_num(inline_obj), + *self._check_formset(inline_obj), + ] + + def _check_exclude_of_parent_model(self, obj, parent_model): + # Do not perform more specific checks if the base checks result in an + # error. + errors = super()._check_exclude(obj) + if errors: + return [] + + # Skip if `fk_name` is invalid. + if self._check_relation(obj, parent_model): + return [] + + if obj.exclude is None: + return [] + + fk = _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) + if fk.name in obj.exclude: + return [ + checks.Error( + "Cannot exclude the field '%s', because it is the foreign key " + "to the parent model '%s.%s'." % ( + fk.name, parent_model._meta.app_label, parent_model._meta.object_name + ), + obj=obj.__class__, + id='admin.E201', + ) + ] + else: + return [] + + def _check_relation(self, obj, parent_model): + try: + _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) + except ValueError as e: + return [checks.Error(e.args[0], obj=obj.__class__, id='admin.E202')] + else: + return [] + + def _check_extra(self, obj): + """ Check that extra is an integer. """ + + if not isinstance(obj.extra, int): + return must_be('an integer', option='extra', obj=obj, id='admin.E203') + else: + return [] + + def _check_max_num(self, obj): + """ Check that max_num is an integer. """ + + if obj.max_num is None: + return [] + elif not isinstance(obj.max_num, int): + return must_be('an integer', option='max_num', obj=obj, id='admin.E204') + else: + return [] + + def _check_min_num(self, obj): + """ Check that min_num is an integer. """ + + if obj.min_num is None: + return [] + elif not isinstance(obj.min_num, int): + return must_be('an integer', option='min_num', obj=obj, id='admin.E205') + else: + return [] + + def _check_formset(self, obj): + """ Check formset is a subclass of BaseModelFormSet. """ + + if not _issubclass(obj.formset, BaseModelFormSet): + return must_inherit_from(parent='BaseModelFormSet', option='formset', obj=obj, id='admin.E206') + else: + return [] + + def _check_has_add_permission(self, obj): + cls = obj.__class__ + try: + func = cls.has_add_permission + except AttributeError: + pass + else: + args = get_func_args(func) + if 'obj' not in args: + warnings.warn( + "Update %s.has_add_permission() to accept a positional " + "`obj` argument." % cls.__name__, RemovedInDjango30Warning + ) + + +def must_be(type, option, obj, id): + return [ + checks.Error( + "The value of '%s' must be %s." % (option, type), + obj=obj.__class__, + id=id, + ), + ] + + +def must_inherit_from(parent, option, obj, id): + return [ + checks.Error( + "The value of '%s' must inherit from '%s'." % (option, parent), + obj=obj.__class__, + id=id, + ), + ] + + +def refer_to_missing_field(field, option, obj, id): + return [ + checks.Error( + "The value of '%s' refers to '%s', which is not an attribute of '%s.%s'." % ( + option, field, obj.model._meta.app_label, obj.model._meta.object_name + ), + obj=obj.__class__, + id=id, + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/filters.py b/venv/lib/python3.7/site-packages/django/contrib/admin/filters.py new file mode 100644 index 0000000..d65e01d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/filters.py @@ -0,0 +1,422 @@ +""" +This encapsulates the logic for displaying filters in the Django admin. +Filters are specified in models with the "list_filter" option. + +Each filter subclass knows how to display a filter for a field that passes a +certain test -- e.g. being a DateField or ForeignKey. +""" +import datetime + +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib.admin.utils import ( + get_model_from_relation, prepare_lookup_value, reverse_field_path, +) +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.db import models +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + + +class ListFilter: + title = None # Human-readable title to appear in the right sidebar. + template = 'admin/filter.html' + + def __init__(self, request, params, model, model_admin): + # This dictionary will eventually contain the request's query string + # parameters actually used by this filter. + self.used_parameters = {} + if self.title is None: + raise ImproperlyConfigured( + "The list filter '%s' does not specify a 'title'." + % self.__class__.__name__ + ) + + def has_output(self): + """ + Return True if some choices would be output for this filter. + """ + raise NotImplementedError('subclasses of ListFilter must provide a has_output() method') + + def choices(self, changelist): + """ + Return choices ready to be output in the template. + + `changelist` is the ChangeList to be displayed. + """ + raise NotImplementedError('subclasses of ListFilter must provide a choices() method') + + def queryset(self, request, queryset): + """ + Return the filtered queryset. + """ + raise NotImplementedError('subclasses of ListFilter must provide a queryset() method') + + def expected_parameters(self): + """ + Return the list of parameter names that are expected from the + request's query string and that will be used by this filter. + """ + raise NotImplementedError('subclasses of ListFilter must provide an expected_parameters() method') + + +class SimpleListFilter(ListFilter): + # The parameter that should be used in the query string for that filter. + parameter_name = None + + def __init__(self, request, params, model, model_admin): + super().__init__(request, params, model, model_admin) + if self.parameter_name is None: + raise ImproperlyConfigured( + "The list filter '%s' does not specify a 'parameter_name'." + % self.__class__.__name__ + ) + if self.parameter_name in params: + value = params.pop(self.parameter_name) + self.used_parameters[self.parameter_name] = value + lookup_choices = self.lookups(request, model_admin) + if lookup_choices is None: + lookup_choices = () + self.lookup_choices = list(lookup_choices) + + def has_output(self): + return len(self.lookup_choices) > 0 + + def value(self): + """ + Return the value (in string format) provided in the request's + query string for this filter, if any, or None if the value wasn't + provided. + """ + return self.used_parameters.get(self.parameter_name) + + def lookups(self, request, model_admin): + """ + Must be overridden to return a list of tuples (value, verbose value) + """ + raise NotImplementedError( + 'The SimpleListFilter.lookups() method must be overridden to ' + 'return a list of tuples (value, verbose value).' + ) + + def expected_parameters(self): + return [self.parameter_name] + + def choices(self, changelist): + yield { + 'selected': self.value() is None, + 'query_string': changelist.get_query_string(remove=[self.parameter_name]), + 'display': _('All'), + } + for lookup, title in self.lookup_choices: + yield { + 'selected': self.value() == str(lookup), + 'query_string': changelist.get_query_string({self.parameter_name: lookup}), + 'display': title, + } + + +class FieldListFilter(ListFilter): + _field_list_filters = [] + _take_priority_index = 0 + + def __init__(self, field, request, params, model, model_admin, field_path): + self.field = field + self.field_path = field_path + self.title = getattr(field, 'verbose_name', field_path) + super().__init__(request, params, model, model_admin) + for p in self.expected_parameters(): + if p in params: + value = params.pop(p) + self.used_parameters[p] = prepare_lookup_value(p, value) + + def has_output(self): + return True + + def queryset(self, request, queryset): + try: + return queryset.filter(**self.used_parameters) + except (ValueError, ValidationError) as e: + # Fields may raise a ValueError or ValidationError when converting + # the parameters to the correct type. + raise IncorrectLookupParameters(e) + + @classmethod + def register(cls, test, list_filter_class, take_priority=False): + if take_priority: + # This is to allow overriding the default filters for certain types + # of fields with some custom filters. The first found in the list + # is used in priority. + cls._field_list_filters.insert( + cls._take_priority_index, (test, list_filter_class)) + cls._take_priority_index += 1 + else: + cls._field_list_filters.append((test, list_filter_class)) + + @classmethod + def create(cls, field, request, params, model, model_admin, field_path): + for test, list_filter_class in cls._field_list_filters: + if test(field): + return list_filter_class(field, request, params, model, model_admin, field_path=field_path) + + +class RelatedFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + other_model = get_model_from_relation(field) + self.lookup_kwarg = '%s__%s__exact' % (field_path, field.target_field.name) + self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_val = params.get(self.lookup_kwarg) + self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + super().__init__(field, request, params, model, model_admin, field_path) + self.lookup_choices = self.field_choices(field, request, model_admin) + if hasattr(field, 'verbose_name'): + self.lookup_title = field.verbose_name + else: + self.lookup_title = other_model._meta.verbose_name + self.title = self.lookup_title + self.empty_value_display = model_admin.get_empty_value_display() + + @property + def include_empty_choice(self): + """ + Return True if a "(None)" choice should be included, which filters + out everything except empty relationships. + """ + return self.field.null or (self.field.is_relation and self.field.many_to_many) + + def has_output(self): + if self.include_empty_choice: + extra = 1 + else: + extra = 0 + return len(self.lookup_choices) + extra > 1 + + def expected_parameters(self): + return [self.lookup_kwarg, self.lookup_kwarg_isnull] + + def field_choices(self, field, request, model_admin): + ordering = () + related_admin = model_admin.admin_site._registry.get(field.remote_field.model) + if related_admin is not None: + ordering = related_admin.get_ordering(request) + return field.get_choices(include_blank=False, ordering=ordering) + + def choices(self, changelist): + yield { + 'selected': self.lookup_val is None and not self.lookup_val_isnull, + 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), + 'display': _('All'), + } + for pk_val, val in self.lookup_choices: + yield { + 'selected': self.lookup_val == str(pk_val), + 'query_string': changelist.get_query_string({self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull]), + 'display': val, + } + if self.include_empty_choice: + yield { + 'selected': bool(self.lookup_val_isnull), + 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), + 'display': self.empty_value_display, + } + + +FieldListFilter.register(lambda f: f.remote_field, RelatedFieldListFilter) + + +class BooleanFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + self.lookup_kwarg = '%s__exact' % field_path + self.lookup_kwarg2 = '%s__isnull' % field_path + self.lookup_val = params.get(self.lookup_kwarg) + self.lookup_val2 = params.get(self.lookup_kwarg2) + super().__init__(field, request, params, model, model_admin, field_path) + if (self.used_parameters and self.lookup_kwarg in self.used_parameters and + self.used_parameters[self.lookup_kwarg] in ('1', '0')): + self.used_parameters[self.lookup_kwarg] = bool(int(self.used_parameters[self.lookup_kwarg])) + + def expected_parameters(self): + return [self.lookup_kwarg, self.lookup_kwarg2] + + def choices(self, changelist): + for lookup, title in ( + (None, _('All')), + ('1', _('Yes')), + ('0', _('No'))): + yield { + 'selected': self.lookup_val == lookup and not self.lookup_val2, + 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}, [self.lookup_kwarg2]), + 'display': title, + } + if self.field.null: + yield { + 'selected': self.lookup_val2 == 'True', + 'query_string': changelist.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), + 'display': _('Unknown'), + } + + +FieldListFilter.register(lambda f: isinstance(f, models.BooleanField), BooleanFieldListFilter) + + +class ChoicesFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + self.lookup_kwarg = '%s__exact' % field_path + self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_val = params.get(self.lookup_kwarg) + self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + super().__init__(field, request, params, model, model_admin, field_path) + + def expected_parameters(self): + return [self.lookup_kwarg, self.lookup_kwarg_isnull] + + def choices(self, changelist): + yield { + 'selected': self.lookup_val is None, + 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), + 'display': _('All') + } + none_title = '' + for lookup, title in self.field.flatchoices: + if lookup is None: + none_title = title + continue + yield { + 'selected': str(lookup) == self.lookup_val, + 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}, [self.lookup_kwarg_isnull]), + 'display': title, + } + if none_title: + yield { + 'selected': bool(self.lookup_val_isnull), + 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), + 'display': none_title, + } + + +FieldListFilter.register(lambda f: bool(f.choices), ChoicesFieldListFilter) + + +class DateFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + self.field_generic = '%s__' % field_path + self.date_params = {k: v for k, v in params.items() if k.startswith(self.field_generic)} + + now = timezone.now() + # When time zone support is enabled, convert "now" to the user's time + # zone so Django's definition of "Today" matches what the user expects. + if timezone.is_aware(now): + now = timezone.localtime(now) + + if isinstance(field, models.DateTimeField): + today = now.replace(hour=0, minute=0, second=0, microsecond=0) + else: # field is a models.DateField + today = now.date() + tomorrow = today + datetime.timedelta(days=1) + if today.month == 12: + next_month = today.replace(year=today.year + 1, month=1, day=1) + else: + next_month = today.replace(month=today.month + 1, day=1) + next_year = today.replace(year=today.year + 1, month=1, day=1) + + self.lookup_kwarg_since = '%s__gte' % field_path + self.lookup_kwarg_until = '%s__lt' % field_path + self.links = ( + (_('Any date'), {}), + (_('Today'), { + self.lookup_kwarg_since: str(today), + self.lookup_kwarg_until: str(tomorrow), + }), + (_('Past 7 days'), { + self.lookup_kwarg_since: str(today - datetime.timedelta(days=7)), + self.lookup_kwarg_until: str(tomorrow), + }), + (_('This month'), { + self.lookup_kwarg_since: str(today.replace(day=1)), + self.lookup_kwarg_until: str(next_month), + }), + (_('This year'), { + self.lookup_kwarg_since: str(today.replace(month=1, day=1)), + self.lookup_kwarg_until: str(next_year), + }), + ) + if field.null: + self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.links += ( + (_('No date'), {self.field_generic + 'isnull': 'True'}), + (_('Has date'), {self.field_generic + 'isnull': 'False'}), + ) + super().__init__(field, request, params, model, model_admin, field_path) + + def expected_parameters(self): + params = [self.lookup_kwarg_since, self.lookup_kwarg_until] + if self.field.null: + params.append(self.lookup_kwarg_isnull) + return params + + def choices(self, changelist): + for title, param_dict in self.links: + yield { + 'selected': self.date_params == param_dict, + 'query_string': changelist.get_query_string(param_dict, [self.field_generic]), + 'display': title, + } + + +FieldListFilter.register( + lambda f: isinstance(f, models.DateField), DateFieldListFilter) + + +# This should be registered last, because it's a last resort. For example, +# if a field is eligible to use the BooleanFieldListFilter, that'd be much +# more appropriate, and the AllValuesFieldListFilter won't get used for it. +class AllValuesFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + self.lookup_kwarg = field_path + self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_val = params.get(self.lookup_kwarg) + self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + self.empty_value_display = model_admin.get_empty_value_display() + parent_model, reverse_path = reverse_field_path(model, field_path) + # Obey parent ModelAdmin queryset when deciding which options to show + if model == parent_model: + queryset = model_admin.get_queryset(request) + else: + queryset = parent_model._default_manager.all() + self.lookup_choices = queryset.distinct().order_by(field.name).values_list(field.name, flat=True) + super().__init__(field, request, params, model, model_admin, field_path) + + def expected_parameters(self): + return [self.lookup_kwarg, self.lookup_kwarg_isnull] + + def choices(self, changelist): + yield { + 'selected': self.lookup_val is None and self.lookup_val_isnull is None, + 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), + 'display': _('All'), + } + include_none = False + for val in self.lookup_choices: + if val is None: + include_none = True + continue + val = str(val) + yield { + 'selected': self.lookup_val == val, + 'query_string': changelist.get_query_string({self.lookup_kwarg: val}, [self.lookup_kwarg_isnull]), + 'display': val, + } + if include_none: + yield { + 'selected': bool(self.lookup_val_isnull), + 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), + 'display': self.empty_value_display, + } + + +FieldListFilter.register(lambda f: True, AllValuesFieldListFilter) + + +class RelatedOnlyFieldListFilter(RelatedFieldListFilter): + def field_choices(self, field, request, model_admin): + pk_qs = model_admin.get_queryset(request).distinct().values_list('%s__pk' % self.field_path, flat=True) + return field.get_choices(include_blank=False, limit_choices_to={'pk__in': pk_qs}) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/helpers.py b/venv/lib/python3.7/site-packages/django/contrib/admin/helpers.py new file mode 100644 index 0000000..0c0b3a4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/helpers.py @@ -0,0 +1,402 @@ +import json + +from django import forms +from django.conf import settings +from django.contrib.admin.utils import ( + display_for_field, flatten_fieldsets, help_text_for_field, label_for_field, + lookup_field, +) +from django.core.exceptions import ObjectDoesNotExist +from django.db.models.fields.related import ManyToManyRel +from django.forms.utils import flatatt +from django.template.defaultfilters import capfirst, linebreaksbr +from django.utils.html import conditional_escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _ + +ACTION_CHECKBOX_NAME = '_selected_action' + + +class ActionForm(forms.Form): + action = forms.ChoiceField(label=_('Action:')) + select_across = forms.BooleanField( + label='', + required=False, + initial=0, + widget=forms.HiddenInput({'class': 'select-across'}), + ) + + +checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False) + + +class AdminForm: + def __init__(self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None): + self.form, self.fieldsets = form, fieldsets + self.prepopulated_fields = [{ + 'field': form[field_name], + 'dependencies': [form[f] for f in dependencies] + } for field_name, dependencies in prepopulated_fields.items()] + self.model_admin = model_admin + if readonly_fields is None: + readonly_fields = () + self.readonly_fields = readonly_fields + + def __iter__(self): + for name, options in self.fieldsets: + yield Fieldset( + self.form, name, + readonly_fields=self.readonly_fields, + model_admin=self.model_admin, + **options + ) + + @property + def errors(self): + return self.form.errors + + @property + def non_field_errors(self): + return self.form.non_field_errors + + @property + def media(self): + media = self.form.media + for fs in self: + media = media + fs.media + return media + + +class Fieldset: + def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(), + description=None, model_admin=None): + self.form = form + self.name, self.fields = name, fields + self.classes = ' '.join(classes) + self.description = description + self.model_admin = model_admin + self.readonly_fields = readonly_fields + + @property + def media(self): + if 'collapse' in self.classes: + extra = '' if settings.DEBUG else '.min' + return forms.Media(js=['admin/js/collapse%s.js' % extra]) + return forms.Media() + + def __iter__(self): + for field in self.fields: + yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin) + + +class Fieldline: + def __init__(self, form, field, readonly_fields=None, model_admin=None): + self.form = form # A django.forms.Form instance + if not hasattr(field, "__iter__") or isinstance(field, str): + self.fields = [field] + else: + self.fields = field + self.has_visible_field = not all( + field in self.form.fields and self.form.fields[field].widget.is_hidden + for field in self.fields + ) + self.model_admin = model_admin + if readonly_fields is None: + readonly_fields = () + self.readonly_fields = readonly_fields + + def __iter__(self): + for i, field in enumerate(self.fields): + if field in self.readonly_fields: + yield AdminReadonlyField(self.form, field, is_first=(i == 0), model_admin=self.model_admin) + else: + yield AdminField(self.form, field, is_first=(i == 0)) + + def errors(self): + return mark_safe( + '\n'.join( + self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields + ).strip('\n') + ) + + +class AdminField: + def __init__(self, form, field, is_first): + self.field = form[field] # A django.forms.BoundField instance + self.is_first = is_first # Whether this field is first on the line + self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput) + self.is_readonly = False + + def label_tag(self): + classes = [] + contents = conditional_escape(self.field.label) + if self.is_checkbox: + classes.append('vCheckboxLabel') + + if self.field.field.required: + classes.append('required') + if not self.is_first: + classes.append('inline') + attrs = {'class': ' '.join(classes)} if classes else {} + # checkboxes should not have a label suffix as the checkbox appears + # to the left of the label. + return self.field.label_tag( + contents=mark_safe(contents), attrs=attrs, + label_suffix='' if self.is_checkbox else None, + ) + + def errors(self): + return mark_safe(self.field.errors.as_ul()) + + +class AdminReadonlyField: + def __init__(self, form, field, is_first, model_admin=None): + # Make self.field look a little bit like a field. This means that + # {{ field.name }} must be a useful class name to identify the field. + # For convenience, store other field-related data here too. + if callable(field): + class_name = field.__name__ if field.__name__ != '' else '' + else: + class_name = field + + if form._meta.labels and class_name in form._meta.labels: + label = form._meta.labels[class_name] + else: + label = label_for_field(field, form._meta.model, model_admin, form=form) + + if form._meta.help_texts and class_name in form._meta.help_texts: + help_text = form._meta.help_texts[class_name] + else: + help_text = help_text_for_field(class_name, form._meta.model) + + self.field = { + 'name': class_name, + 'label': label, + 'help_text': help_text, + 'field': field, + } + self.form = form + self.model_admin = model_admin + self.is_first = is_first + self.is_checkbox = False + self.is_readonly = True + self.empty_value_display = model_admin.get_empty_value_display() + + def label_tag(self): + attrs = {} + if not self.is_first: + attrs["class"] = "inline" + label = self.field['label'] + return format_html('{}:', flatatt(attrs), capfirst(label)) + + def contents(self): + from django.contrib.admin.templatetags.admin_list import _boolean_icon + field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin + try: + f, attr, value = lookup_field(field, obj, model_admin) + except (AttributeError, ValueError, ObjectDoesNotExist): + result_repr = self.empty_value_display + else: + if field in self.form.fields: + widget = self.form[field].field.widget + # This isn't elegant but suffices for contrib.auth's + # ReadOnlyPasswordHashWidget. + if getattr(widget, 'read_only', False): + return widget.render(field, value) + if f is None: + if getattr(attr, 'boolean', False): + result_repr = _boolean_icon(value) + else: + if hasattr(value, "__html__"): + result_repr = value + else: + result_repr = linebreaksbr(value) + else: + if isinstance(f.remote_field, ManyToManyRel) and value is not None: + result_repr = ", ".join(map(str, value.all())) + else: + result_repr = display_for_field(value, f, self.empty_value_display) + result_repr = linebreaksbr(result_repr) + return conditional_escape(result_repr) + + +class InlineAdminFormSet: + """ + A wrapper around an inline formset for use in the admin system. + """ + def __init__(self, inline, formset, fieldsets, prepopulated_fields=None, + readonly_fields=None, model_admin=None, has_add_permission=True, + has_change_permission=True, has_delete_permission=True, + has_view_permission=True): + self.opts = inline + self.formset = formset + self.fieldsets = fieldsets + self.model_admin = model_admin + if readonly_fields is None: + readonly_fields = () + self.readonly_fields = readonly_fields + if prepopulated_fields is None: + prepopulated_fields = {} + self.prepopulated_fields = prepopulated_fields + self.classes = ' '.join(inline.classes) if inline.classes else '' + self.has_add_permission = has_add_permission + self.has_change_permission = has_change_permission + self.has_delete_permission = has_delete_permission + self.has_view_permission = has_view_permission + + def __iter__(self): + if self.has_change_permission: + readonly_fields_for_editing = self.readonly_fields + else: + readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets(self.fieldsets) + + for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()): + view_on_site_url = self.opts.get_view_on_site_url(original) + yield InlineAdminForm( + self.formset, form, self.fieldsets, self.prepopulated_fields, + original, readonly_fields_for_editing, model_admin=self.opts, + view_on_site_url=view_on_site_url, + ) + for form in self.formset.extra_forms: + yield InlineAdminForm( + self.formset, form, self.fieldsets, self.prepopulated_fields, + None, self.readonly_fields, model_admin=self.opts, + ) + if self.has_add_permission: + yield InlineAdminForm( + self.formset, self.formset.empty_form, + self.fieldsets, self.prepopulated_fields, None, + self.readonly_fields, model_admin=self.opts, + ) + + def fields(self): + fk = getattr(self.formset, "fk", None) + empty_form = self.formset.empty_form + meta_labels = empty_form._meta.labels or {} + meta_help_texts = empty_form._meta.help_texts or {} + for i, field_name in enumerate(flatten_fieldsets(self.fieldsets)): + if fk and fk.name == field_name: + continue + if not self.has_change_permission or field_name in self.readonly_fields: + yield { + 'name': field_name, + 'label': meta_labels.get(field_name) or label_for_field(field_name, self.opts.model, self.opts), + 'widget': {'is_hidden': False}, + 'required': False, + 'help_text': meta_help_texts.get(field_name) or help_text_for_field(field_name, self.opts.model), + } + else: + form_field = empty_form.fields[field_name] + label = form_field.label + if label is None: + label = label_for_field(field_name, self.opts.model, self.opts) + yield { + 'name': field_name, + 'label': label, + 'widget': form_field.widget, + 'required': form_field.required, + 'help_text': form_field.help_text, + } + + def inline_formset_data(self): + verbose_name = self.opts.verbose_name + return json.dumps({ + 'name': '#%s' % self.formset.prefix, + 'options': { + 'prefix': self.formset.prefix, + 'addText': gettext('Add another %(verbose_name)s') % { + 'verbose_name': capfirst(verbose_name), + }, + 'deleteText': gettext('Remove'), + } + }) + + @property + def forms(self): + return self.formset.forms + + @property + def non_form_errors(self): + return self.formset.non_form_errors + + @property + def media(self): + media = self.opts.media + self.formset.media + for fs in self: + media = media + fs.media + return media + + +class InlineAdminForm(AdminForm): + """ + A wrapper around an inline form for use in the admin system. + """ + def __init__(self, formset, form, fieldsets, prepopulated_fields, original, + readonly_fields=None, model_admin=None, view_on_site_url=None): + self.formset = formset + self.model_admin = model_admin + self.original = original + self.show_url = original and view_on_site_url is not None + self.absolute_url = view_on_site_url + super().__init__(form, fieldsets, prepopulated_fields, readonly_fields, model_admin) + + def __iter__(self): + for name, options in self.fieldsets: + yield InlineFieldset( + self.formset, self.form, name, self.readonly_fields, + model_admin=self.model_admin, **options + ) + + def needs_explicit_pk_field(self): + return ( + # Auto fields are editable, so check for auto or non-editable pk. + self.form._meta.model._meta.auto_field or not self.form._meta.model._meta.pk.editable or + # Also search any parents for an auto field. (The pk info is + # propagated to child models so that does not need to be checked + # in parents.) + any(parent._meta.auto_field or not parent._meta.model._meta.pk.editable + for parent in self.form._meta.model._meta.get_parent_list()) + ) + + def pk_field(self): + return AdminField(self.form, self.formset._pk_field.name, False) + + def fk_field(self): + fk = getattr(self.formset, "fk", None) + if fk: + return AdminField(self.form, fk.name, False) + else: + return "" + + def deletion_field(self): + from django.forms.formsets import DELETION_FIELD_NAME + return AdminField(self.form, DELETION_FIELD_NAME, False) + + def ordering_field(self): + from django.forms.formsets import ORDERING_FIELD_NAME + return AdminField(self.form, ORDERING_FIELD_NAME, False) + + +class InlineFieldset(Fieldset): + def __init__(self, formset, *args, **kwargs): + self.formset = formset + super().__init__(*args, **kwargs) + + def __iter__(self): + fk = getattr(self.formset, "fk", None) + for field in self.fields: + if not fk or fk.name != field: + yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin) + + +class AdminErrorList(forms.utils.ErrorList): + """Store errors for the form/formsets in an add/change view.""" + def __init__(self, form, inline_formsets): + super().__init__() + + if form.is_bound: + self.extend(form.errors.values()) + for inline_formset in inline_formsets: + self.extend(inline_formset.non_form_errors()) + for errors_in_inline_form in inline_formset.errors: + self.extend(errors_in_inline_form.values()) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0e5afe0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..577951f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po @@ -0,0 +1,227 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bashar Al-Abdulhadi, 2015 +# Bashar Al-Abdulhadi, 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s المتوفرة" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " +"الضغط على سهم الـ\"اختيار\" بين الصندوقين." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." + +msgid "Filter" +msgstr "انتقاء" + +msgid "Choose all" +msgstr "اختر الكل" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "اضغط لاختيار جميع %s جملة واحدة." + +msgid "Choose" +msgstr "اختيار" + +msgid "Remove" +msgstr "احذف" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s المُختارة" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " +"على سهم الـ\"إزالة\" بين الصندوقين." + +msgid "Remove all" +msgstr "إزالة الكل" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "لا شي محدد" +msgstr[1] "%(sel)s من %(cnt)s محدد" +msgstr[2] "%(sel)s من %(cnt)s محدد" +msgstr[3] "%(sel)s من %(cnt)s محددة" +msgstr[4] "%(sel)s من %(cnt)s محدد" +msgstr[5] "%(sel)s من %(cnt)s محدد" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " +"فسوف تخسر تعديلاتك." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة " +"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." + +msgid "Now" +msgstr "الآن" + +msgid "Choose a Time" +msgstr "إختر وقت" + +msgid "Choose a time" +msgstr "اختر وقتاً" + +msgid "Midnight" +msgstr "منتصف الليل" + +msgid "6 a.m." +msgstr "6 ص." + +msgid "Noon" +msgstr "الظهر" + +msgid "6 p.m." +msgstr "6 مساءً" + +msgid "Cancel" +msgstr "ألغ" + +msgid "Today" +msgstr "اليوم" + +msgid "Choose a Date" +msgstr "إختر تاريخ " + +msgid "Yesterday" +msgstr "أمس" + +msgid "Tomorrow" +msgstr "غداً" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "أظهر" + +msgid "Hide" +msgstr "اخف" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po new file mode 100644 index 0000000..437b080 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/django.po @@ -0,0 +1,636 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ḷḷumex03 , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 19:51+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Asturian (http://www.transifex.com/django/django/language/" +"ast/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "desanciáu con ésitu %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Nun pue desaniciase %(name)s" + +msgid "Are you sure?" +msgstr "¿De xuru?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Too" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "Non" + +msgid "Unknown" +msgstr "Desconocíu" + +msgid "Any date" +msgstr "Cualaquier data" + +msgid "Today" +msgstr "Güei" + +msgid "Past 7 days" +msgstr "" + +msgid "This month" +msgstr "Esti mes" + +msgid "This year" +msgstr "Esi añu" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "Aición:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "" + +msgid "Remove" +msgstr "" + +msgid "action time" +msgstr "" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "" + +msgid "action flag" +msgstr "" + +msgid "change message" +msgstr "" + +msgid "log entry" +msgstr "" + +msgid "log entries" +msgstr "" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Amestáu \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +msgid "LogEntry Object" +msgstr "" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "y" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "" + +msgid "None" +msgstr "" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Los oxetos tienen d'usase pa faer aiciones con ellos. Nun se camudó dengún " +"oxetu." + +msgid "No action selected." +msgstr "Nun s'esbilló denguna aición." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Amestar %s" + +#, python-format +msgid "Change %s" +msgstr "" + +msgid "Database error" +msgstr "" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Esbillaos 0 de %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "" + +msgid "Django administration" +msgstr "" + +msgid "Site administration" +msgstr "" + +msgid "Log in" +msgstr "Aniciar sesión" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Nun s'alcontró la páxina" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Sentímoslo, pero nun s'alcuentra la páxina solicitada." + +msgid "Home" +msgstr "" + +msgid "Server error" +msgstr "" + +msgid "Server error (500)" +msgstr "" + +msgid "Server Error (500)" +msgstr "" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Hebo un erru. Repotóse al sitiu d'alministradores per corréu y debería " +"d'iguase en pocu tiempu. Gracies pola to paciencia." + +msgid "Run the selected action" +msgstr "Executar l'aición esbillada" + +msgid "Go" +msgstr "Dir" + +msgid "Click here to select the objects across all pages" +msgstr "" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Esbillar too %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Llimpiar esbilla" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +msgid "Enter a username and password." +msgstr "" + +msgid "Change password" +msgstr "" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +msgid "Welcome," +msgstr "Bienllegáu/ada," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Log out" +msgstr "" + +#, python-format +msgid "Add %(name)s" +msgstr "" + +msgid "History" +msgstr "" + +msgid "View on site" +msgstr "" + +msgid "Filter" +msgstr "" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "" + +msgid "Delete" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +msgid "Change" +msgstr "" + +msgid "Delete?" +msgstr "" + +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "You don't have permission to edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "" + +msgid "Unknown content" +msgstr "" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "" + +msgid "Date/time" +msgstr "" + +msgid "User" +msgstr "" + +msgid "Action" +msgstr "" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "" + +msgid "Save as new" +msgstr "" + +msgid "Save and add another" +msgstr "" + +msgid "Save and continue editing" +msgstr "" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +msgid "Log in again" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Your password was changed." +msgstr "" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" + +msgid "Change my password" +msgstr "" + +msgid "Password reset" +msgstr "" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +msgid "Password reset confirmation" +msgstr "" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +msgid "New password:" +msgstr "" + +msgid "Confirm password:" +msgstr "" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "" + +msgid "Your username, in case you've forgotten:" +msgstr "" + +msgid "Thanks for using our site!" +msgstr "" + +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "" + +msgid "All dates" +msgstr "" + +#, python-format +msgid "Select %s" +msgstr "" + +#, python-format +msgid "Select %s to change" +msgstr "" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "" + +msgid "Currently:" +msgstr "Anguaño:" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..53705c7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ast/LC_MESSAGES/djangojs.po @@ -0,0 +1,211 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ḷḷumex03 , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-20 02:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Asturian (http://www.transifex.com/django/django/language/" +"ast/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Disponible %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "Filtrar" + +msgid "Choose all" +msgstr "Escoyer too" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Primi pa escoyer too %s d'una vegada" + +msgid "Choose" +msgstr "Escoyer" + +msgid "Remove" +msgstr "Desaniciar" + +#, javascript-format +msgid "Chosen %s" +msgstr "Escoyíu %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "Desaniciar too" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Primi pa desaniciar tolo escoyío %s d'una vegada" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s de %(cnt)s esbilláu" +msgstr[1] "%(sel)s de %(cnt)s esbillaos" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Esbillesti una aición, pero entá nun guardesti les tos camudancies nos " +"campos individuales. Por favor, primi Aceutar pa guardar. Necesitarás " +"executar de nueves la aición" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Esbillesti una aición, y nun fixesti camudancia dala nos campos " +"individuales. Quiciabes teas guetando'l botón Dir en cuantes del botón " +"Guardar." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "Agora" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Escueyi una hora" + +msgid "Midnight" +msgstr "Media nueche" + +msgid "6 a.m." +msgstr "" + +msgid "Noon" +msgstr "Meudía" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Encaboxar" + +msgid "Today" +msgstr "Güei" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Ayeri" + +msgid "Tomorrow" +msgstr "Mañana" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Amosar" + +msgid "Hide" +msgstr "Anubrir" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1322881 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..1bedd48 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,716 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emin Mastizada , 2018 +# Emin Mastizada , 2016 +# Konul Allahverdiyeva , 2016 +# Zulfugar Ismayilzadeh , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-21 14:16-0300\n" +"PO-Revision-Date: 2018-09-09 12:44+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s uğurla silindi." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s silinmir" + +msgid "Are you sure?" +msgstr "Əminsiniz?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Seçilmiş %(verbose_name_plural)s-ləri sil" + +msgid "Administration" +msgstr "Administrasiya" + +msgid "All" +msgstr "Hamısı" + +msgid "Yes" +msgstr "Hə" + +msgid "No" +msgstr "Yox" + +msgid "Unknown" +msgstr "Bilinmir" + +msgid "Any date" +msgstr "İstənilən tarix" + +msgid "Today" +msgstr "Bu gün" + +msgid "Past 7 days" +msgstr "Son 7 gündə" + +msgid "This month" +msgstr "Bu ay" + +msgid "This year" +msgstr "Bu il" + +msgid "No date" +msgstr "Tarixi yoxdur" + +msgid "Has date" +msgstr "Tarixi mövcuddur" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Lütfən, istifadəçi hesabı üçün doğru %(username)s və parol daxil olun. " +"Nəzərə alın ki, hər iki sahə böyük/kiçik hərflərə həssasdırlar." + +msgid "Action:" +msgstr "Əməliyyat:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Daha bir %(verbose_name)s əlavə et" + +msgid "Remove" +msgstr "Yığışdır" + +msgid "Addition" +msgstr "Əlavə" + +msgid "Change" +msgstr "Dəyiş" + +msgid "Deletion" +msgstr "Silmə" + +msgid "action time" +msgstr "əməliyyat vaxtı" + +msgid "user" +msgstr "istifadəçi" + +msgid "content type" +msgstr "məzmun növü" + +msgid "object id" +msgstr "obyekt id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "obyekt repr" + +msgid "action flag" +msgstr "bayraq" + +msgid "change message" +msgstr "dəyişmə mesajı" + +msgid "log entry" +msgstr "loq yazısı" + +msgid "log entries" +msgstr "loq yazıları" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" əlavə olundu." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" - %(changes)s dəyişiklikləri qeydə alındı." + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" silindi." + +msgid "LogEntry Object" +msgstr "LogEntry obyekti" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" əlavə edildi." + +msgid "Added." +msgstr "Əlavə edildi." + +msgid "and" +msgstr "və" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{name} \"{object}\" üçün {fields} dəyişdirildi." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} dəyişdirildi." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "{name} \"{object}\" silindi." + +msgid "No fields changed." +msgstr "Heç bir sahə dəyişmədi." + +msgid "None" +msgstr "Heç nə" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Birdən çox seçmək üçün \"Control\" və ya Mac üçün \"Command\" düyməsini " +"basılı tutun." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" uğurla əlavə edildi." + +msgid "You may edit it again below." +msgstr "Bunu aşağıda təkrar redaktə edə bilərsiz." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" uğurla əlavə edildi. Aşağıdan başqa bir {name} əlavə edə " +"bilərsiz." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" uğurla dəyişdirildi. Təkrar aşağıdan dəyişdirə bilərsiz." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" uğurla əlavə edildi. Bunu təkrar aşağıdan dəyişdirə " +"bilərsiz." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" uğurla dəyişdirildi. Aşağıdan başqa bir {name} əlavə edə " +"bilərsiz." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" uğurla dəyişdirildi." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Biz elementlər üzərində nəsə əməliyyat aparmaq üçün siz onları seçməlisiniz. " +"Heç bir element dəyişmədi." + +msgid "No action selected." +msgstr "Heç bir əməliyyat seçilmədi." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" uğurla silindi." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "\"%(key)s\" id nömrəli %(name)s mövcud deyil. Çox güman ki, silinib?" + +#, python-format +msgid "Add %s" +msgstr "%s əlavə et" + +#, python-format +msgid "Change %s" +msgstr "%s dəyiş" + +#, python-format +msgid "View %s" +msgstr "%s gör" + +msgid "Database error" +msgstr "Bazada xəta" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s uğurlu dəyişdirildi." +msgstr[1] "%(count)s %(name)s uğurlu dəyişdirildi." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seçili" +msgstr[1] "Bütün %(total_count)s seçili" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s-dan 0 seçilib" + +#, python-format +msgid "Change history: %s" +msgstr "Dəyişmə tarixi: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s %(instance)s silmə əlaqəli qorunmalı obyektləri silməyi tələb " +"edir: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django sayt administratoru" + +msgid "Django administration" +msgstr "Django administrasiya" + +msgid "Site administration" +msgstr "Sayt administrasiyası" + +msgid "Log in" +msgstr "Daxil ol" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s administrasiyası" + +msgid "Page not found" +msgstr "Səhifə tapılmadı" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Üzrlər, amma soruşduğunuz sayt tapılmadı." + +msgid "Home" +msgstr "Ev" + +msgid "Server error" +msgstr "Serverdə xəta" + +msgid "Server error (500)" +msgstr "Serverdə xəta (500)" + +msgid "Server Error (500)" +msgstr "Serverdə xəta (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Xəta baş verdi. Sayt administratorlarına e-poçt göndərildi və onlar xəta ilə " +"tezliklə məşğul olacaqlar. Səbrli olun." + +msgid "Run the selected action" +msgstr "Seçdiyim əməliyyatı yerinə yetir" + +msgid "Go" +msgstr "Getdik" + +msgid "Click here to select the objects across all pages" +msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura tıqlayın" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Bütün %(total_count)s sayda %(module_name)s seç" + +msgid "Clear selection" +msgstr "Seçimi təmizlə" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Əvvəlcə istifadəçi adını və parolu daxil edin. Ondan sonra daha çox " +"istifadəçi imkanlarını redaktə edə biləcəksiniz." + +msgid "Enter a username and password." +msgstr "İstifadəçi adını və parolu daxil edin." + +msgid "Change password" +msgstr "Parolu dəyiş" + +msgid "Please correct the error below." +msgstr "Lütfən aşağıdakı xətanı düzəldin." + +msgid "Please correct the errors below." +msgstr "Lütfən aşağıdakı səhvləri düzəldin." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s üçün yeni parol daxil edin." + +msgid "Welcome," +msgstr "Xoş gördük," + +msgid "View site" +msgstr "Saytı ziyarət et" + +msgid "Documentation" +msgstr "Sənədləşdirmə" + +msgid "Log out" +msgstr "Çıx" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s əlavə et" + +msgid "History" +msgstr "Tarix" + +msgid "View on site" +msgstr "Saytda göstər" + +msgid "Filter" +msgstr "Süzgəc" + +msgid "Remove from sorting" +msgstr "Sıralamadan çıxar" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sıralama prioriteti: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Sıralamanı çevir" + +msgid "Delete" +msgstr "Sil" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s \"%(escaped_object)s\" obyektini sildikdə onun bağlı olduğu " +"obyektlər də silinməlidir. Ancaq sizin hesabın aşağıdakı tip obyektləri " +"silməyə səlahiyyəti çatmır:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s \"%(escaped_object)s\" obyektini silmək üçün aşağıdakı " +"qorunan obyektlər də silinməlidir:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"%(object_name)s \"%(escaped_object)s\" obyektini silməkdə əminsiniz? Ona " +"bağlı olan aşağıdakı obyektlər də silinəcək:" + +msgid "Objects" +msgstr "Obyektlər" + +msgid "Yes, I'm sure" +msgstr "Hə, əminəm" + +msgid "No, take me back" +msgstr "Xeyr, məni geri götür" + +msgid "Delete multiple objects" +msgstr "Bir neçə obyekt sil" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"%(objects_name)s obyektini silmək üçün ona bağlı obyektlər də silinməlidir. " +"Ancaq sizin hesabınızın aşağıdakı tip obyektləri silmək səlahiyyətinə malik " +"deyil:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"%(objects_name)s obyektini silmək üçün aşağıdakı qorunan obyektlər də " +"silinməlidir:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Seçdiyiniz %(objects_name)s obyektini silməkdə əminsiniz? Aşağıdakı bütün " +"obyektlər və ona bağlı digər obyektlər də silinəcək:" + +msgid "View" +msgstr "Gör" + +msgid "Delete?" +msgstr "Silək?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s görə " + +msgid "Summary" +msgstr "İcmal" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s proqramındakı modellər" + +msgid "Add" +msgstr "Əlavə et" + +msgid "You don't have permission to view or edit anything." +msgstr "Heç nəyi görmə və ya redaktə etmə icazəniz yoxdur." + +msgid "Recent actions" +msgstr "Son əməliyyatlar" + +msgid "My actions" +msgstr "Mənim əməliyyatlarım" + +msgid "None available" +msgstr "Heç nə yoxdur" + +msgid "Unknown content" +msgstr "Naməlum" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Bazanın qurulması ilə nəsə problem var. Lazımi cədvəllərin bazada " +"yaradıldığını və uyğun istifadəçinin bazadan oxuya bildiyini yoxlayın." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"%(username)s olaraq daxil olmusunuz, amma bu səhifəyə icazəniz yoxdur. Başqa " +"bir hesaba daxil olmaq istərdiniz?" + +msgid "Forgotten your password or username?" +msgstr "Parol və ya istifadəçi adını unutmusan?" + +msgid "Date/time" +msgstr "Tarix/vaxt" + +msgid "User" +msgstr "İstifadəçi" + +msgid "Action" +msgstr "Əməliyyat" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Bu obyektin dəyişməsinə aid tarix mövcud deyil. Yəqin ki, o, bu admin saytı " +"vasitəsilə yaradılmayıb." + +msgid "Show all" +msgstr "Hamısını göstər" + +msgid "Save" +msgstr "Yadda saxla" + +msgid "Popup closing..." +msgstr "Qəfl pəncərə qapatılır..." + +#, python-format +msgid "Change selected %(model)s" +msgstr "Seçilmiş %(model)s dəyişdir" + +#, python-format +msgid "View selected %(model)s" +msgstr "Seçilən %(model)s gör" + +#, python-format +msgid "Add another %(model)s" +msgstr "Başqa %(model)s əlavə et" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Seçilmiş %(model)s sil" + +msgid "Search" +msgstr "Axtar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s nəticə" +msgstr[1] "%(counter)s nəticə" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "Hamısı birlikdə %(full_result_count)s" + +msgid "Save as new" +msgstr "Yenisi kimi yadda saxla" + +msgid "Save and add another" +msgstr "Yadda saxla və yenisini əlavə et" + +msgid "Save and continue editing" +msgstr "Yadda saxla və redaktəyə davam et" + +msgid "Save and view" +msgstr "Saxla və gör" + +msgid "Close" +msgstr "Qapat" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Sayt ilə səmərəli vaxt keçirdiyiniz üçün təşəkkür." + +msgid "Log in again" +msgstr "Yenidən daxil ol" + +msgid "Password change" +msgstr "Parol dəyişmək" + +msgid "Your password was changed." +msgstr "Sizin parolunuz dəyişdi." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Yoxlama üçün köhnə parolunuzu daxil edin. Sonra isə yeni parolu iki dəfə " +"daxil edin ki, səhv etmədiyinizə əmin olaq." + +msgid "Change my password" +msgstr "Mənim parolumu dəyiş" + +msgid "Password reset" +msgstr "Parolun sıfırlanması" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Yeni parol artıq qüvvədədir. Yenidən daxil ola bilərsiniz." + +msgid "Password reset confirmation" +msgstr "Parolun sıfırlanması üçün təsdiq" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "Yeni parolu iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." + +msgid "New password:" +msgstr "Yeni parol:" + +msgid "Confirm password:" +msgstr "Yeni parol (bir daha):" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Parolun sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " +"Parolu sıfırlamaq üçün yenə müraciət edin." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Əgər daxil etdiyiniz e-poçt ünvanıyla hesab mövcuddursa, parolu qurmağınız " +"üçün sizə e-poçt göndərdik. Qısa zamanda alacaqsınız." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Əgər e-poçt gəlmədiysə lütfən, qeyd olduğunuz ünvanla istədiyinizə əmin olun " +"və spam qutunuzu yoxlayın." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"%(site_name)s saytında parolu yeniləmək istədiyinizə görə bu məktubu " +"göndərdik." + +msgid "Please go to the following page and choose a new password:" +msgstr "Növbəti səhifəyə keçid alın və yeni parolu seçin:" + +msgid "Your username, in case you've forgotten:" +msgstr "Sizin istifadəçi adınız:" + +msgid "Thanks for using our site!" +msgstr "Bizim saytdan istifadə etdiyiniz üçün təşəkkür edirik!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s komandası" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Parolu unutmusunuz? Aşağıda e-poçt ünvanınızı təqdim edin, biz isə yeni " +"parol seçmək təlimatlarını sizə göndərək." + +msgid "Email address:" +msgstr "E-poçt:" + +msgid "Reset my password" +msgstr "Parolumu sıfırla" + +msgid "All dates" +msgstr "Bütün tarixlərdə" + +#, python-format +msgid "Select %s" +msgstr "%s seç" + +#, python-format +msgid "Select %s to change" +msgstr "%s dəyişmək üçün seç" + +#, python-format +msgid "Select %s to view" +msgstr "Görmək üçün %s seçin" + +msgid "Date:" +msgstr "Tarix:" + +msgid "Time:" +msgstr "Vaxt:" + +msgid "Lookup" +msgstr "Sorğu" + +msgid "Currently:" +msgstr "Hazırda:" + +msgid "Change:" +msgstr "Dəyişdir:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..32272d6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2661535 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Ismayilov , 2011-2012 +# Emin Mastizada , 2016 +# Emin Mastizada , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Mümkün %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Bu, mümkün %s siyahısıdır. Onlardan bir neçəsini qarşısındakı xanaya işarə " +"qoymaq və iki xana arasındakı \"Seç\"i tıqlamaqla seçmək olar." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Bu xanaya yazmaqla mümkün %s siyahısını filtrləyə bilərsiniz." + +msgid "Filter" +msgstr "Süzgəc" + +msgid "Choose all" +msgstr "Hamısını seç" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Bütün %s siyahısını seçmək üçün tıqlayın." + +msgid "Choose" +msgstr "Seç" + +msgid "Remove" +msgstr "Yığışdır" + +#, javascript-format +msgid "Chosen %s" +msgstr "Seçilmiş %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Bu, seçilmiş %s siyahısıdır. Onlardan bir neçəsini aşağıdakı xanaya işarə " +"qoymaq və iki xana arasındakı \"Sil\"i tıqlamaqla silmək olar." + +msgid "Remove all" +msgstr "Hamısını sil" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Seçilmiş %s siyahısının hamısını silmək üçün tıqlayın." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s / %(cnt)s seçilib" +msgstr[1] "%(sel)s / %(cnt)s seçilib" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Bəzi sahələrdə etdiyiniz dəyişiklikləri hələ yadda saxlamamışıq. Əgər " +"əməliyyatı işə salsanız, dəyişikliklər əldən gedəcək." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Əməliyyatı seçmisiniz, amma bəzi sahələrdəki dəyişiklikləri hələ yadda " +"saxlamamışıq. Bunun üçün OK seçməlisiniz. Ondan sonra əməliyyatı yenidən işə " +"salmağa cəhd edin." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Siz əməliyyatı seçmisiniz və heç bir sahəyə dəyişiklik etməmisiniz. Siz " +"yəqin ki, Yadda saxla düyməsini deyil, Getdik düyməsini axtarırsınız." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Diqqət: Server vaxtından %s saat irəlidəsiniz." +msgstr[1] "Diqqət: Server vaxtından %s saat irəlidəsiniz." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Diqqət: Server vaxtından %s saat geridəsiniz." +msgstr[1] "Diqqət: Server vaxtından %s saat geridəsiniz." + +msgid "Now" +msgstr "İndi" + +msgid "Choose a Time" +msgstr "Vaxt Seçin" + +msgid "Choose a time" +msgstr "Vaxtı seçin" + +msgid "Midnight" +msgstr "Gecə yarısı" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Günorta" + +msgid "6 p.m." +msgstr "6 p.m." + +msgid "Cancel" +msgstr "Ləğv et" + +msgid "Today" +msgstr "Bu gün" + +msgid "Choose a Date" +msgstr "Tarix Seçin" + +msgid "Yesterday" +msgstr "Dünən" + +msgid "Tomorrow" +msgstr "Sabah" + +msgid "January" +msgstr "Yanvar" + +msgid "February" +msgstr "Fevral" + +msgid "March" +msgstr "Mart" + +msgid "April" +msgstr "Aprel" + +msgid "May" +msgstr "May" + +msgid "June" +msgstr "İyun" + +msgid "July" +msgstr "İyul" + +msgid "August" +msgstr "Avqust" + +msgid "September" +msgstr "Sentyabr" + +msgid "October" +msgstr "Oktyabr" + +msgid "November" +msgstr "Noyabr" + +msgid "December" +msgstr "Dekabr" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "B" + +msgctxt "one letter Monday" +msgid "M" +msgstr "B" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Ç" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Ç" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "C" + +msgctxt "one letter Friday" +msgid "F" +msgstr "C" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Ş" + +msgid "Show" +msgstr "Göstər" + +msgid "Hide" +msgstr "Gizlət" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8610030 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/be/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..73bce75 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,689 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Boris Chervenkov , 2012 +# Claude Paroz , 2014 +# Jannis Leidel , 2011 +# Lyuboslav Petrov , 2014 +# Todor Lubenov , 2014-2015 +# Venelin Stoykov , 2015-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-11-17 08:33+0000\n" +"Last-Translator: Venelin Stoykov \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Успешно изтрити %(count)d %(items)s ." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Не можете да изтриете %(name)s" + +msgid "Are you sure?" +msgstr "Сигурни ли сте?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Изтриване на избраните %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Администрация" + +msgid "All" +msgstr "Всички" + +msgid "Yes" +msgstr "Да" + +msgid "No" +msgstr "Не" + +msgid "Unknown" +msgstr "Неизвестно" + +msgid "Any date" +msgstr "Коя-да-е дата" + +msgid "Today" +msgstr "Днес" + +msgid "Past 7 days" +msgstr "Последните 7 дни" + +msgid "This month" +msgstr "Този месец" + +msgid "This year" +msgstr "Тази година" + +msgid "No date" +msgstr "Няма дата" + +msgid "Has date" +msgstr "Има дата" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Моля въведете правилния %(username)s и парола за администраторски акаунт. " +"Моля забележете, че и двете полета са с главни и малки букви." + +msgid "Action:" +msgstr "Действие:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Добави друг %(verbose_name)s" + +msgid "Remove" +msgstr "Премахване" + +msgid "action time" +msgstr "време на действие" + +msgid "user" +msgstr "потребител" + +msgid "content type" +msgstr "тип на съдържанието" + +msgid "object id" +msgstr "id на обекта" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr на обекта" + +msgid "action flag" +msgstr "флаг за действие" + +msgid "change message" +msgstr "промени съобщение" + +msgid "log entry" +msgstr "записка" + +msgid "log entries" +msgstr "записки" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Добавен \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Променени \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Изтрит \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "LogEntry обект" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Добавено {name} \"{object}\"." + +msgid "Added." +msgstr "Добавено." + +msgid "and" +msgstr "и" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Променени {fields} за {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Променени {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Изтрит {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Няма променени полета." + +msgid "None" +msgstr "Празно" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Задръжте \"Control\", или \"Command\" на Mac, за да изберете повече от един." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"Обектът {name} \"{obj}\" бе успешно добавен. Може да го редактирате по-" +"долу. " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"Обектът {name} \"{obj}\" бе успешно добавен. Можете да добавите още един " +"обект {name} по-долу." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "Обектът {name} \"{obj}\" бе успешно добавен. " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"Обектът {name} \"{obj}\" бе успешно променен. Може да го редактирате по-" +"долу. " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"Обектът {name} \"{obj}\" бе успешно променен. Можете да добавите още един " +"обект {name} по-долу." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "Обектът {name} \"{obj}\" бе успешно променен." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Елементите трябва да бъдат избрани, за да се извършат действия по тях. Няма " +"променени елементи." + +msgid "No action selected." +msgstr "Няма избрани действия." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Обектът %(name)s \"%(obj)s\" бе успешно изтрит. " + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s с ИД \"%(key)s\" несъществува. Може би е изтрито?" + +#, python-format +msgid "Add %s" +msgstr "Добави %s" + +#, python-format +msgid "Change %s" +msgstr "Промени %s" + +msgid "Database error" +msgstr "Грешка в базата данни" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s беше променено успешно." +msgstr[1] "%(count)s %(name)s бяха променени успешно." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s е избран" +msgstr[1] "Всички %(total_count)s са избрани" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 от %(cnt)s са избрани" + +#, python-format +msgid "Change history: %s" +msgstr "История на промените: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Изтриването на избраните %(class_name)s %(instance)s ще наложи изтриването " +"на следните защитени и свързани обекти: %(related_objects)s" + +msgid "Django site admin" +msgstr "Административен панел" + +msgid "Django administration" +msgstr "Административен панел" + +msgid "Site administration" +msgstr "Администрация на сайта" + +msgid "Log in" +msgstr "Вход" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s администрация" + +msgid "Page not found" +msgstr "Страница не е намерена" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Съжалявам, но исканата страница не е намерена." + +msgid "Home" +msgstr "Начало" + +msgid "Server error" +msgstr "Сървърна грешка" + +msgid "Server error (500)" +msgstr "Сървърна грешка (500)" + +msgid "Server Error (500)" +msgstr "Сървърна грешка (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Станала е грешка. Съобщава се на администраторите на сайта по електронна " +"поща и трябва да бъде поправено скоро. Благодарим ви за търпението." + +msgid "Run the selected action" +msgstr "Стартирай избраните действия" + +msgid "Go" +msgstr "Напред" + +msgid "Click here to select the objects across all pages" +msgstr "Щракнете тук, за да изберете обектите във всички страници" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Избери всички %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Изтрий избраното" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Първо въведете потребител и парола. След това ще можете да редактирате " +"повече детайли. " + +msgid "Enter a username and password." +msgstr "Въведете потребителско име и парола." + +msgid "Change password" +msgstr "Промени парола" + +msgid "Please correct the error below." +msgstr "Моля, поправете грешките по-долу." + +msgid "Please correct the errors below." +msgstr "Моля поправете грешките по-долу." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Въведете нова парола за потребител %(username)s." + +msgid "Welcome," +msgstr "Добре дошли," + +msgid "View site" +msgstr "Виж сайта" + +msgid "Documentation" +msgstr "Документация" + +msgid "Log out" +msgstr "Изход" + +#, python-format +msgid "Add %(name)s" +msgstr "Добави %(name)s" + +msgid "History" +msgstr "История" + +msgid "View on site" +msgstr "Разгледай в сайта" + +msgid "Filter" +msgstr "Филтър" + +msgid "Remove from sorting" +msgstr "Премахни от подреждането" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Ред на подреждане: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Обърни подреждането" + +msgid "Delete" +msgstr "Изтрий" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Изтриването на обекта %(object_name)s '%(escaped_object)s' не може да бъде " +"извършено без да се изтрият и някои свързани обекти, върху които обаче " +"нямате права: " + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Изтриването на %(object_name)s '%(escaped_object)s' ще доведе до " +"заличаването на следните защитени свързани обекти:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Наистина ли искате да изтриете обектите %(object_name)s \"%(escaped_object)s" +"\"? Следните свързани елементи също ще бъдат изтрити:" + +msgid "Objects" +msgstr "Обекти" + +msgid "Yes, I'm sure" +msgstr "Да, сигурен съм" + +msgid "No, take me back" +msgstr "Не, върни ме обратно" + +msgid "Delete multiple objects" +msgstr "Изтриване на множество обекти" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Изтриването на избраните %(objects_name)s ще доведе до изтриване на свързани " +"обекти. Вашият профил няма права за изтриване на следните типове обекти:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Изтриването на избраните %(objects_name)s ще доведе до заличаването на " +"следните защитени свързани обекти:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Наистина ли искате да изтриете избраните %(objects_name)s? Всички изброени " +"обекти и свързаните с тях ще бъдат изтрити:" + +msgid "Change" +msgstr "Промени" + +msgid "Delete?" +msgstr "Изтриване?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " По %(filter_title)s " + +msgid "Summary" +msgstr "Резюме" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Моделите в %(name)s приложение" + +msgid "Add" +msgstr "Добави" + +msgid "You don't have permission to edit anything." +msgstr "Нямате права да редактирате каквото и да е." + +msgid "Recent actions" +msgstr "Последни действия" + +msgid "My actions" +msgstr "Моите действия" + +msgid "None available" +msgstr "Няма налични" + +msgid "Unknown content" +msgstr "Неизвестно съдържание" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Проблем с базата данни. Проверете дали необходимите таблици са създадени и " +"дали съответния потребител има необходимите права за достъп. " + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Вие сте се автентикиран като %(username)s, но не сте оторизиран да достъпите " +"тази страница. Бихте ли желали да влезе с друг профил." + +msgid "Forgotten your password or username?" +msgstr "Забравена парола или потребителско име?" + +msgid "Date/time" +msgstr "Дата/час" + +msgid "User" +msgstr "Потребител" + +msgid "Action" +msgstr "Действие" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Този обект няма исторя на промените. Вероятно не е добавен чрез " +"административния панел. " + +msgid "Show all" +msgstr "Покажи всички" + +msgid "Save" +msgstr "Запис" + +msgid "Popup closing..." +msgstr "Затваряне на изкачащ прозорец..." + +#, python-format +msgid "Change selected %(model)s" +msgstr "Променете избрания %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Добавяне на друг %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Изтриване на избрания %(model)s" + +msgid "Search" +msgstr "Търсене" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s резултат" +msgstr[1] "%(counter)s резултати" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s общо" + +msgid "Save as new" +msgstr "Запис като нов" + +msgid "Save and add another" +msgstr "Запис и нов" + +msgid "Save and continue editing" +msgstr "Запис и продължение" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Благодарим Ви, че използвахте този сайт днес." + +msgid "Log in again" +msgstr "Влез пак" + +msgid "Password change" +msgstr "Промяна на парола" + +msgid "Your password was changed." +msgstr "Паролата ви е променена." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Въведете старата си парола /за сигурност/. След това въведете желаната нова " +"парола два пъти от съображения за сигурност" + +msgid "Change my password" +msgstr "Промяна на парола" + +msgid "Password reset" +msgstr "Нова парола" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Паролата е променена. Вече можете да се впишете" + +msgid "Password reset confirmation" +msgstr "Парола за потвърждение" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Моля, въведете новата парола два пъти, за да може да се потвърди, че сте я " +"написали правилно." + +msgid "New password:" +msgstr "Нова парола:" + +msgid "Confirm password:" +msgstr "Потвърдете паролата:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Връзката за възстановяване на паролата е невалидна, може би защото вече е " +"използвана. Моля, поискайте нова промяна на паролата." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Ние ви пратихме мейл с инструкции за настройка на вашата парола, ако " +"съществува профил с имейла, който сте въвели. Вие трябва да ги получат скоро." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Ако не получите имейл, моля подсигурете се, че сте въвели правилно адреса с " +"който сте се регистрирал/a и/или проверете спам папката във вашата поща." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Вие сте получили този имейл, защото сте поискали да промените паролата за " +"вашия потребителски акаунт в %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Моля, отидете на следната страница и изберете нова парола:" + +msgid "Your username, in case you've forgotten:" +msgstr "Вашето потребителско име, в случай, че сте го забравили:" + +msgid "Thanks for using our site!" +msgstr "Благодарим, че ползвате сайта ни!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Екипът на %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Забравили сте си паролата? Въведете своя имейл адрес по-долу, а ние ще ви " +"изпратим инструкции за създаване на нова." + +msgid "Email address:" +msgstr "E-mail адреси:" + +msgid "Reset my password" +msgstr "Нова парола" + +msgid "All dates" +msgstr "Всички дати" + +#, python-format +msgid "Select %s" +msgstr "Изберете %s" + +#, python-format +msgid "Select %s to change" +msgstr "Изберете %s за промяна" + +msgid "Date:" +msgstr "Дата:" + +msgid "Time:" +msgstr "Час:" + +msgid "Lookup" +msgstr "Търсене" + +msgid "Currently:" +msgstr "Сега:" + +msgid "Change:" +msgstr "Промени" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..4940bb9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ded64ac --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Venelin Stoykov , 2015-2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Venelin Stoykov \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Налични %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Това е списък на наличните %s . Можете да изберете някои, като ги изберете в " +"полето по-долу и след това кликнете върху \"Избор\" стрелка между двете " +"кутии." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Въведете в това поле, за да филтрирате списъка на наличните %s." + +msgid "Filter" +msgstr "Филтър" + +msgid "Choose all" +msgstr "Избери всички" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Кликнете, за да изберете всички %s наведнъж." + +msgid "Choose" +msgstr "Избирам" + +msgid "Remove" +msgstr "Премахни" + +#, javascript-format +msgid "Chosen %s" +msgstr "Избрахме %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Това е списък на избрания %s. Можете да премахнете някои, като ги изберете в " +"полето по-долу и след това щракнете върху \"Премахни\" стрелка между двете " +"кутии." + +msgid "Remove all" +msgstr "Премахване на всички" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Кликнете, за да премахнете всички избрани %s наведнъж." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s на %(cnt)s е избран" +msgstr[1] "%(sel)s на %(cnt)s са избрани" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Имате незапазени промени по отделни полета за редактиране. Ако започнете " +"друго, незаписаните промени ще бъдат загубени." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Вие сте избрали действие, но не сте записали промените по полета. Моля, " +"кликнете ОК, за да се запишат. Трябва отново да започнете действие." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Вие сте избрали дадена дейност, а не сте направили някакви промени по " +"полетата. Вероятно търсите Go бутон, а не бутона Save." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Бележка: Вие сте %s час напред от времето на сървъра." +msgstr[1] "Бележка: Вие сте %s часа напред от времето на сървъра" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Внимание: Вие сте %s час назад от времето на сървъра." +msgstr[1] "Внимание: Вие сте %s часа назад от времето на сървъра." + +msgid "Now" +msgstr "Сега" + +msgid "Choose a Time" +msgstr "Изберете време" + +msgid "Choose a time" +msgstr "Избери време" + +msgid "Midnight" +msgstr "Полунощ" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "По обяд" + +msgid "6 p.m." +msgstr "6 след обяд" + +msgid "Cancel" +msgstr "Отказ" + +msgid "Today" +msgstr "Днес" + +msgid "Choose a Date" +msgstr "Изберете дата" + +msgid "Yesterday" +msgstr "Вчера" + +msgid "Tomorrow" +msgstr "Утре" + +msgid "January" +msgstr "Януари" + +msgid "February" +msgstr "Февруари" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Април" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Юни" + +msgid "July" +msgstr "Юли" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Септември" + +msgid "October" +msgstr "Октомври" + +msgid "November" +msgstr "Ноември" + +msgid "December" +msgstr "Декември" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Н" + +msgctxt "one letter Monday" +msgid "M" +msgstr "П" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "В" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "С" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "Ч" + +msgctxt "one letter Friday" +msgid "F" +msgstr "П" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "С" + +msgid "Show" +msgstr "Покажи" + +msgid "Hide" +msgstr "Скрий" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po new file mode 100644 index 0000000..e36fb61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/django.po @@ -0,0 +1,652 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Anubhab Baksi, 2013 +# Jannis Leidel , 2011 +# Tahmid Rafi , 2012-2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bengali (http://www.transifex.com/django/django/language/" +"bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d টি %(items)s সফলভাবে মুছে ফেলা হয়েছে" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s ডিলিট করা সম্ভব নয়" + +msgid "Are you sure?" +msgstr "আপনি কি নিশ্চিত?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "সকল" + +msgid "Yes" +msgstr "হ্যাঁ" + +msgid "No" +msgstr "না" + +msgid "Unknown" +msgstr "অজানা" + +msgid "Any date" +msgstr "যে কোন তারিখ" + +msgid "Today" +msgstr "‍আজ" + +msgid "Past 7 days" +msgstr "শেষ ৭ দিন" + +msgid "This month" +msgstr "এ মাসে" + +msgid "This year" +msgstr "এ বছরে" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "কাজ:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "আরো একটি %(verbose_name)s যোগ করুন" + +msgid "Remove" +msgstr "মুছে ফেলুন" + +msgid "action time" +msgstr "কার্য সময়" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "অবজেক্ট আইডি" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "অবজেক্ট উপস্থাপক" + +msgid "action flag" +msgstr "কার্যচিহ্ন" + +msgid "change message" +msgstr "বার্তা পরিবর্তন করুন" + +msgid "log entry" +msgstr "লগ এন্ট্রি" + +msgid "log entries" +msgstr "লগ এন্ট্রিসমূহ" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "%(object)s অ্যাড করা হয়েছে" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" ডিলিট করা হয়েছে" + +msgid "LogEntry Object" +msgstr "লগ-এন্ট্রি দ্রব্য" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "এবং" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "কোন ফিল্ড পরিবর্তন হয়নি।" + +msgid "None" +msgstr "কিছু না" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "কাজ করার আগে বস্তুগুলিকে অবশ্যই চিহ্নিত করতে হবে। কোনো বস্তু পরিবর্তিত হয়নি।" + +msgid "No action selected." +msgstr "কোনো কাজ " + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" সফলতার সাথে মুছে ফেলা হয়েছে।" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "%s যোগ করুন" + +#, python-format +msgid "Change %s" +msgstr "%s পরিবর্তন করুন" + +msgid "Database error" +msgstr "ডাটাবেস সমস্যা" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s টি থেকে ০ টি সিলেক্ট করা হয়েছে" + +#, python-format +msgid "Change history: %s" +msgstr "ইতিহাস পরিবর্তনঃ %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "জ্যাঙ্গো সাইট প্রশাসক" + +msgid "Django administration" +msgstr "জ্যাঙ্গো প্রশাসন" + +msgid "Site administration" +msgstr "সাইট প্রশাসন" + +msgid "Log in" +msgstr "প্রবেশ করুন" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "পৃষ্ঠা পাওয়া যায়নি" + +msgid "We're sorry, but the requested page could not be found." +msgstr "দুঃখিত, অনুরোধকৃত পাতাটি পাওয়া যায়নি।" + +msgid "Home" +msgstr "নীড়পাতা" + +msgid "Server error" +msgstr "সার্ভার সমস্যা" + +msgid "Server error (500)" +msgstr "সার্ভার সমস্যা (৫০০)" + +msgid "Server Error (500)" +msgstr "সার্ভার সমস্যা (৫০০)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "চিহ্নিত কাজটি শুরু করুন" + +msgid "Go" +msgstr "যান" + +msgid "Click here to select the objects across all pages" +msgstr "সকল পৃষ্ঠার দ্রব্য পছন্দ করতে এখানে ক্লিক করুন" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "%(total_count)s টি %(module_name)s এর সবগুলোই সিলেক্ট করুন" + +msgid "Clear selection" +msgstr "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"প্রথমে একটি সদস্যনাম ও পাসওয়ার্ড প্রবেশ করান। তারপরে আপনি ‍আরও সদস্য-অপশন যুক্ত করতে " +"পারবেন।" + +msgid "Enter a username and password." +msgstr "ইউজার নেইম এবং পাসওয়ার্ড টাইপ করুন।" + +msgid "Change password" +msgstr "পাসওয়ার্ড বদলান" + +msgid "Please correct the error below." +msgstr "অনুগ্রহ করে নিচের ভুলগুলো সংশোধন করুন।" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s সদস্যের জন্য নতুন পাসওয়ার্ড দিন।" + +msgid "Welcome," +msgstr "স্বাগতম," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "সহায়িকা" + +msgid "Log out" +msgstr "প্রস্থান" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s যোগ করুন" + +msgid "History" +msgstr "ইতিহাস" + +msgid "View on site" +msgstr "সাইটে দেখুন" + +msgid "Filter" +msgstr "ফিল্টার" + +msgid "Remove from sorting" +msgstr "ক্রমানুসারে সাজানো থেকে বিরত হোন" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "সাজানোর ক্রম: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "ক্রমানুসারে সাজানো চালু করুন/ বন্ধ করুন" + +msgid "Delete" +msgstr "মুছুন" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' মুছে ফেললে এর সম্পর্কিত অবজেক্টগুলোও মুছে " +"যাবে, কিন্তু আপনার নিম্নবর্ণিত অবজেক্টগুলো মোছার অধিকার নেইঃ" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"আপনি কি %(object_name)s \"%(escaped_object)s\" মুছে ফেলার ব্যাপারে নিশ্চিত? " +"নিম্নে বর্ণিত সকল আইটেম মুছে যাবেঃ" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "হ্যা়ঁ, আমি নিশ্চিত" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "একাধিক জিনিস মুছে ফেলুন" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +msgid "Change" +msgstr "পরিবর্তন" + +msgid "Delete?" +msgstr "মুছে ফেলুন?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s অনুযায়ী " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো" + +msgid "Add" +msgstr "যোগ করুন" + +msgid "You don't have permission to edit anything." +msgstr "কোন কিছু পরিবর্তনে আপনার অধিকার নেই।" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "কিছুই পাওয়া যায়নি" + +msgid "Unknown content" +msgstr "অজানা বিষয়" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"আপনার ডাটাবেস ইনস্টলে সমস্যা হয়েছে। নিশ্চিত করুন যে, ডাটাবেস টেবিলগুলো সঠিকভাবে " +"তৈরী হয়েছে, এবং যথাযথ সদস্যের ডাটাবেস পড়ার অধিকার রয়েছে।" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "ইউজার নেইম অথবা পাসওয়ার্ড ভুলে গেছেন?" + +msgid "Date/time" +msgstr "তারিখ/সময়" + +msgid "User" +msgstr "সদস্য" + +msgid "Action" +msgstr "কার্য" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "এই অবজেক্টের কোন ইতিহাস নেই। সম্ভবত এটি প্রশাসন সাইট দিয়ে তৈরী করা হয়নি।" + +msgid "Show all" +msgstr "সব দেখান" + +msgid "Save" +msgstr "সংরক্ষণ করুন" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "সার্চ" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "মোট %(full_result_count)s" + +msgid "Save as new" +msgstr "নতুনভাবে সংরক্ষণ করুন" + +msgid "Save and add another" +msgstr "সংরক্ষণ করুন এবং আরেকটি যোগ করুন" + +msgid "Save and continue editing" +msgstr "সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যান" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "ওয়েবসাইটে কিছু সময় কাটানোর জন্য আপনাকে আন্তরিক ধন্যবাদ।" + +msgid "Log in again" +msgstr "পুনরায় প্রবেশ করুন" + +msgid "Password change" +msgstr "পাসওয়ার্ড বদলান" + +msgid "Your password was changed." +msgstr "আপনার পাসওয়ার্ড বদলানো হয়েছে।" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"অনুগ্রহ করে আপনার পুরনো পাসওয়ার্ড প্রবেশ করান, নিরাপত্তার কাতিরে, এবং পরপর দু’বার " +"নতুন পাসওয়ার্ড প্রবেশ করান, যাচাই করার জন্য।" + +msgid "Change my password" +msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন" + +msgid "Password reset" +msgstr "পাসওয়ার্ড রিসেট করুন" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "আপনার পাসওয়ার্ড দেয়া হয়েছে। আপনি এখন প্রবেশ (লগইন) করতে পারেন।" + +msgid "Password reset confirmation" +msgstr "পাসওয়ার্ড রিসেট নিশ্চিত করুন" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"অনুগ্রহ করে আপনার পাসওয়ার্ড দুবার প্রবেশ করান, যাতে আমরা যাচাই করতে পারি আপনি " +"সঠিকভাবে টাইপ করেছেন।" + +msgid "New password:" +msgstr "নতুন পাসওয়ার্ডঃ" + +msgid "Confirm password:" +msgstr "পাসওয়ার্ড নিশ্চিতকরণঃ" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"পাসওয়ার্ড রিসেট লিঙ্কটি ঠিক নয়, হয়তো এটা ইতোমধ্যে ব্যবহৃত হয়েছে। পাসওয়ার্ড " +"রিসেটের জন্য অনুগ্রহ করে নতুনভাবে আবেদন করুন।" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"আপনি এই ই-মেইলটি পেয়েছেন কারন আপনি %(site_name)s এ আপনার ইউজার একাউন্টের " +"পাসওয়ার্ড রিসেট এর জন্য অনুরোধ করেছেন।" + +msgid "Please go to the following page and choose a new password:" +msgstr "অনুগ্রহ করে নিচের পাতাটিতে যান এবং নতুন পাসওয়ার্ড বাছাই করুনঃ" + +msgid "Your username, in case you've forgotten:" +msgstr "আপনার সদস্যনাম, যদি ভুলে গিয়ে থাকেনঃ" + +msgid "Thanks for using our site!" +msgstr "আমাদের সাইট ব্যবহারের জন্য ধন্যবাদ!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s দল" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"পাসওয়ার্ড ভুলে গেছেন? নিচে আপনার ইমেইল এড্রেস দিন, এবং আমরা নতুন পাসওয়ার্ড সেট " +"করার নিয়ম-কানুন আপনাকে ই-মেইল করব।" + +msgid "Email address:" +msgstr "ইমেইল ঠিকানা:" + +msgid "Reset my password" +msgstr "আমার পাসওয়ার্ড রিসেট করুন" + +msgid "All dates" +msgstr "সকল তারিখ" + +#, python-format +msgid "Select %s" +msgstr "%s বাছাই করুন" + +#, python-format +msgid "Select %s to change" +msgstr "%s পরিবর্তনের জন্য বাছাই করুন" + +msgid "Date:" +msgstr "তারিখঃ" + +msgid "Time:" +msgstr "সময়ঃ" + +msgid "Lookup" +msgstr "খুঁজুন" + +msgid "Currently:" +msgstr "বর্তমান অবস্থা:" + +msgid "Change:" +msgstr "পরিবর্তন:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..139d81c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bn/LC_MESSAGES/djangojs.po @@ -0,0 +1,207 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Tahmid Rafi , 2013 +# Tahmid Rafi , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bengali (http://www.transifex.com/django/django/language/" +"bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s বিদ্যমান" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "ফিল্টার" + +msgid "Choose all" +msgstr "সব বাছাই করুন" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "সব %s একবারে বাছাই করার জন্য ক্লিক করুন।" + +msgid "Choose" +msgstr "বাছাই করুন" + +msgid "Remove" +msgstr "মুছে ফেলুন" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s বাছাই করা হয়েছে" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "সব মুছে ফেলুন" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" +msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা সামনে আছেন।" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" +msgstr[1] "নোট: আপনি সার্ভার সময়ের চেয়ে %s ঘন্টা পেছনে আছেন।" + +msgid "Now" +msgstr "এখন" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "সময় নির্বাচন করুন" + +msgid "Midnight" +msgstr "মধ্যরাত" + +msgid "6 a.m." +msgstr "৬ পূর্বাহ্ন" + +msgid "Noon" +msgstr "দুপুর" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "বাতিল" + +msgid "Today" +msgstr "আজ" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "গতকাল" + +msgid "Tomorrow" +msgstr "আগামীকাল" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "দেখান" + +msgid "Hide" +msgstr "লুকান" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..cbdc359 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,671 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fulup , 2012 +# Irriep Nala Novram , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:36+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: br\n" +"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" +"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" +"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " +"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " +"&& n % 1000000 == 0) ? 3 : 4);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +msgid "Are you sure?" +msgstr "Ha sur oc'h?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Dilemel %(verbose_name_plural)s diuzet" + +msgid "Administration" +msgstr "Melestradurezh" + +msgid "All" +msgstr "An holl" + +msgid "Yes" +msgstr "Ya" + +msgid "No" +msgstr "Ket" + +msgid "Unknown" +msgstr "Dianav" + +msgid "Any date" +msgstr "Forzh pegoulz" + +msgid "Today" +msgstr "Hiziv" + +msgid "Past 7 days" +msgstr "Er 7 devezh diwezhañ" + +msgid "This month" +msgstr "Ar miz-mañ" + +msgid "This year" +msgstr "Ar bloaz-mañ" + +msgid "No date" +msgstr "Deiziad ebet" + +msgid "Has date" +msgstr "D'an deiziad" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "Ober:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Ouzhpennañ %(verbose_name)s all" + +msgid "Remove" +msgstr "Lemel kuit" + +msgid "Addition" +msgstr "Sammañ" + +msgid "Change" +msgstr "Cheñch" + +msgid "Deletion" +msgstr "Diverkadur" + +msgid "action time" +msgstr "eur an ober" + +msgid "user" +msgstr "implijer" + +msgid "content type" +msgstr "doare endalc'had" + +msgid "object id" +msgstr "id an objed" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "" + +msgid "action flag" +msgstr "ober banniel" + +msgid "change message" +msgstr "Kemennadenn cheñchamant" + +msgid "log entry" +msgstr "" + +msgid "log entries" +msgstr "" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Ouzhpennet \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Cheñchet \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Dilamet \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Ouzhpennet {name} \"{object}\"." + +msgid "Added." +msgstr "Ouzhpennet." + +msgid "and" +msgstr "ha" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Cheñchet {fields} evit {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Cheñchet {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Dilamet {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Maezienn ebet cheñchet." + +msgid "None" +msgstr "Hini ebet" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "Rankout a rit ec'h aozañ adarre dindan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +msgid "No action selected." +msgstr "Ober ebet diuzet." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Ouzhpennañ %s" + +#, python-format +msgid "Change %s" +msgstr "Cheñch %s" + +#, python-format +msgid "View %s" +msgstr "Gwelet %s" + +msgid "Database error" +msgstr "Fazi diaz-roadennoù" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s a zo bet cheñchet mat." +msgstr[1] "%(count)s %(name)s a zo bet cheñchet mat. " +msgstr[2] "%(count)s %(name)s a zo bet cheñchet mat. " +msgstr[3] "%(count)s %(name)s a zo bet cheñchet mat." +msgstr[4] "%(count)s %(name)s a zo bet cheñchet mat." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s diuzet" +msgstr[1] "%(total_count)s diuzet" +msgstr[2] "%(total_count)s diuzet" +msgstr[3] "%(total_count)s diuzet" +msgstr[4] "Pep %(total_count)s diuzet" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 diwar %(cnt)s diuzet" + +#, python-format +msgid "Change history: %s" +msgstr "Istor ar cheñchadurioù: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Lec'hienn verañ Django" + +msgid "Django administration" +msgstr "Merañ Django" + +msgid "Site administration" +msgstr "Merañ al lec'hienn" + +msgid "Log in" +msgstr "Kevreañ" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "N'eo ket bet kavet ar bajenn" + +msgid "We're sorry, but the requested page could not be found." +msgstr "" + +msgid "Home" +msgstr "Degemer" + +msgid "Server error" +msgstr "Fazi servijer" + +msgid "Server error (500)" +msgstr "Fazi servijer (500)" + +msgid "Server Error (500)" +msgstr "Fazi servijer (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "" + +msgid "Go" +msgstr "Mont" + +msgid "Click here to select the objects across all pages" +msgstr "" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "" + +msgid "Clear selection" +msgstr "Riñsañ an diuzadenn" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" + +msgid "Enter a username and password." +msgstr "Merkit un anv implijer hag ur ger-tremen." + +msgid "Change password" +msgstr "Cheñch ger-tremen" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +msgid "Welcome," +msgstr "Degemer mat," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Teulioù" + +msgid "Log out" +msgstr "Digevreañ" + +#, python-format +msgid "Add %(name)s" +msgstr "Ouzhpennañ %(name)s" + +msgid "History" +msgstr "Istor" + +msgid "View on site" +msgstr "Gwelet war al lec'hienn" + +msgid "Filter" +msgstr "Sil" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "Eilpennañ an diuzadenn" + +msgid "Delete" +msgstr "Diverkañ" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Ya, sur on" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "Diverkañ ?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " dre %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Ouzhpennañ" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "" + +msgid "Unknown content" +msgstr "Endalc'had dianav" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Disoñjet ho ker-tremen pe hoc'h anv implijer ganeoc'h ?" + +msgid "Date/time" +msgstr "Deiziad/eur" + +msgid "User" +msgstr "Implijer" + +msgid "Action" +msgstr "Ober" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "Diskouez pep tra" + +msgid "Save" +msgstr "Enrollañ" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Klask" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "" + +msgid "Save as new" +msgstr "Enrollañ evel nevez" + +msgid "Save and add another" +msgstr "Enrollañ hag ouzhpennañ unan all" + +msgid "Save and continue editing" +msgstr "Enrollañ ha derc'hel da gemmañ" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "" + +msgid "Log in again" +msgstr "Kevreañ en-dro" + +msgid "Password change" +msgstr "Cheñch ho ker-tremen" + +msgid "Your password was changed." +msgstr "Cheñchet eo bet ho ker-tremen." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" + +msgid "Change my password" +msgstr "Cheñch ma ger-tremen" + +msgid "Password reset" +msgstr "Adderaouekaat ar ger-tremen" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +msgid "Password reset confirmation" +msgstr "Kadarnaat eo bet cheñchet ar ger-tremen" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +msgid "New password:" +msgstr "Ger-tremen nevez :" + +msgid "Confirm password:" +msgstr "Kadarnaat ar ger-tremen :" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "" + +msgid "Your username, in case you've forgotten:" +msgstr "" + +msgid "Thanks for using our site!" +msgstr "Ho trugarekaat da ober gant hol lec'hienn !" + +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "" + +msgid "All dates" +msgstr "An holl zeiziadoù" + +#, python-format +msgid "Select %s" +msgstr "Diuzañ %s" + +#, python-format +msgid "Select %s to change" +msgstr "" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "Deiziad :" + +msgid "Time:" +msgstr "Eur :" + +msgid "Lookup" +msgstr "Klask" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..58664d0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/br/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f920c9b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..1d7eb6e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,657 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Filip Dupanović , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Uspješno izbrisano %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "" + +msgid "Are you sure?" +msgstr "Da li ste sigurni?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Izbriši odabrane %(verbose_name_plural)s" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Svi" + +msgid "Yes" +msgstr "Da" + +msgid "No" +msgstr "Ne" + +msgid "Unknown" +msgstr "Nepoznato" + +msgid "Any date" +msgstr "Svi datumi" + +msgid "Today" +msgstr "Danas" + +msgid "Past 7 days" +msgstr "Poslednjih 7 dana" + +msgid "This month" +msgstr "Ovaj mesec" + +msgid "This year" +msgstr "Ova godina" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "Radnja:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Dodaj još jedan %(verbose_name)s" + +msgid "Remove" +msgstr "Obriši" + +msgid "action time" +msgstr "vrijeme radnje" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "id objekta" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr objekta" + +msgid "action flag" +msgstr "oznaka radnje" + +msgid "change message" +msgstr "opis izmjene" + +msgid "log entry" +msgstr "zapis u logovima" + +msgid "log entries" +msgstr "zapisi u logovima" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +msgid "LogEntry Object" +msgstr "" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "i" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Nije bilo izmjena polja." + +msgid "None" +msgstr "Nijedan" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Predmeti moraju biti izabrani da bi se mogla obaviti akcija nad njima. " +"Nijedan predmet nije bio izmjenjen." + +msgid "No action selected." +msgstr "Nijedna akcija nije izabrana." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Objekat „%(obj)s“ klase %(name)s obrisan je uspješno." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Dodaj objekat klase %s" + +#, python-format +msgid "Change %s" +msgstr "Izmjeni objekat klase %s" + +msgid "Database error" +msgstr "Greška u bazi podataka" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 od %(cnt)s izabrani" + +#, python-format +msgid "Change history: %s" +msgstr "Historijat izmjena: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django administracija sajta" + +msgid "Django administration" +msgstr "Django administracija" + +msgid "Site administration" +msgstr "Administracija sistema" + +msgid "Log in" +msgstr "Prijava" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Stranica nije pronađena" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Žao nam je, tražena stranica nije pronađena." + +msgid "Home" +msgstr "Početna" + +msgid "Server error" +msgstr "Greška na serveru" + +msgid "Server error (500)" +msgstr "Greška na serveru (500)" + +msgid "Server Error (500)" +msgstr "Greška na serveru (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Pokreni odabranu radnju" + +msgid "Go" +msgstr "Počni" + +msgid "Click here to select the objects across all pages" +msgstr "Kliknite ovdje da izaberete objekte preko svih stranica" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Izaberite svih %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Izbrišite izbor" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Prvo unesite korisničko ime i lozinku. Potom ćete moći da mijenjate još " +"korisničkih podešavanja." + +msgid "Enter a username and password." +msgstr "" + +msgid "Change password" +msgstr "Promjena lozinke" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Unesite novu lozinku za korisnika %(username)s." + +msgid "Welcome," +msgstr "Dobrodošli," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Log out" +msgstr "Odjava" + +#, python-format +msgid "Add %(name)s" +msgstr "Dodaj objekat klase %(name)s" + +msgid "History" +msgstr "Historijat" + +msgid "View on site" +msgstr "Pregled na sajtu" + +msgid "Filter" +msgstr "Filter" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "" + +msgid "Delete" +msgstr "Obriši" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih " +"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za " +"brisanje slijedećih tipova objekata:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Da li ste sigurni da želite da obrišete %(object_name)s " +"„%(escaped_object)s“? Slijedeći objekti koji su u vezi sa ovim objektom će " +"također biti obrisani:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Da, siguran sam" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Brisanje više objekata" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +msgid "Change" +msgstr "Izmjeni" + +msgid "Delete?" +msgstr "Brisanje?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Dodaj" + +msgid "You don't have permission to edit anything." +msgstr "Nemate dozvole da unosite bilo kakve izmjene." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Nema podataka" + +msgid "Unknown content" +msgstr "Nepoznat sadržaj" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Nešto nije uredu sa vašom bazom podataka. Provjerite da li postoje " +"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "" + +msgid "Date/time" +msgstr "Datum/vrijeme" + +msgid "User" +msgstr "Korisnik" + +msgid "Action" +msgstr "Radnja" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ovaj objekat nema zabilježen historijat izmjena. Vjerovatno nije dodan kroz " +"ovaj sajt za administraciju." + +msgid "Show all" +msgstr "Prikaži sve" + +msgid "Save" +msgstr "Sačuvaj" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Pretraga" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "ukupno %(full_result_count)s" + +msgid "Save as new" +msgstr "Sačuvaj kao novi" + +msgid "Save and add another" +msgstr "Sačuvaj i dodaj slijedeći" + +msgid "Save and continue editing" +msgstr "Sačuvaj i nastavi sa izmjenama" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Hvala što ste danas proveli vrijeme na ovom sajtu." + +msgid "Log in again" +msgstr "Ponovna prijava" + +msgid "Password change" +msgstr "Izmjena lozinke" + +msgid "Your password was changed." +msgstr "Vaša lozinka je izmjenjena." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Iz bezbjednosnih razloga prvo unesite svoju staru lozinku, a novu zatim " +"unesite dva puta da bismo mogli da provjerimo da li ste je pravilno unijeli." + +msgid "Change my password" +msgstr "Izmijeni moju lozinku" + +msgid "Password reset" +msgstr "Resetovanje lozinke" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Vaša lozinka je postavljena. Možete se prijaviti." + +msgid "Password reset confirmation" +msgstr "Potvrda resetovanja lozinke" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Unesite novu lozinku dva puta kako bismo mogli da provjerimo da li ste je " +"pravilno unijeli." + +msgid "New password:" +msgstr "Nova lozinka:" + +msgid "Confirm password:" +msgstr "Potvrda lozinke:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Link za resetovanje lozinke nije važeći, vjerovatno zato što je već " +"iskorišćen. Ponovo zatražite resetovanje lozinke." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "Idite na slijedeću stranicu i postavite novu lozinku." + +msgid "Your username, in case you've forgotten:" +msgstr "Ukoliko ste zaboravili, vaše korisničko ime:" + +msgid "Thanks for using our site!" +msgstr "Hvala što koristite naš sajt!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Uredništvo sajta %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "Resetuj moju lozinku" + +msgid "All dates" +msgstr "Svi datumi" + +#, python-format +msgid "Select %s" +msgstr "Odaberi objekat klase %s" + +#, python-format +msgid "Select %s to change" +msgstr "Odaberi objekat klase %s za izmjenu" + +msgid "Date:" +msgstr "Datum:" + +msgid "Time:" +msgstr "Vrijeme:" + +msgid "Lookup" +msgstr "Pretraži" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..4c33f36 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2014-2015,2017 +# Carles Barrobés , 2011-2012,2014 +# duub qnnp, 2015 +# GerardoGa , 2018 +# Gil Obradors Via , 2019 +# Jannis Leidel , 2011 +# Roger Pons , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-28 20:40+0000\n" +"Last-Translator: Gil Obradors Via \n" +"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "No es pot esborrar %(name)s" + +msgid "Are you sure?" +msgstr "N'esteu segur?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar els %(verbose_name_plural)s seleccionats" + +msgid "Administration" +msgstr "Administració" + +msgid "All" +msgstr "Tots" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Desconegut" + +msgid "Any date" +msgstr "Qualsevol data" + +msgid "Today" +msgstr "Avui" + +msgid "Past 7 days" +msgstr "Últims 7 dies" + +msgid "This month" +msgstr "Aquest mes" + +msgid "This year" +msgstr "Aquest any" + +msgid "No date" +msgstr "Sense data" + +msgid "Has date" +msgstr "Té data" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Si us plau, introduïu un %(username)s i contrasenya correcta per un compte " +"de personal. Observeu que ambdós camps són sensibles a majúscules." + +msgid "Action:" +msgstr "Acció:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Afegir un/a altre/a %(verbose_name)s." + +msgid "Remove" +msgstr "Eliminar" + +msgid "Addition" +msgstr "Afegeix" + +msgid "Change" +msgstr "Modificar" + +msgid "Deletion" +msgstr "Supressió" + +msgid "action time" +msgstr "moment de l'acció" + +msgid "user" +msgstr "usuari" + +msgid "content type" +msgstr "tipus de contingut" + +msgid "object id" +msgstr "id de l'objecte" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "'repr' de l'objecte" + +msgid "action flag" +msgstr "indicador de l'acció" + +msgid "change message" +msgstr "missatge del canvi" + +msgid "log entry" +msgstr "entrada del registre" + +msgid "log entries" +msgstr "entrades del registre" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Afegit \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Modificat \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Eliminat \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objecte entrada del registre" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Afegit {name} \"{object}\"." + +msgid "Added." +msgstr "Afegit." + +msgid "and" +msgstr "i" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Canviat {fields} a {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Canviats {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Eliminat {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Cap camp modificat." + +msgid "None" +msgstr "cap" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Premi \"Control\" o \"Command\" a un Mac per seleccionar-ne més d'un." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "El {name} \"{obj}\" fou afegit amb èxit." + +msgid "You may edit it again below." +msgstr "Hauria d'editar de nou a sota." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"El {name} \"{obj}\" s'ha afegit amb èxit. Pots afegir un altre {name} a " +"sota." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"El {name} \"{obj}\" fou canviat amb èxit. Pots editar-ho un altra vegada a " +"sota." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"El {name} \"{obj}\" s'ha afegit amb èxit. Pots editar-lo altra vegada a " +"sota." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"El {name} \"{obj}\" fou canviat amb èxit. Pots afegir un altre {name} a " +"sota." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "El {name} \"{obj}\" fou canviat amb èxit." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Heu de seleccionar els elements per poder realitzar-hi accions. No heu " +"seleccionat cap element." + +msgid "No action selected." +msgstr "No heu seleccionat cap acció." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "El/la %(name)s \"%(obj)s\" s'ha eliminat amb èxit." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s amb ID \"%(key)s\" no existeix. Potser va ser eliminat?" + +#, python-format +msgid "Add %s" +msgstr "Afegir %s" + +#, python-format +msgid "Change %s" +msgstr "Modificar %s" + +#, python-format +msgid "View %s" +msgstr "Visualitza %s" + +msgid "Database error" +msgstr "Error de base de dades" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s s'ha modificat amb èxit." +msgstr[1] "%(count)s %(name)s s'han modificat amb èxit." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionat(s)" +msgstr[1] "Tots %(total_count)s seleccionat(s)" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionats" + +#, python-format +msgid "Change history: %s" +msgstr "Modificar històric: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Esborrar %(class_name)s %(instance)s requeriria esborrar els següents " +"objectes relacionats protegits: %(related_objects)s" + +msgid "Django site admin" +msgstr "Lloc administratiu de Django" + +msgid "Django administration" +msgstr "Administració de Django" + +msgid "Site administration" +msgstr "Administració del lloc" + +msgid "Log in" +msgstr "Iniciar sessió" + +#, python-format +msgid "%(app)s administration" +msgstr "Administració de %(app)s" + +msgid "Page not found" +msgstr "No s'ha pogut trobar la pàgina" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada" + +msgid "Home" +msgstr "Inici" + +msgid "Server error" +msgstr "Error del servidor" + +msgid "Server error (500)" +msgstr "Error del servidor (500)" + +msgid "Server Error (500)" +msgstr "Error del servidor (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"S'ha produït un error. Se n'ha informat els administradors del lloc per " +"correu electrònic, i hauria d'arreglar-se en breu. Gràcies per la vostra " +"paciència." + +msgid "Run the selected action" +msgstr "Executar l'acció seleccionada" + +msgid "Go" +msgstr "Anar" + +msgid "Click here to select the objects across all pages" +msgstr "Feu clic aquí per seleccionar els objectes a totes les pàgines" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Seleccioneu tots %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Netejar la selecció" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primer, entreu un nom d'usuari i una contrasenya. Després podreu editar més " +"opcions de l'usuari." + +msgid "Enter a username and password." +msgstr "Introduïu un nom d'usuari i contrasenya." + +msgid "Change password" +msgstr "Canviar contrasenya" + +msgid "Please correct the error below." +msgstr "Si us plau, corregeix l'error de sota" + +msgid "Please correct the errors below." +msgstr "Si us plau, corregiu els errors mostrats a sota." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Introduïu una contrasenya per l'usuari %(username)s" + +msgid "Welcome," +msgstr "Benvingut/da," + +msgid "View site" +msgstr "Veure lloc" + +msgid "Documentation" +msgstr "Documentació" + +msgid "Log out" +msgstr "Finalitzar sessió" + +#, python-format +msgid "Add %(name)s" +msgstr "Afegir %(name)s" + +msgid "History" +msgstr "Històric" + +msgid "View on site" +msgstr "Veure al lloc" + +msgid "Filter" +msgstr "Filtre" + +msgid "Remove from sorting" +msgstr "Treure de la ordenació" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioritat d'ordenació: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Commutar ordenació" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació " +"d'objectes relacionats, però el vostre compte no te permisos per esborrar " +"els tipus d'objecte següents:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Esborrar %(object_name)s '%(escaped_object)s' requeriria esborrar els " +"següents objectes relacionats protegits:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Esteu segurs de voler esborrar els/les %(object_name)s \"%(escaped_object)s" +"\"? S'esborraran els següents elements relacionats:" + +msgid "Objects" +msgstr "Objectes" + +msgid "Yes, I'm sure" +msgstr "Sí, n'estic segur" + +msgid "No, take me back" +msgstr "No, torna endarrere" + +msgid "Delete multiple objects" +msgstr "Eliminar múltiples objectes" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Esborrar els %(objects_name)s seleccionats faria que s'esborréssin objectes " +"relacionats, però el vostre compte no té permisos per esborrar els següents " +"tipus d'objectes:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Esborrar els %(objects_name)s seleccionats requeriria esborrar els següents " +"objectes relacionats protegits:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"N'esteu segur de voler esborrar els %(objects_name)s seleccionats? " +"S'esborraran tots els objects següents i els seus elements relacionats:" + +msgid "View" +msgstr "Visualitza" + +msgid "Delete?" +msgstr "Eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Per %(filter_title)s " + +msgid "Summary" +msgstr "Resum" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models en l'aplicació %(name)s" + +msgid "Add" +msgstr "Afegir" + +msgid "You don't have permission to view or edit anything." +msgstr "No teniu permisos per veure o editar" + +msgid "Recent actions" +msgstr "Accions recents" + +msgid "My actions" +msgstr "Les meves accions" + +msgid "None available" +msgstr "Cap disponible" + +msgid "Unknown content" +msgstr "Contingut desconegut" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Hi ha algun problema a la instal·lació de la vostra base de dades. Assegureu-" +"vos que s'han creat les taules adients, i que la base de dades és llegible " +"per l'usuari apropiat." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Esteu identificats com a %(username)s, però no esteu autoritzats a accedir a " +"aquesta pàgina. Voleu identificar-vos amb un compte d'usuari diferent?" + +msgid "Forgotten your password or username?" +msgstr "Heu oblidat la vostra contrasenya o nom d'usuari?" + +msgid "Date/time" +msgstr "Data/hora" + +msgid "User" +msgstr "Usuari" + +msgid "Action" +msgstr "Acció" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Aquest objecte no té historial de canvis. Probablement no es va afegir " +"utilitzant aquest lloc administratiu." + +msgid "Show all" +msgstr "Mostrar tots" + +msgid "Save" +msgstr "Desar" + +msgid "Popup closing…" +msgstr "Tancant finestra emergent..." + +msgid "Search" +msgstr "Cerca" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultat" +msgstr[1] "%(counter)s resultats" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s en total" + +msgid "Save as new" +msgstr "Desar com a nou" + +msgid "Save and add another" +msgstr "Desar i afegir-ne un de nou" + +msgid "Save and continue editing" +msgstr "Desar i continuar editant" + +msgid "Save and view" +msgstr "Desa i visualitza" + +msgid "Close" +msgstr "Tanca" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Canviea el %(model)s seleccionat" + +#, python-format +msgid "Add another %(model)s" +msgstr "Afegeix un altre %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Esborra el %(model)s seleccionat" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gràcies per passar una estona de qualitat al web durant el dia d'avui." + +msgid "Log in again" +msgstr "Iniciar sessió de nou" + +msgid "Password change" +msgstr "Canvi de contrasenya" + +msgid "Your password was changed." +msgstr "La seva contrasenya ha estat canviada." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Si us plau, introduïu la vostra contrasenya antiga, per seguretat, i tot " +"seguit introduïu la vostra contrasenya nova dues vegades per verificar que " +"l'heu escrita correctament." + +msgid "Change my password" +msgstr "Canviar la meva contrasenya:" + +msgid "Password reset" +msgstr "Restablir contrasenya" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"S'ha canviat la vostra contrasenya. Ara podeu continuar i iniciar sessió." + +msgid "Password reset confirmation" +msgstr "Confirmació de restabliment de contrasenya" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Si us plau, introduïu la vostra nova contrasenya dues vegades, per verificar " +"que l'heu escrita correctament." + +msgid "New password:" +msgstr "Contrasenya nova:" + +msgid "Confirm password:" +msgstr "Confirmar contrasenya:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"L'enllaç de restabliment de contrasenya era invàlid, potser perquè ja s'ha " +"utilitzat. Si us plau, sol·liciteu un nou reestabliment de contrasenya." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Li hem enviat instruccions per establir la seva contrasenya, donat que hi " +"hagi un compte associat al correu introduït. L'hauríeu de rebre en breu." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Si no rebeu un correu, assegureu-vos que heu introduït l'adreça amb la que " +"us vau registrar, i comproveu la vostra carpeta de \"spam\"." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Heu rebut aquest correu perquè vau sol·licitar restablir la contrasenya per " +"al vostre compte d'usuari a %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Si us plau, aneu a la pàgina següent i escolliu una nova contrasenya:" + +msgid "Your username, in case you've forgotten:" +msgstr "El vostre nom d'usuari, en cas que l'hagueu oblidat:" + +msgid "Thanks for using our site!" +msgstr "Gràcies per fer ús del nostre lloc!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "L'equip de %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Heu oblidat la vostra contrasenya? Introduïu la vostra adreça de correu " +"electrònic a sota, i us enviarem instruccions per canviar-la." + +msgid "Email address:" +msgstr "Adreça de correu electrònic:" + +msgid "Reset my password" +msgstr "Restablir la meva contrasenya" + +msgid "All dates" +msgstr "Totes les dates" + +#, python-format +msgid "Select %s" +msgstr "Seleccioneu %s" + +#, python-format +msgid "Select %s to change" +msgstr "Seleccioneu %s per modificar" + +#, python-format +msgid "Select %s to view" +msgstr "Selecciona %sper a veure" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Cercar" + +msgid "Currently:" +msgstr "Actualment:" + +msgid "Change:" +msgstr "Canviar:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..82e82f7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,675 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Maredudd ap Gwyndaf , 2014 +# pjrobertson, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " +"11) ? 2 : 3;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Dilëwyd %(count)d %(items)s yn llwyddiannus." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ni ellir dileu %(name)s" + +msgid "Are you sure?" +msgstr "Ydych yn sicr?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Dileu y %(verbose_name_plural)s â ddewiswyd" + +msgid "Administration" +msgstr "Gweinyddu" + +msgid "All" +msgstr "Pob un" + +msgid "Yes" +msgstr "Ie" + +msgid "No" +msgstr "Na" + +msgid "Unknown" +msgstr "Anhysybys" + +msgid "Any date" +msgstr "Unrhyw ddyddiad" + +msgid "Today" +msgstr "Heddiw" + +msgid "Past 7 days" +msgstr "7 diwrnod diwethaf" + +msgid "This month" +msgstr "Mis yma" + +msgid "This year" +msgstr "Eleni" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Teipiwch yr %(username)s a chyfrinair cywir ar gyfer cyfrif staff. Noder y " +"gall y ddau faes fod yn sensitif i lythrennau bach a llythrennau bras." + +msgid "Action:" +msgstr "Gweithred:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Ychwanegu %(verbose_name)s arall" + +msgid "Remove" +msgstr "Gwaredu" + +msgid "action time" +msgstr "amser y weithred" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "id gwrthrych" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr gwrthrych" + +msgid "action flag" +msgstr "fflag gweithred" + +msgid "change message" +msgstr "neges y newid" + +msgid "log entry" +msgstr "cofnod" + +msgid "log entries" +msgstr "cofnodion" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Ychwanegwyd \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Newidwyd \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Dilëwyd \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Gwrthrych LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "a" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Ni newidwyd unrhwy feysydd." + +msgid "None" +msgstr "Dim" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Rhaid dewis eitemau er mwyn gweithredu arnynt. Ni ddewiswyd unrhyw eitemau." + +msgid "No action selected." +msgstr "Ni ddewiswyd gweithred." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Dilëwyd %(name)s \"%(obj)s\" yn llwyddiannus." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Ychwanegu %s" + +#, python-format +msgid "Change %s" +msgstr "Newid %s" + +msgid "Database error" +msgstr "Gwall cronfa ddata" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "Newidwyd %(count)s %(name)s yn llwyddiannus" +msgstr[1] "Newidwyd %(count)s %(name)s yn llwyddiannus" +msgstr[2] "Newidwyd %(count)s %(name)s yn llwyddiannus" +msgstr[3] "Newidwyd %(count)s %(name)s yn llwyddiannus" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Dewiswyd %(total_count)s" +msgstr[1] "Dewiswyd %(total_count)s" +msgstr[2] "Dewiswyd %(total_count)s" +msgstr[3] "Dewiswyd %(total_count)s" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Dewiswyd 0 o %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "Hanes newid: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Byddai dileu %(class_name)s %(instance)s yn golygu dileu'r gwrthrychau " +"gwarchodedig canlynol sy'n perthyn: %(related_objects)s" + +msgid "Django site admin" +msgstr "Adran weinyddol safle Django" + +msgid "Django administration" +msgstr "Gweinyddu Django" + +msgid "Site administration" +msgstr "Gweinyddu'r safle" + +msgid "Log in" +msgstr "Mewngofnodi" + +#, python-format +msgid "%(app)s administration" +msgstr "Gweinyddu %(app)s" + +msgid "Page not found" +msgstr "Ni ddarganfyddwyd y dudalen" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Mae'n ddrwg gennym, ond ni ddarganfuwyd y dudalen" + +msgid "Home" +msgstr "Hafan" + +msgid "Server error" +msgstr "Gwall gweinydd" + +msgid "Server error (500)" +msgstr "Gwall gweinydd (500)" + +msgid "Server Error (500)" +msgstr "Gwall Gweinydd (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Mae gwall ac gyrrwyd adroddiad ohono i weinyddwyr y wefan drwy ebost a dylai " +"gael ei drwsio yn fuan. Diolch am fod yn amyneddgar." + +msgid "Run the selected action" +msgstr "Rhedeg y weithred a ddewiswyd" + +msgid "Go" +msgstr "Ffwrdd â ni" + +msgid "Click here to select the objects across all pages" +msgstr "" +"Cliciwch fan hyn i ddewis yr holl wrthrychau ar draws yr holl dudalennau" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Dewis y %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Clirio'r dewis" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Yn gyntaf, rhowch enw defnyddiwr a chyfrinair. Yna byddwch yn gallu golygu " +"mwy o ddewisiadau." + +msgid "Enter a username and password." +msgstr "Rhowch enw defnyddiwr a chyfrinair." + +msgid "Change password" +msgstr "Newid cyfrinair" + +msgid "Please correct the error below." +msgstr "Cywirwch y gwall isod." + +msgid "Please correct the errors below." +msgstr "Cywirwch y gwallau isod." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Rhowch gyfrinair newydd i'r defnyddiwr %(username)s." + +msgid "Welcome," +msgstr "Croeso," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Dogfennaeth" + +msgid "Log out" +msgstr "Allgofnodi" + +#, python-format +msgid "Add %(name)s" +msgstr "Ychwanegu %(name)s" + +msgid "History" +msgstr "Hanes" + +msgid "View on site" +msgstr "Gweld ar y safle" + +msgid "Filter" +msgstr "Hidl" + +msgid "Remove from sorting" +msgstr "Gwaredu o'r didoli" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Blaenoriaeth didoli: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Toglio didoli" + +msgid "Delete" +msgstr "Dileu" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " +"gwrthrychau sy'n perthyn, ond nid oes ganddoch ganiatâd i ddileu y mathau " +"canlynol o wrthrychau:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Byddai dileu %(object_name)s '%(escaped_object)s' yn golygu dileu'r " +"gwrthrychau gwarchodedig canlynol sy'n perthyn:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Ydw, rwy'n sicr" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Byddai dileu %(objects_name)s yn golygu dileu'r gwrthrychau gwarchodedig " +"canlynol sy'n perthyn:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ydych yn sicr eich bod am ddileu'r %(objects_name)s a ddewiswyd? Dilëir yr " +"holl wrthrychau canlynol a'u heitemau perthnasol:" + +msgid "Change" +msgstr "Newid" + +msgid "Delete?" +msgstr "Dileu?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Wrth %(filter_title)s" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelau yn y rhaglen %(name)s " + +msgid "Add" +msgstr "Ychwanegu" + +msgid "You don't have permission to edit anything." +msgstr "Does gennych ddim hawl i olygu unrhywbeth." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Dim ar gael" + +msgid "Unknown content" +msgstr "Cynnwys anhysbys" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Mae rhywbeth o'i le ar osodiad y gronfa ddata. Sicrhewch fod y tablau " +"cronfa ddata priodol wedi eu creu, a sicrhewch fod y gronfa ddata yn " +"ddarllenadwy gan y defnyddiwr priodol." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Anghofioch eich cyfrinair neu enw defnyddiwr?" + +msgid "Date/time" +msgstr "Dyddiad/amser" + +msgid "User" +msgstr "Defnyddiwr" + +msgid "Action" +msgstr "Gweithred" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg nad ei ychwanegwyd " +"drwy'r safle gweinydd yma." + +msgid "Show all" +msgstr "Dangos pob canlyniad" + +msgid "Save" +msgstr "Cadw" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Chwilio" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s canlyniad" +msgstr[1] "%(counter)s canlyniad" +msgstr[2] "%(counter)s canlyniad" +msgstr[3] "%(counter)s canlyniad" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "Cyfanswm o %(full_result_count)s" + +msgid "Save as new" +msgstr "Cadw fel newydd" + +msgid "Save and add another" +msgstr "Cadw ac ychwanegu un arall" + +msgid "Save and continue editing" +msgstr "Cadw a pharhau i olygu" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Diolch am dreulio amser o ansawdd gyda'r safle we yma heddiw." + +msgid "Log in again" +msgstr "Mewngofnodi eto" + +msgid "Password change" +msgstr "Newid cyfrinair" + +msgid "Your password was changed." +msgstr "Newidwyd eich cyfrinair." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Rhowch eich hen gyfrinair, er mwyn diogelwch, ac yna rhowch eich cyfrinair " +"newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." + +msgid "Change my password" +msgstr "Newid fy nghyfrinair" + +msgid "Password reset" +msgstr "Ailosod cyfrinair" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Mae'ch cyfrinair wedi ei osod. Gallwch fewngofnodi nawr." + +msgid "Password reset confirmation" +msgstr "Cadarnhad ailosod cyfrinair" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Rhowch eich cyfrinair newydd ddwywaith er mwyn gwirio y'i teipiwyd yn gywir." + +msgid "New password:" +msgstr "Cyfrinair newydd:" + +msgid "Confirm password:" +msgstr "Cadarnhewch y cyfrinair:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Roedd y ddolen i ailosod y cyfrinair yn annilys, o bosib oherwydd ei fod " +"wedi ei ddefnyddio'n barod. Gofynnwch i ailosod y cyfrinair eto." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Os na dderbyniwch ebost, sicrhewych y rhoddwyd y cyfeiriad sydd wedi ei " +"gofrestru gyda ni, ac edrychwch yn eich ffolder sbam." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Derbyniwch yr ebost hwn oherwydd i chi ofyn i ailosod y cyfrinair i'ch " +"cyfrif yn %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Ewch i'r dudalen olynol a dewsiwch gyfrinair newydd:" + +msgid "Your username, in case you've forgotten:" +msgstr "Eich enw defnyddiwr, rhag ofn eich bod wedi anghofio:" + +msgid "Thanks for using our site!" +msgstr "Diolch am ddefnyddio ein safle!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Tîm %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Anghofioch eich cyfrinair? Rhowch eich cyfeiriad ebost isod ac fe ebostiwn " +"gyfarwyddiadau ar osod un newydd." + +msgid "Email address:" +msgstr "Cyfeiriad ebost:" + +msgid "Reset my password" +msgstr "Ailosod fy nghyfrinair" + +msgid "All dates" +msgstr "Holl ddyddiadau" + +#, python-format +msgid "Select %s" +msgstr "Dewis %s" + +#, python-format +msgid "Select %s to change" +msgstr "Dewis %s i newid" + +msgid "Date:" +msgstr "Dyddiad:" + +msgid "Time:" +msgstr "Amser:" + +msgid "Lookup" +msgstr "Archwilio" + +msgid "Currently:" +msgstr "Cyfredol:" + +msgid "Change:" +msgstr "Newid:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..48aae7b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..af7598a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,715 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-19 10:13+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"language/dsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: dsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s su se wulašowali." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s njedajo se lašowaś" + +msgid "Are you sure?" +msgstr "Sćo se wěsty?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Wubrane %(verbose_name_plural)s lašowaś" + +msgid "Administration" +msgstr "Administracija" + +msgid "All" +msgstr "Wšykne" + +msgid "Yes" +msgstr "Jo" + +msgid "No" +msgstr "Ně" + +msgid "Unknown" +msgstr "Njeznaty" + +msgid "Any date" +msgstr "Někaki datum" + +msgid "Today" +msgstr "Źinsa" + +msgid "Past 7 days" +msgstr "Zachadne 7 dnjow" + +msgid "This month" +msgstr "Toś ten mjasec" + +msgid "This year" +msgstr "W tom lěśe" + +msgid "No date" +msgstr "Žeden datum" + +msgid "Has date" +msgstr "Ma datum" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Pšosym zapódajśo korektne %(username)s a gronidło za personalne konto. " +"Źiwajśo na to, až wobej póli móžotej mjazy wjeliko- a małopisanim rozeznawaś." + +msgid "Action:" +msgstr "Akcija:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Dalšne %(verbose_name)s pśidaś" + +msgid "Remove" +msgstr "Wótpóraś" + +msgid "Addition" +msgstr "Pśidanje" + +msgid "Change" +msgstr "Změniś" + +msgid "Deletion" +msgstr "Wulašowanje" + +msgid "action time" +msgstr "akciski cas" + +msgid "user" +msgstr "wužywaŕ" + +msgid "content type" +msgstr "wopśimjeśowy typ" + +msgid "object id" +msgstr "objektowy id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "objektowa reprezentacija" + +msgid "action flag" +msgstr "akciske markěrowanje" + +msgid "change message" +msgstr "změnowa powěźeńka" + +msgid "log entry" +msgstr "protokolowy zapisk" + +msgid "log entries" +msgstr "protokolowe zapiski" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "„%(object)s“ pśidane." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "„%(object)s“ změnjone - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "„%(object)s“ wulašowane." + +msgid "LogEntry Object" +msgstr "Objekt LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} „{object} pśidany." + +msgid "Added." +msgstr "Pśidany." + +msgid "and" +msgstr "a" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{fields} za {name} „{object} změnjone." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} změnjone." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Deleted {name} „{object} wulašowane." + +msgid "No fields changed." +msgstr "Žedne póla změnjone." + +msgid "None" +msgstr "Žeden" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "´Źaržćo „ctrl“ abo „cmd“ na Mac tłocony, aby wusej jadnogo wubrał." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" jo se wuspěšnje pśidał." + +msgid "You may edit it again below." +msgstr "Móźośo dołojce znowego wobźěłaś." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" jo se wuspěšnje pśidał. Móžośo dołojce dalšne {name} pśidaś." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" jo se wuspěšnje změnił. Móžośo jen dołojce znowego " +"wobźěłowaś." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" jo se wuspěšnje pśidał. Móžośo jen dołojce znowego " +"wobźěłowaś." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" jo se wuspěšnje změnił. Móžośo dołojce dalšne {name} pśidaś." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" jo se wuspěšnje změnił." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Zapiski muse se wubraś, aby akcije na nje nałožowało. Zapiski njejsu se " +"změnili." + +msgid "No action selected." +msgstr "Žedna akcija wubrana." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" jo se wuspěšnje wulašował." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s z ID \" %(key)s\" njeeksistěrujo. Jo se snaź wulašowało?" + +#, python-format +msgid "Add %s" +msgstr "%s pśidaś" + +#, python-format +msgid "Change %s" +msgstr "%s změniś" + +#, python-format +msgid "View %s" +msgstr "%s pokazaś" + +msgid "Database error" +msgstr "Zmólka datoweje banki" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s jo se wuspěšnje změnił." +msgstr[1] "%(count)s %(name)s stej se wuspěšnje změniłej." +msgstr[2] "%(count)s %(name)s su se wuspěšnje změnili." +msgstr[3] "%(count)s %(name)s jo se wuspěšnje změniło." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s wubrany" +msgstr[1] "Wšykne %(total_count)s wubranej" +msgstr[2] "Wšykne %(total_count)s wubrane" +msgstr[3] "Wšykne %(total_count)s wubranych" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 z %(cnt)s wubranych" + +#, python-format +msgid "Change history: %s" +msgstr "Změnowa historija: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Aby se %(class_name)s %(instance)s lašowało, muse se slědujuce šćitane " +"objekty lašowaś: %(related_objects)s" + +msgid "Django site admin" +msgstr "Administrator sedła Django" + +msgid "Django administration" +msgstr "Administracija Django" + +msgid "Site administration" +msgstr "Sedłowa administracija" + +msgid "Log in" +msgstr "Pśizjawiś" + +#, python-format +msgid "%(app)s administration" +msgstr "Administracija %(app)s" + +msgid "Page not found" +msgstr "Bok njejo se namakał" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Jo nam luto, ale pominany bok njedajo se namakaś." + +msgid "Home" +msgstr "Startowy bok" + +msgid "Server error" +msgstr "Serwerowa zmólka" + +msgid "Server error (500)" +msgstr "Serwerowa zmólka (500)" + +msgid "Server Error (500)" +msgstr "Serwerowa zmólka (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Zmólka jo nastała. Jo se sedłowym administratoram pśez e-mail k wěsći dała a " +"by dejała se skóro wótpóraś. Źěkujomse za wašu sćerpmosć." + +msgid "Run the selected action" +msgstr "Wubranu akciju wuwjasć" + +msgid "Go" +msgstr "Start" + +msgid "Click here to select the objects across all pages" +msgstr "Klikniśo how, aby objekty wšych bokow wubrał" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Wubjeŕśo wšykne %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Wuběrk lašowaś" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Zapódajśo nejpjerwjej wužywarske mě a gronidło. Pótom móžośo dalšne " +"wužywarske nastajenja wobźěłowaś." + +msgid "Enter a username and password." +msgstr "Zapódajśo wužywarske mě a gronidło." + +msgid "Change password" +msgstr "Gronidło změniś" + +msgid "Please correct the error below." +msgstr "Pšosym korigěrujśo slědujucu zmólku." + +msgid "Please correct the errors below." +msgstr "Pšosym skorigěrujśo slědujuce zmólki." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Zapódajśo nowe gronidło za wužywarja %(username)s." + +msgid "Welcome," +msgstr "Witajśo," + +msgid "View site" +msgstr "Sedło pokazaś" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Log out" +msgstr "Wótzjawiś" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s pśidaś" + +msgid "History" +msgstr "Historija" + +msgid "View on site" +msgstr "Na sedle pokazaś" + +msgid "Filter" +msgstr "Filtrowaś" + +msgid "Remove from sorting" +msgstr "Ze sortěrowanja wótpóraś" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sortěrowański rěd: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Sortěrowanje pśešaltowaś" + +msgid "Delete" +msgstr "Lašowaś" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Gaž se %(object_name)s '%(escaped_object)s' lašujo, se pśisłušne objekty " +"wulašuju, ale wašo konto njama pšawo slědujuce typy objektow lašowaś: " + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Aby se %(object_name)s '%(escaped_object)s' lašujo, muse se slědujuce " +"šćitane pśisłušne objekty lašowaś:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Cośo napšawdu %(object_name)s „%(escaped_object)s“ lašowaś? Wšykne slědujuce " +"pśisłušne zapiski se wulašuju: " + +msgid "Objects" +msgstr "Objekty" + +msgid "Yes, I'm sure" +msgstr "Jo, som se wěsty" + +msgid "No, take me back" +msgstr "Ně, pšosym slědk" + +msgid "Delete multiple objects" +msgstr "Někotare objekty lašowaś" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Gaž lašujośo wubrany %(objects_name)s, se pśisłušne objekty wulašuju, ale " +"wašo konto njama pšawo slědujuce typy objektow lašowaś: " + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Aby wubrany %(objects_name)s lašowało, muse se slědujuce šćitane pśisłušne " +"objekty lašowaś:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Cośo napšawdu wubrany %(objects_name)s lašowaś? Wšykne slědujuce objekty a " +"jich pśisłušne zapiski se wulašuju:" + +msgid "View" +msgstr "Pokazaś" + +msgid "Delete?" +msgstr "Lašowaś?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Pó %(filter_title)s " + +msgid "Summary" +msgstr "Zespominanje" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w nałoženju %(name)s" + +msgid "Add" +msgstr "Pśidaś" + +msgid "You don't have permission to view or edit anything." +msgstr "Njamaśo pšawo něco pokazaś abo wobźěłaś" + +msgid "Recent actions" +msgstr "Nejnowše akcije" + +msgid "My actions" +msgstr "Móje akcije" + +msgid "None available" +msgstr "Žeden k dispoziciji" + +msgid "Unknown content" +msgstr "Njeznate wopśimjeśe" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Něco jo z wašeju instalaciju datoweje banki kśiwje šło. Pśeznańśo se, až " +"wótpowědne tabele datoweje banki su se napórali a pótom, až datowa banka " +"dajo se wót wótpówědnego wužywarja cytaś." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Sćo ako %(username)s awtentificěrowany, ale njamaśo pśistup na toś ten bok. " +"Cośo se pla drugego konta pśizjawiś?" + +msgid "Forgotten your password or username?" +msgstr "Sćo swójo gronidło abo wužywarske mě zabył?" + +msgid "Date/time" +msgstr "Datum/cas" + +msgid "User" +msgstr "Wužywaŕ" + +msgid "Action" +msgstr "Akcija" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Toś ten objekt njama změnowu historiju. Jo se nejskerjej pśez toś to " +"administratorowe sedło pśidał." + +msgid "Show all" +msgstr "Wšykne pokazaś" + +msgid "Save" +msgstr "Składowaś" + +msgid "Popup closing…" +msgstr "Wuskokujuce wokno se zacynja…" + +msgid "Search" +msgstr "Pytaś" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s wuslědk" +msgstr[1] "%(counter)s wuslědka" +msgstr[2] "%(counter)s wuslědki" +msgstr[3] "%(counter)s wuslědkow" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s dogromady" + +msgid "Save as new" +msgstr "Ako nowy składowaś" + +msgid "Save and add another" +msgstr "Składowaś a dalšny pśidaś" + +msgid "Save and continue editing" +msgstr "Składowaś a dalej wobźěłowaś" + +msgid "Save and view" +msgstr "Składowaś a pokazaś" + +msgid "Close" +msgstr "Zacyniś" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Wubrane %(model)s změniś" + +#, python-format +msgid "Add another %(model)s" +msgstr "Dalšny %(model)s pśidaś" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Wubrane %(model)s lašowaś" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Źěkujomy se, až sćo źinsa wěsty cas na websedle pśebywał." + +msgid "Log in again" +msgstr "Hyšći raz pśizjawiś" + +msgid "Password change" +msgstr "Gronidło změniś" + +msgid "Your password was changed." +msgstr "Wašo gronidło jo se změniło." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Pšosym zapódajśo k swójej wěstośe swójo stare gronidło a pótom swójo nowe " +"gronidło dwójcy, aby my mógli pśeglědowaś, lěc sćo jo korektnje zapisał." + +msgid "Change my password" +msgstr "Mójo gronidło změniś" + +msgid "Password reset" +msgstr "Gronidło jo se slědk stajiło" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Wašo gronidło jo se póstajiło. Móžośo pókšacowaś a se něnto pśizjawiś." + +msgid "Password reset confirmation" +msgstr "Wobkšuśenje slědkstajenja gronidła" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Pšosym zapódajśo swójo nowe gronidło dwójcy, aby my mógli pśeglědowaś, lěc " +"sći jo korektnje zapisał." + +msgid "New password:" +msgstr "Nowe gronidło:" + +msgid "Confirm password:" +msgstr "Gronidło wobkšuśiś:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Wótkaz za slědkstajenje gronidła jo njepłaśiwy był, snaź dokulaž jo se južo " +"wužył. Pšosym pšosćo wó nowe slědkstajenje gronidła." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Smy wam instrukcije za nastajenje wašogo gronidła pśez e-mail pósłali, jolic " +"konto ze zapódaneju e-mailoweju adresu eksistěrujo. Wy by dejał ju skóro " +"dostaś." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Jolic mejlku njedostawaśo, pśeznańśo se, až sćo adresu zapódał, z kótarejuž " +"sćo zregistrěrował, a pśeglědajśo swój spamowy zarědnik." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Dostawaśo toś tu mejlku, dokulaž sćo za swójo wužywarske konto na " +"%(site_name)s wó slědkstajenje gronidła pšosył." + +msgid "Please go to the following page and choose a new password:" +msgstr "Pšosym źiśo k slědujucemu bokoju a wubjeŕśo nowe gronidło:" + +msgid "Your username, in case you've forgotten:" +msgstr "Wašo wužywarske mě, jolic sćo jo zabył:" + +msgid "Thanks for using our site!" +msgstr "Wjeliki źěk za wužywanje našogo sedła!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Team %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Sćo swójo gronidło zabył? Zapódajśo dołojce swóju e-mailowu adresu a " +"pósćelomy wam instrukcije za nastajenje nowego gronidła pśez e-mail." + +msgid "Email address:" +msgstr "E-mailowa adresa:" + +msgid "Reset my password" +msgstr "Mójo gronidło slědk stajiś" + +msgid "All dates" +msgstr "Wšykne daty" + +#, python-format +msgid "Select %s" +msgstr "%s wubraś" + +#, python-format +msgid "Select %s to change" +msgstr "%s wubraś, aby se změniło" + +#, python-format +msgid "Select %s to view" +msgstr "%s wubraś, kótaryž ma se pokazaś" + +msgid "Date:" +msgstr "Datum:" + +msgid "Time:" +msgstr "Cas:" + +msgid "Lookup" +msgstr "Pytanje" + +msgid "Currently:" +msgstr "Tuchylu:" + +msgid "Change:" +msgstr "Změniś:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..185749c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b20f7bd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..167a0db --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,691 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Adam Forster , 2019 +# jon_atkinson , 2011-2012 +# Ross Poulton , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-04-05 10:37+0000\n" +"Last-Translator: Adam Forster \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Successfully deleted %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Cannot delete %(name)s" + +msgid "Are you sure?" +msgstr "Are you sure?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Delete selected %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Administration" + +msgid "All" +msgstr "All" + +msgid "Yes" +msgstr "Yes" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Unknown" + +msgid "Any date" +msgstr "Any date" + +msgid "Today" +msgstr "Today" + +msgid "Past 7 days" +msgstr "Past 7 days" + +msgid "This month" +msgstr "This month" + +msgid "This year" +msgstr "This year" + +msgid "No date" +msgstr "No date" + +msgid "Has date" +msgstr "Has date" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." + +msgid "Action:" +msgstr "Action:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Add another %(verbose_name)s" + +msgid "Remove" +msgstr "Remove" + +msgid "Addition" +msgstr "Addition" + +msgid "Change" +msgstr "Change" + +msgid "Deletion" +msgstr "Deletion" + +msgid "action time" +msgstr "action time" + +msgid "user" +msgstr "user" + +msgid "content type" +msgstr "content type" + +msgid "object id" +msgstr "object id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "object repr" + +msgid "action flag" +msgstr "action flag" + +msgid "change message" +msgstr "change message" + +msgid "log entry" +msgstr "log entry" + +msgid "log entries" +msgstr "log entries" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Added \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Changed \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Deleted \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "LogEntry Object" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Added {name} \"{object}\"." + +msgid "Added." +msgstr "Added." + +msgid "and" +msgstr "and" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "No fields changed." + +msgid "None" +msgstr "None" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." + +msgid "No action selected." +msgstr "No action selected." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "The %(name)s \"%(obj)s\" was deleted successfully." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Add %s" + +#, python-format +msgid "Change %s" +msgstr "Change %s" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "Database error" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s was changed successfully." +msgstr[1] "%(count)s %(name)s were changed successfully." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s selected" +msgstr[1] "All %(total_count)s selected" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 of %(cnt)s selected" + +#, python-format +msgid "Change history: %s" +msgstr "Change history: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django site admin" + +msgid "Django administration" +msgstr "Django administration" + +msgid "Site administration" +msgstr "Site administration" + +msgid "Log in" +msgstr "Log in" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Page not found" + +msgid "We're sorry, but the requested page could not be found." +msgstr "We're sorry, but the requested page could not be found." + +msgid "Home" +msgstr "Home" + +msgid "Server error" +msgstr "Server error" + +msgid "Server error (500)" +msgstr "Server error (500)" + +msgid "Server Error (500)" +msgstr "Server Error (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Run the selected action" + +msgid "Go" +msgstr "Go" + +msgid "Click here to select the objects across all pages" +msgstr "Click here to select the objects across all pages" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Select all %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Clear selection" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." + +msgid "Enter a username and password." +msgstr "Enter a username and password." + +msgid "Change password" +msgstr "Change password" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Enter a new password for the user %(username)s." + +msgid "Welcome," +msgstr "Welcome," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Documentation" + +msgid "Log out" +msgstr "Log out" + +#, python-format +msgid "Add %(name)s" +msgstr "Add %(name)s" + +msgid "History" +msgstr "History" + +msgid "View on site" +msgstr "View on site" + +msgid "Filter" +msgstr "Filter" + +msgid "Remove from sorting" +msgstr "Remove from sorting" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sorting priority: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Toggle sorting" + +msgid "Delete" +msgstr "Delete" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Yes, I'm sure" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Delete multiple objects" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "Delete?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " By %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Add" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "None available" + +msgid "Unknown content" +msgstr "Unknown content" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Forgotten your password or username?" + +msgid "Date/time" +msgstr "Date/time" + +msgid "User" +msgstr "User" + +msgid "Action" +msgstr "Action" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." + +msgid "Show all" +msgstr "Show all" + +msgid "Save" +msgstr "Save" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Search" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s result" +msgstr[1] "%(counter)s results" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s total" + +msgid "Save as new" +msgstr "Save as new" + +msgid "Save and add another" +msgstr "Save and add another" + +msgid "Save and continue editing" +msgstr "Save and continue editing" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Thanks for spending some quality time with the Web site today." + +msgid "Log in again" +msgstr "Log in again" + +msgid "Password change" +msgstr "Password change" + +msgid "Your password was changed." +msgstr "Your password was changed." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." + +msgid "Change my password" +msgstr "Change my password" + +msgid "Password reset" +msgstr "Password reset" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Your password has been set. You may go ahead and log in now." + +msgid "Password reset confirmation" +msgstr "Password reset confirmation" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." + +msgid "New password:" +msgstr "New password:" + +msgid "Confirm password:" +msgstr "Confirm password:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "Please go to the following page and choose a new password:" + +msgid "Your username, in case you've forgotten:" +msgstr "Your username, in case you've forgotten:" + +msgid "Thanks for using our site!" +msgstr "Thanks for using our site!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "The %(site_name)s team" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "Reset my password" + +msgid "All dates" +msgstr "All dates" + +#, python-format +msgid "Select %s" +msgstr "Select %s" + +#, python-format +msgid "Select %s to change" +msgstr "Select %s to change" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "Date:" + +msgid "Time:" +msgstr "Time:" + +msgid "Lookup" +msgstr "Lookup" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..03cf679 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/en_GB/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# jon_atkinson , 2012 +# Ross Poulton , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Available %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Type into this box to filter down the list of available %s." + +msgid "Filter" +msgstr "Filter" + +msgid "Choose all" +msgstr "Choose all" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Click to choose all %s at once." + +msgid "Choose" +msgstr "Choose" + +msgid "Remove" +msgstr "Remove" + +#, javascript-format +msgid "Chosen %s" +msgstr "Chosen %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." + +msgid "Remove all" +msgstr "Remove all" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Click to remove all chosen %s at once." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s of %(cnt)s selected" +msgstr[1] "%(sel)s of %(cnt)s selected" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "Now" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Choose a time" + +msgid "Midnight" +msgstr "Midnight" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Noon" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Cancel" + +msgid "Today" +msgstr "Today" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Yesterday" + +msgid "Tomorrow" +msgstr "Tomorrow" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Show" + +msgid "Hide" +msgstr "Hide" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..1a2d926 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,721 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Leonardo José Guzmán , 2013 +# Ramiro Morales, 2013-2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-20 14:06+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Se eliminaron con éxito %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "No se puede eliminar %(name)s" + +msgid "Are you sure?" +msgstr "¿Está seguro?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" + +msgid "Administration" +msgstr "Administración" + +msgid "All" +msgstr "Todos/as" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Desconocido" + +msgid "Any date" +msgstr "Cualquier fecha" + +msgid "Today" +msgstr "Hoy" + +msgid "Past 7 days" +msgstr "Últimos 7 días" + +msgid "This month" +msgstr "Este mes" + +msgid "This year" +msgstr "Este año" + +msgid "No date" +msgstr "Sin fecha" + +msgid "Has date" +msgstr "Tiene fecha" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Por favor introduza %(username)s y contraseña correctos de una cuenta de " +"staff. Note que puede que ambos campos sean estrictos en relación a " +"diferencias entre mayúsculas y minúsculas." + +msgid "Action:" +msgstr "Acción:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Agregar otro/a %(verbose_name)s" + +msgid "Remove" +msgstr "Eliminar" + +msgid "Addition" +msgstr "Agregado" + +msgid "Change" +msgstr "Modificar" + +msgid "Deletion" +msgstr "Borrado" + +msgid "action time" +msgstr "hora de la acción" + +msgid "user" +msgstr "usuario" + +msgid "content type" +msgstr "tipo de contenido" + +msgid "object id" +msgstr "id de objeto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "repr de objeto" + +msgid "action flag" +msgstr "marca de acción" + +msgid "change message" +msgstr "mensaje de cambio" + +msgid "log entry" +msgstr "entrada de registro" + +msgid "log entries" +msgstr "entradas de registro" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Se agrega \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Se modifica \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Se elimina \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objeto LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Se agrega {name} \"{object}\"." + +msgid "Added." +msgstr "Agregado." + +msgid "and" +msgstr "y" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Se modifican {fields} en {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Modificación de {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Se elimina {name} \"{object}\"." + +msgid "No fields changed." +msgstr "No ha modificado ningún campo." + +msgid "None" +msgstr "Ninguno" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar " +"más de uno." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "Se agregó con éxito {name} \"{obj}\"." + +msgid "You may edit it again below." +msgstr "Puede modificarlo/a nuevamente mas abajo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"Se agregó con éxito {name} \"{obj}\". Puede agregar otro/a {name} abajo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"Se modificó con éxito {name} \"{obj}\". Puede modificarlo/a nuevamente abajo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "Se agregó con éxito {name} \"{obj}\". Puede modificarlo/a abajo." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"Se modificó con éxito {name} \"{obj}\". Puede agregar otro {name} abajo." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "Se modificó con éxito {name} \"{obj}\"." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Deben existir ítems seleccionados para poder realizar acciones sobre los " +"mismos. No se modificó ningún ítem." + +msgid "No action selected." +msgstr "No se ha seleccionado ninguna acción." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "No existe %(name)s con ID \"%(key)s\". ¿Quizá fue eliminado/a?" + +#, python-format +msgid "Add %s" +msgstr "Agregar %s" + +#, python-format +msgid "Change %s" +msgstr "Modificar %s" + +#, python-format +msgid "View %s" +msgstr "Ver %s" + +msgid "Database error" +msgstr "Error de base de datos" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." +msgstr[1] "Se han modificado con éxito %(count)s %(name)s." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionados/as" +msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionados/as" + +#, python-format +msgid "Change history: %s" +msgstr "Historia de modificaciones: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"La eliminación de %(class_name)s %(instance)s provocaría la eliminación de " +"los siguientes objetos relacionados protegidos: %(related_objects)s" + +msgid "Django site admin" +msgstr "Administración de sitio Django" + +msgid "Django administration" +msgstr "Administración de Django" + +msgid "Site administration" +msgstr "Administración de sitio" + +msgid "Log in" +msgstr "Identificarse" + +#, python-format +msgid "%(app)s administration" +msgstr "Administración de %(app)s" + +msgid "Page not found" +msgstr "Página no encontrada" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Lo sentimos, pero no se encuentra la página solicitada." + +msgid "Home" +msgstr "Inicio" + +msgid "Server error" +msgstr "Error del servidor" + +msgid "Server error (500)" +msgstr "Error del servidor (500)" + +msgid "Server Error (500)" +msgstr "Error de servidor (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ha ocurrido un error. Se ha reportado el mismo a los administradores del " +"sitio vía email y debería ser solucionado en breve. Le agradecemos por su " +"paciencia." + +msgid "Run the selected action" +msgstr "Ejecutar la acción seleccionada" + +msgid "Go" +msgstr "Ejecutar" + +msgid "Click here to select the objects across all pages" +msgstr "Haga click aquí para seleccionar los objetos de todas las páginas" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Seleccionar lo(s)/a(s) %(total_count)s %(module_name)s existentes" + +msgid "Clear selection" +msgstr "Borrar selección" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primero introduzca un nombre de usuario y una contraseña. Luego podrá " +"configurar opciones adicionales acerca del usuario." + +msgid "Enter a username and password." +msgstr "Introduzca un nombre de usuario y una contraseña." + +msgid "Change password" +msgstr "Cambiar contraseña" + +msgid "Please correct the error below." +msgstr "Por favor, corrija el error detallado mas abajo." + +msgid "Please correct the errors below." +msgstr "Por favor corrija los errores detallados abajo." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Introduzca una nueva contraseña para el usuario %(username)s." + +msgid "Welcome," +msgstr "Bienvenido/a," + +msgid "View site" +msgstr "Ver sitio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Log out" +msgstr "Cerrar sesión" + +#, python-format +msgid "Add %(name)s" +msgstr "Agregar %(name)s" + +msgid "History" +msgstr "Historia" + +msgid "View on site" +msgstr "Ver en el sitio" + +msgid "Filter" +msgstr "Filtrar" + +msgid "Remove from sorting" +msgstr "Remover de ordenamiento" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioridad de ordenamiento: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "(des)activar ordenamiento" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " +"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los " +"siguientes tipos de objetos:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Eliminar los %(object_name)s '%(escaped_object)s' requeriría eliminar " +"también los siguientes objetos relacionados protegidos:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"¿Está seguro de que desea eliminar los %(object_name)s \"%(escaped_object)s" +"\"? Se eliminarán los siguientes objetos relacionados:" + +msgid "Objects" +msgstr "Objectos" + +msgid "Yes, I'm sure" +msgstr "Sí, estoy seguro" + +msgid "No, take me back" +msgstr "No, volver" + +msgid "Delete multiple objects" +msgstr "Eliminar múltiples objetos" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Eliminar el/los objetos %(objects_name)s seleccionados provocaría la " +"eliminación de objetos relacionados a los mismos, pero su cuenta de usuario " +"no tiene los permisos necesarios para eliminar los siguientes tipos de " +"objetos:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Eliminar el/los objetos %(objects_name)s seleccionados requeriría eliminar " +"también los siguientes objetos relacionados protegidos:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"¿Está seguro de que desea eliminar el/los objetos %(objects_name)s?. Todos " +"los siguientes objetos e ítems relacionados a los mismos también serán " +"eliminados:" + +msgid "View" +msgstr "Ver" + +msgid "Delete?" +msgstr "¿Eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +msgid "Summary" +msgstr "Resumen" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Agregar" + +msgid "You don't have permission to view or edit anything." +msgstr "No tiene permiso para ver o modificar nada." + +msgid "Recent actions" +msgstr "Acciones recientes" + +msgid "My actions" +msgstr "Mis acciones" + +msgid "None available" +msgstr "Ninguna disponible" + +msgid "Unknown content" +msgstr "Contenido desconocido" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Hay algún problema con su instalación de base de datos. Asegúrese de que las " +"tablas de la misma hayan sido creadas, y asegúrese de que el usuario " +"apropiado tenga permisos de lectura en la base de datos." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Ud. se halla autenticado como %(username)s, pero no está autorizado a " +"acceder a esta página ¿Desea autenticarse con una cuenta diferente?" + +msgid "Forgotten your password or username?" +msgstr "¿Olvidó su contraseña o nombre de usuario?" + +msgid "Date/time" +msgstr "Fecha/hora" + +msgid "User" +msgstr "Usuario" + +msgid "Action" +msgstr "Acción" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Este objeto no tiene historia de modificaciones. Probablemente no fue " +"añadido usando este sitio de administración." + +msgid "Show all" +msgstr "Mostrar todos/as" + +msgid "Save" +msgstr "Guardar" + +msgid "Popup closing…" +msgstr "Cerrando ventana amergente…" + +msgid "Search" +msgstr "Buscar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultado" +msgstr[1] "%(counter)s resultados" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "total: %(full_result_count)s" + +msgid "Save as new" +msgstr "Guardar como nuevo" + +msgid "Save and add another" +msgstr "Guardar y agregar otro" + +msgid "Save and continue editing" +msgstr "Guardar y continuar editando" + +msgid "Save and view" +msgstr "Guardar y ver" + +msgid "Close" +msgstr "Cerrar" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Modificar %(model)s seleccionados/as" + +#, python-format +msgid "Add another %(model)s" +msgstr "Agregar otro/a %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Eliminar %(model)s seleccionados/as" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy." + +msgid "Log in again" +msgstr "Identificarse de nuevo" + +msgid "Password change" +msgstr "Cambio de contraseña" + +msgid "Your password was changed." +msgstr "Su contraseña ha sido cambiada." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Por favor, por razones de seguridad, introduzca primero su contraseña " +"antigua y luego introduzca la nueva contraseña dos veces para verificar que " +"la ha escrito correctamente." + +msgid "Change my password" +msgstr "Cambiar mi contraseña" + +msgid "Password reset" +msgstr "Recuperar contraseña" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Su contraseña ha sido cambiada. Ahora puede continuar e ingresar." + +msgid "Password reset confirmation" +msgstr "Confirmación de reincialización de contraseña" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Por favor introduzca su nueva contraseña dos veces de manera que podamos " +"verificar que la ha escrito correctamente." + +msgid "New password:" +msgstr "Contraseña nueva:" + +msgid "Confirm password:" +msgstr "Confirme contraseña:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"El enlace de reinicialización de contraseña es inválido, posiblemente debido " +"a que ya ha sido usado. Por favor solicite una nueva reinicialización de " +"contraseña." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Se le han enviado instrucciones sobre cómo establecer su contraseña. Si la " +"dirección de email que proveyó existe, debería recibir las mismas pronto." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Si no ha recibido un email, por favor asegúrese de que ha introducido la " +"dirección de correo con la que se había registrado y verifique su carpeta de " +"Correo no deseado." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Le enviamos este email porque Ud. ha solicitado que se reestablezca la " +"contraseña para su cuenta de usuario en %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "" +"Por favor visite la página que se muestra a continuación y elija una nueva " +"contraseña:" + +msgid "Your username, in case you've forgotten:" +msgstr "Su nombre de usuario, en caso de haberlo olvidado:" + +msgid "Thanks for using our site!" +msgstr "¡Gracias por usar nuestro sitio!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"¿Olvidó su contraseña? Introduzca su dirección de email abajo y le " +"enviaremos instrucciones para establecer una nueva." + +msgid "Email address:" +msgstr "Dirección de email:" + +msgid "Reset my password" +msgstr "Recuperar mi contraseña" + +msgid "All dates" +msgstr "Todas las fechas" + +#, python-format +msgid "Select %s" +msgstr "Seleccione %s" + +#, python-format +msgid "Select %s to change" +msgstr "Seleccione %s a modificar" + +#, python-format +msgid "Select %s to view" +msgstr "Seleccione %s que desea ver" + +msgid "Date:" +msgstr "Fecha:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Buscar" + +msgid "Currently:" +msgstr "Actualmente:" + +msgid "Change:" +msgstr "Cambiar:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f806074 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..5831fbf --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,697 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# abraham.martin , 2014 +# Axel Díaz , 2015 +# Claude Paroz , 2014 +# Ernesto Avilés Vázquez , 2015 +# franchukelly , 2011 +# guillem , 2012 +# Igor Támara , 2013 +# Jannis Leidel , 2011 +# Josue Naaman Nistal Guerra , 2014 +# Marc Garcia , 2011 +# Pablo, 2015 +# Veronicabh , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 19:11+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" +"language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "No se puede eliminar %(name)s" + +msgid "Are you sure?" +msgstr "¿Está seguro?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" + +msgid "Administration" +msgstr "Administración" + +msgid "All" +msgstr "Todo" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Desconocido" + +msgid "Any date" +msgstr "Cualquier fecha" + +msgid "Today" +msgstr "Hoy" + +msgid "Past 7 days" +msgstr "Últimos 7 días" + +msgid "This month" +msgstr "Este mes" + +msgid "This year" +msgstr "Este año" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Por favor ingrese el %(username)s y la clave correctos para obtener cuenta " +"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." + +msgid "Action:" +msgstr "Acción:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Agregar %(verbose_name)s adicional." + +msgid "Remove" +msgstr "Eliminar" + +msgid "action time" +msgstr "hora de la acción" + +msgid "user" +msgstr "usuario" + +msgid "content type" +msgstr "tipo de contenido" + +msgid "object id" +msgstr "id del objeto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr del objeto" + +msgid "action flag" +msgstr "marca de acción" + +msgid "change message" +msgstr "mensaje de cambio" + +msgid "log entry" +msgstr "entrada de registro" + +msgid "log entries" +msgstr "entradas de registro" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Añadidos \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Cambiados \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Eliminado/a \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objeto de registro de Log" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "Añadido." + +msgid "and" +msgstr "y" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "No ha cambiado ningún campo." + +msgid "None" +msgstr "Ninguno" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " +"más de una opción." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " +"se han modificado elementos." + +msgid "No action selected." +msgstr "No se seleccionó ninguna acción." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Añadir %s" + +#, python-format +msgid "Change %s" +msgstr "Modificar %s" + +msgid "Database error" +msgstr "Error en la base de datos" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s fué modificado con éxito." +msgstr[1] "%(count)s %(name)s fueron modificados con éxito." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionado" +msgstr[1] "%(total_count)s seleccionados en total" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "seleccionados 0 de %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "Histórico de modificaciones: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " +"siguientes objetos relacionados protegidos: %(related_objects)s" + +msgid "Django site admin" +msgstr "Sitio de administración de Django" + +msgid "Django administration" +msgstr "Administración de Django" + +msgid "Site administration" +msgstr "Sitio administrativo" + +msgid "Log in" +msgstr "Iniciar sesión" + +#, python-format +msgid "%(app)s administration" +msgstr "Administración de %(app)s " + +msgid "Page not found" +msgstr "Página no encontrada" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Lo sentimos, pero no se encuentra la página solicitada." + +msgid "Home" +msgstr "Inicio" + +msgid "Server error" +msgstr "Error del servidor" + +msgid "Server error (500)" +msgstr "Error del servidor (500)" + +msgid "Server Error (500)" +msgstr "Error de servidor (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " +"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " +"paciencia y comprensión." + +msgid "Run the selected action" +msgstr "Ejecutar la acción seleccionada" + +msgid "Go" +msgstr "Ir" + +msgid "Click here to select the objects across all pages" +msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Seleccionar todos los %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Limpiar selección" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " +"el resto de opciones del usuario." + +msgid "Enter a username and password." +msgstr "Ingrese un nombre de usuario y contraseña" + +msgid "Change password" +msgstr "Cambiar contraseña" + +msgid "Please correct the error below." +msgstr "Por favor, corrija los siguientes errores." + +msgid "Please correct the errors below." +msgstr "Por favor, corrija los siguientes errores." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Ingrese una nueva contraseña para el usuario %(username)s." + +msgid "Welcome," +msgstr "Bienvenido/a," + +msgid "View site" +msgstr "Ver el sitio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Log out" +msgstr "Terminar sesión" + +#, python-format +msgid "Add %(name)s" +msgstr "Añadir %(name)s" + +msgid "History" +msgstr "Histórico" + +msgid "View on site" +msgstr "Ver en el sitio" + +msgid "Filter" +msgstr "Filtro" + +msgid "Remove from sorting" +msgstr "Elimina de la ordenación" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioridad de la ordenación: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Activar la ordenación" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " +"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " +"siguientes tipos de objetos:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"La eliminación de %(object_name)s %(escaped_object)s requeriría eliminar los " +"siguientes objetos relacionados protegidos:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" +"\"? Se borrarán los siguientes objetos relacionados:" + +msgid "Objects" +msgstr "Objetos" + +msgid "Yes, I'm sure" +msgstr "Sí, estoy seguro" + +msgid "No, take me back" +msgstr "No, llévame atrás" + +msgid "Delete multiple objects" +msgstr "Eliminar múltiples objetos." + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"La eliminación del %(objects_name)s seleccionado resultaría en el borrado de " +"objetos relacionados, pero su cuenta no tiene permisos para borrar los " +"siguientes tipos de objetos:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"La eliminación de %(objects_name)s seleccionado requeriría el borrado de los " +"siguientes objetos protegidos relacionados:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " +"Todos los siguientes objetos y sus elementos relacionados serán borrados:" + +msgid "Change" +msgstr "Modificar" + +msgid "Delete?" +msgstr "¿Eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +msgid "Summary" +msgstr "Resumen" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Añadir" + +msgid "You don't have permission to edit anything." +msgstr "No tiene permiso para editar nada." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Ninguno disponible" + +msgid "Unknown content" +msgstr "Contenido desconocido" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Algo va mal con la instalación de la base de datos. Asegúrese de que las " +"tablas necesarias han sido creadas, y de que la base de datos puede ser " +"leída por el usuario apropiado." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " +"esta página. ¿Desea autenticarse con una cuenta diferente?" + +msgid "Forgotten your password or username?" +msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" + +msgid "Date/time" +msgstr "Fecha/hora" + +msgid "User" +msgstr "Usuario" + +msgid "Action" +msgstr "Acción" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " +"usando este sitio de administración." + +msgid "Show all" +msgstr "Mostrar todo" + +msgid "Save" +msgstr "Grabar" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Cambiar %(model)s seleccionado" + +#, python-format +msgid "Add another %(model)s" +msgstr "Añadir otro %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Eliminar %(model)s seleccionada/o" + +msgid "Search" +msgstr "Buscar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultado" +msgstr[1] "%(counter)s resultados" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s total" + +msgid "Save as new" +msgstr "Grabar como nuevo" + +msgid "Save and add another" +msgstr "Grabar y añadir otro" + +msgid "Save and continue editing" +msgstr "Grabar y continuar editando" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." + +msgid "Log in again" +msgstr "Iniciar sesión de nuevo" + +msgid "Password change" +msgstr "Cambio de contraseña" + +msgid "Your password was changed." +msgstr "Su contraseña ha sido cambiada." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Por favor, ingrese su contraseña antigua, por seguridad, y después " +"introduzca la nueva contraseña dos veces para verificar que la ha escrito " +"correctamente." + +msgid "Change my password" +msgstr "Cambiar mi contraseña" + +msgid "Password reset" +msgstr "Restablecer contraseña" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " +"sesión." + +msgid "Password reset confirmation" +msgstr "Confirmación de restablecimiento de contraseña" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " +"escrito correctamente." + +msgid "New password:" +msgstr "Contraseña nueva:" + +msgid "Confirm password:" +msgstr "Confirme contraseña:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"El enlace de restablecimiento de contraseña era inválido, seguramente porque " +"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " +"contraseña." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Le hemos enviado por email las instrucciones para restablecer la contraseña, " +"si es que existe una cuenta con la dirección electrónica que indicó. Debería " +"recibirlas en breve." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Si no recibe un correo, por favor asegúrese de que ha introducido la " +"dirección de correo con la que se registró y verifique su carpeta de spam." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Ha recibido este correo electrónico porque ha solicitado restablecer la " +"contraseña para su cuenta en %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." + +msgid "Your username, in case you've forgotten:" +msgstr "Su nombre de usuario, en caso de haberlo olvidado:" + +msgid "Thanks for using our site!" +msgstr "¡Gracias por usar nuestro sitio!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " +"continuación y le enviaremos las instrucciones para establecer una nueva." + +msgid "Email address:" +msgstr "Correo electrónico:" + +msgid "Reset my password" +msgstr "Restablecer mi contraseña" + +msgid "All dates" +msgstr "Todas las fechas" + +#, python-format +msgid "Select %s" +msgstr "Escoja %s" + +#, python-format +msgid "Select %s to change" +msgstr "Escoja %s a modificar" + +msgid "Date:" +msgstr "Fecha:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Buscar" + +msgid "Currently:" +msgstr "Actualmente:" + +msgid "Change:" +msgstr "Cambiar:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..43e1824 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..c9e1509 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,698 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Eduardo , 2017 +# Hotellook, 2014 +# Leonardo J. Caballero G. , 2016 +# Yoel Acevedo, 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 19:11+0000\n" +"Last-Translator: Eduardo \n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" +"language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eliminado %(count)d %(items)s satisfactoriamente." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "No se puede eliminar %(name)s" + +msgid "Are you sure?" +msgstr "¿Está seguro?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionado" + +msgid "Administration" +msgstr "Administración" + +msgid "All" +msgstr "Todo" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Desconocido" + +msgid "Any date" +msgstr "Cualquier fecha" + +msgid "Today" +msgstr "Hoy" + +msgid "Past 7 days" +msgstr "Últimos 7 días" + +msgid "This month" +msgstr "Este mes" + +msgid "This year" +msgstr "Este año" + +msgid "No date" +msgstr "Sin fecha" + +msgid "Has date" +msgstr "Tiene fecha" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Por favor, ingrese el %(username)s y la clave correctos para obtener cuenta " +"de personal. Observe que ambos campos pueden ser sensibles a mayúsculas." + +msgid "Action:" +msgstr "Acción:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Añadir otro %(verbose_name)s." + +msgid "Remove" +msgstr "Eliminar" + +msgid "action time" +msgstr "hora de la acción" + +msgid "user" +msgstr "usuario" + +msgid "content type" +msgstr "tipo de contenido" + +msgid "object id" +msgstr "id del objeto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr del objeto" + +msgid "action flag" +msgstr "marca de acción" + +msgid "change message" +msgstr "mensaje de cambio" + +msgid "log entry" +msgstr "entrada de registro" + +msgid "log entries" +msgstr "entradas de registro" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Añadidos \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Cambiados \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Eliminado \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objeto LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Agregado {name} \"{object}\"." + +msgid "Added." +msgstr "Añadido." + +msgid "and" +msgstr "y" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Modificado {fields} por {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Modificado {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Eliminado {name} \"{object}\"." + +msgid "No fields changed." +msgstr "No ha cambiado ningún campo." + +msgid "None" +msgstr "Ninguno" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Mantenga presionado \"Control\" o \"Command\" en un Mac, para seleccionar " +"más de una opción." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede editarlo " +"nuevamente a continuación. " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"El {name} \"{obj}\" fue agregado satisfactoriamente. Puede agregar otro " +"{name} a continuación. " + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede editarlo " +"nuevamente a continuación. " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"El {name} \"{obj}\" fue cambiado satisfactoriamente. Puede agregar otro " +"{name} a continuación." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "El {name} \"{obj}\" fue cambiado satisfactoriamente." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Se deben seleccionar elementos para poder realizar acciones sobre estos. No " +"se han modificado elementos." + +msgid "No action selected." +msgstr "No se seleccionó ninguna acción." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s con ID \"%(key)s\" no existe. ¿Tal vez fue eliminada?" + +#, python-format +msgid "Add %s" +msgstr "Añadir %s" + +#, python-format +msgid "Change %s" +msgstr "Modificar %s" + +msgid "Database error" +msgstr "Error en la base de datos" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s fué modificado con éxito." +msgstr[1] "%(count)s %(name)s fueron modificados con éxito." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seleccionado" +msgstr[1] "%(total_count)s seleccionados en total" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seleccionado" + +#, python-format +msgid "Change history: %s" +msgstr "Histórico de modificaciones: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"La eliminación de %(class_name)s %(instance)s requeriría eliminar los " +"siguientes objetos relacionados protegidos: %(related_objects)s" + +msgid "Django site admin" +msgstr "Sitio de administración de Django" + +msgid "Django administration" +msgstr "Administración de Django" + +msgid "Site administration" +msgstr "Sitio de administración" + +msgid "Log in" +msgstr "Iniciar sesión" + +#, python-format +msgid "%(app)s administration" +msgstr "Administración de %(app)s " + +msgid "Page not found" +msgstr "Página no encontrada" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Lo sentimos, pero no se encuentra la página solicitada." + +msgid "Home" +msgstr "Inicio" + +msgid "Server error" +msgstr "Error del servidor" + +msgid "Server error (500)" +msgstr "Error del servidor (500)" + +msgid "Server Error (500)" +msgstr "Error de servidor (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " +"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " +"paciencia y comprensión." + +msgid "Run the selected action" +msgstr "Ejecutar la acción seleccionada" + +msgid "Go" +msgstr "Ir" + +msgid "Click here to select the objects across all pages" +msgstr "Pulse aquí para seleccionar los objetos a través de todas las páginas" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Seleccionar todos los %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Limpiar selección" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " +"el resto de opciones del usuario." + +msgid "Enter a username and password." +msgstr "Ingrese un nombre de usuario y contraseña" + +msgid "Change password" +msgstr "Cambiar contraseña" + +msgid "Please correct the error below." +msgstr "Por favor, corrija el siguiente error." + +msgid "Please correct the errors below." +msgstr "Por favor, corrija los siguientes errores." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Ingrese una nueva contraseña para el usuario %(username)s." + +msgid "Welcome," +msgstr "Bienvenido," + +msgid "View site" +msgstr "Ver el sitio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Log out" +msgstr "Terminar sesión" + +#, python-format +msgid "Add %(name)s" +msgstr "Añadir %(name)s" + +msgid "History" +msgstr "Histórico" + +msgid "View on site" +msgstr "Ver en el sitio" + +msgid "Filter" +msgstr "Filtro" + +msgid "Remove from sorting" +msgstr "Elimina de la ordenación" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioridad de la ordenación: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Activar la ordenación" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación " +"de objetos relacionados, pero su cuenta no tiene permiso para borrar los " +"siguientes tipos de objetos:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Eliminar el %(object_name)s %(escaped_object)s requeriría eliminar los " +"siguientes objetos relacionados protegidos:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" +"\"? Se borrarán los siguientes objetos relacionados:" + +msgid "Objects" +msgstr "Objetos" + +msgid "Yes, I'm sure" +msgstr "Sí, Yo estoy seguro" + +msgid "No, take me back" +msgstr "No, llévame atrás" + +msgid "Delete multiple objects" +msgstr "Eliminar múltiples objetos" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Eliminar el %(objects_name)s seleccionado resultaría en el borrado de " +"objetos relacionados, pero su cuenta no tiene permisos para borrar los " +"siguientes tipos de objetos:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Eliminar el %(objects_name)s seleccionado requeriría el borrado de los " +"siguientes objetos protegidos relacionados:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " +"Todos los siguientes objetos y sus elementos relacionados serán borrados:" + +msgid "Change" +msgstr "Modificar" + +msgid "Delete?" +msgstr "¿Eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Por %(filter_title)s " + +msgid "Summary" +msgstr "Resumen" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Añadir" + +msgid "You don't have permission to edit anything." +msgstr "No tiene permiso para editar nada." + +msgid "Recent actions" +msgstr "Acciones recientes" + +msgid "My actions" +msgstr "Mis acciones" + +msgid "None available" +msgstr "Ninguno disponible" + +msgid "Unknown content" +msgstr "Contenido desconocido" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Algo va mal con la instalación de la base de datos. Asegúrese de que las " +"tablas necesarias han sido creadas, y de que la base de datos puede ser " +"leída por el usuario apropiado." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Se ha autenticado como %(username)s, pero no está autorizado a acceder a " +"esta página. ¿Desea autenticarse con una cuenta diferente?" + +msgid "Forgotten your password or username?" +msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" + +msgid "Date/time" +msgstr "Fecha/hora" + +msgid "User" +msgstr "Usuario" + +msgid "Action" +msgstr "Acción" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " +"usando este sitio de administración." + +msgid "Show all" +msgstr "Mostrar todo" + +msgid "Save" +msgstr "Guardar" + +msgid "Popup closing..." +msgstr "Ventana emergente cerrando..." + +#, python-format +msgid "Change selected %(model)s" +msgstr "Cambiar %(model)s seleccionado" + +#, python-format +msgid "Add another %(model)s" +msgstr "Añadir otro %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Eliminar %(model)s seleccionado" + +msgid "Search" +msgstr "Buscar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultado" +msgstr[1] "%(counter)s resultados" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s total" + +msgid "Save as new" +msgstr "Guardar como nuevo" + +msgid "Save and add another" +msgstr "Guardar y añadir otro" + +msgid "Save and continue editing" +msgstr "Guardar y continuar editando" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." + +msgid "Log in again" +msgstr "Iniciar sesión de nuevo" + +msgid "Password change" +msgstr "Cambio de contraseña" + +msgid "Your password was changed." +msgstr "Su contraseña ha sido cambiada." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Por favor, ingrese su contraseña antigua, por seguridad, y después " +"introduzca la nueva contraseña dos veces para verificar que la ha escrito " +"correctamente." + +msgid "Change my password" +msgstr "Cambiar mi contraseña" + +msgid "Password reset" +msgstr "Restablecer contraseña" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " +"sesión." + +msgid "Password reset confirmation" +msgstr "Confirmación de restablecimiento de contraseña" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Por favor, ingrese su contraseña nueva dos veces para verificar que la ha " +"escrito correctamente." + +msgid "New password:" +msgstr "Contraseña nueva:" + +msgid "Confirm password:" +msgstr "Confirme contraseña:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"El enlace de restablecimiento de contraseña era inválido, seguramente porque " +"se haya usado antes. Por favor, solicite un nuevo restablecimiento de " +"contraseña." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Le hemos enviado por correo electrónico las instrucciones para restablecer " +"la contraseña, si es que existe una cuenta con la dirección electrónica que " +"indicó. Debería recibirlas en breve." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Si no recibe un correo, por favor, asegúrese de que ha introducido la " +"dirección de correo con la que se registró y verifique su carpeta de correo " +"no deseado o spam." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Ha recibido este correo electrónico porque ha solicitado restablecer la " +"contraseña para su cuenta en %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." + +msgid "Your username, in case you've forgotten:" +msgstr "Su nombre de usuario, en caso de haberlo olvidado:" + +msgid "Thanks for using our site!" +msgstr "¡Gracias por usar nuestro sitio!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"¿Ha olvidado su clave? Ingrese su dirección de correo electrónico a " +"continuación y le enviaremos las instrucciones para establecer una nueva." + +msgid "Email address:" +msgstr "Correo electrónico:" + +msgid "Reset my password" +msgstr "Restablecer mi contraseña" + +msgid "All dates" +msgstr "Todas las fechas" + +#, python-format +msgid "Select %s" +msgstr "Escoja %s" + +#, python-format +msgid "Select %s to change" +msgstr "Escoja %s a modificar" + +msgid "Date:" +msgstr "Fecha:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Buscar" + +msgid "Currently:" +msgstr "Actualmente:" + +msgid "Change:" +msgstr "Cambiar:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..a967416 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,709 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# eallik , 2011 +# Jannis Leidel , 2011 +# Janno Liivak , 2013-2015 +# Martin Pajuste , 2015 +# Martin Pajuste , 2016,2019 +# Marti Raudsepp , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 16:25+0000\n" +"Last-Translator: Martin Pajuste \n" +"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s kustutamine õnnestus." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ei saa kustutada %(name)s" + +msgid "Are you sure?" +msgstr "Kas olete kindel?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Kustuta valitud %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Administreerimine" + +msgid "All" +msgstr "Kõik" + +msgid "Yes" +msgstr "Jah" + +msgid "No" +msgstr "Ei" + +msgid "Unknown" +msgstr "Tundmatu" + +msgid "Any date" +msgstr "Suvaline kuupäev" + +msgid "Today" +msgstr "Täna" + +msgid "Past 7 days" +msgstr "Viimased 7 päeva" + +msgid "This month" +msgstr "Käesolev kuu" + +msgid "This year" +msgstr "Käesolev aasta" + +msgid "No date" +msgstr "Kuupäev puudub" + +msgid "Has date" +msgstr "Kuupäev olemas" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Palun sisestage personali kontole õige %(username)s ja parool. Teadke, et " +"mõlemad väljad võivad olla tõstutundlikud." + +msgid "Action:" +msgstr "Toiming:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Lisa veel üks %(verbose_name)s" + +msgid "Remove" +msgstr "Eemalda" + +msgid "Addition" +msgstr "" + +msgid "Change" +msgstr "Muuda" + +msgid "Deletion" +msgstr "" + +msgid "action time" +msgstr "toimingu aeg" + +msgid "user" +msgstr "kasutaja" + +msgid "content type" +msgstr "sisutüüp" + +msgid "object id" +msgstr "objekti id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "objekti esitus" + +msgid "action flag" +msgstr "toimingu lipp" + +msgid "change message" +msgstr "muudatuse tekst" + +msgid "log entry" +msgstr "logisissekanne" + +msgid "log entries" +msgstr "logisissekanded" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Lisatud \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Muudetud \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Kustutatud \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objekt LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Lisatud {name} \"{object}\"." + +msgid "Added." +msgstr "Lisatud." + +msgid "and" +msgstr "ja" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Muudetud {fields} objektil {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Muudetud {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Kustutatud {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Ühtegi välja ei muudetud." + +msgid "None" +msgstr "Puudub" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Et valida mitu, hoidke all \"Control\"-nuppu (Maci puhul \"Command\")." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" lisamine õnnestus." + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" lisamine õnnestus. Allpool saate lisada uue {name}." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" muutmine õnnestus. Allpool saate seda uuesti muuta." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" lisamine õnnestus. Allpool saate seda uuesti muuta." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" muutmine õnnestus. Allpool saate lisada uue {name}." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" muutmine õnnestus." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Palun märgistage elemendid, millega soovite toiminguid sooritada. Ühtegi " +"elementi ei muudetud." + +msgid "No action selected." +msgstr "Toiming valimata." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" kustutati." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Lisa %s" + +#, python-format +msgid "Change %s" +msgstr "Muuda %s" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "Andmebaasi viga" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s muutmine õnnestus." +msgstr[1] "%(count)s %(name)s muutmine õnnestus." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s valitud" +msgstr[1] "Kõik %(total_count)s valitud" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "valitud 0/%(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "Muudatuste ajalugu: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Et kustutada %(class_name)s %(instance)s, on vaja kustutada järgmised " +"kaitstud seotud objektid: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django administreerimisliides" + +msgid "Django administration" +msgstr "Django administreerimisliides" + +msgid "Site administration" +msgstr "Saidi administreerimine" + +msgid "Log in" +msgstr "Sisene" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s administreerimine" + +msgid "Page not found" +msgstr "Lehte ei leitud" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Vabandame, kuid soovitud lehte ei leitud." + +msgid "Home" +msgstr "Kodu" + +msgid "Server error" +msgstr "Serveri viga" + +msgid "Server error (500)" +msgstr "Serveri viga (500)" + +msgid "Server Error (500)" +msgstr "Serveri Viga (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ilmnes viga. Sellest on e-posti teel teavitatud lehe administraatorit ja " +"viga parandatakse esimesel võimalusel. Täname kannatlikkuse eest." + +msgid "Run the selected action" +msgstr "Käivita valitud toiming" + +msgid "Go" +msgstr "Mine" + +msgid "Click here to select the objects across all pages" +msgstr "Kliki siin, et märgistada objektid üle kõigi lehekülgede" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Märgista kõik %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Tühjenda valik" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Kõige pealt sisestage kasutajatunnus ja salasõna, seejärel on võimalik muuta " +"täiendavaid kasutajaandmeid." + +msgid "Enter a username and password." +msgstr "Sisestage kasutajanimi ja salasõna." + +msgid "Change password" +msgstr "Muuda salasõna" + +msgid "Please correct the error below." +msgstr "Palun parandage allolev viga." + +msgid "Please correct the errors below." +msgstr "Palun parandage allolevad vead." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Sisestage uus salasõna kasutajale %(username)s" + +msgid "Welcome," +msgstr "Tere tulemast," + +msgid "View site" +msgstr "Vaata saiti" + +msgid "Documentation" +msgstr "Dokumentatsioon" + +msgid "Log out" +msgstr "Logi välja" + +#, python-format +msgid "Add %(name)s" +msgstr "Lisa %(name)s" + +msgid "History" +msgstr "Ajalugu" + +msgid "View on site" +msgstr "Näita lehel" + +msgid "Filter" +msgstr "Filtreeri" + +msgid "Remove from sorting" +msgstr "Eemalda sorteerimisest" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sorteerimisjärk: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Sorteerimine" + +msgid "Delete" +msgstr "Kustuta" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Selleks, et kustutada %(object_name)s '%(escaped_object)s', on vaja " +"kustutada lisaks ka kõik seotud objecktid, aga teil puudub õigus järgnevat " +"tüüpi objektide kustutamiseks:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Et kustutada %(object_name)s '%(escaped_object)s', on vaja kustutada " +"järgmised kaitstud seotud objektid:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Kas olete kindel, et soovite kustutada objekti %(object_name)s " +"\"%(escaped_object)s\"? Kõik järgnevad seotud objektid kustutatakse koos " +"sellega:" + +msgid "Objects" +msgstr "Objektid" + +msgid "Yes, I'm sure" +msgstr "Jah, olen kindel" + +msgid "No, take me back" +msgstr "Ei, mine tagasi" + +msgid "Delete multiple objects" +msgstr "Kustuta mitu objekti" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Kui kustutada valitud %(objects_name)s, peaks kustutama ka seotud objektid, " +"aga sinu kasutajakontol pole õigusi järgmiste objektitüüpide kustutamiseks:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Et kustutada valitud %(objects_name)s, on vaja kustutada ka järgmised " +"kaitstud seotud objektid:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Kas oled kindel, et soovid kustutada valitud %(objects_name)s? Kõik " +"järgnevad objektid ja seotud objektid kustutatakse:" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "Kustutan?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s " + +msgid "Summary" +msgstr "Kokkuvõte" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Rakenduse %(name)s moodulid" + +msgid "Add" +msgstr "Lisa" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "Hiljutised toimingud" + +msgid "My actions" +msgstr "Minu toimingud" + +msgid "None available" +msgstr "Ei leitud ühtegi" + +msgid "Unknown content" +msgstr "Tundmatu sisu" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"On tekkinud viga seoses andmebaasiga. Veenduge, et kõik vajalikud " +"andmebaasitabelid on loodud ning et andmebaas on vastava kasutaja poolt " +"loetav." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Olete sisse logitud kasutajana %(username)s, kuid teil puudub ligipääs " +"lehele. Kas te soovite teise kontoga sisse logida?" + +msgid "Forgotten your password or username?" +msgstr "Unustasite oma parooli või kasutajanime?" + +msgid "Date/time" +msgstr "Kuupäev/kellaaeg" + +msgid "User" +msgstr "Kasutaja" + +msgid "Action" +msgstr "Toiming" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Sellel objektil puudub muudatuste ajalugu. Tõenäoliselt ei kasutatud selle " +"objekti lisamisel käesolevat administreerimislidest." + +msgid "Show all" +msgstr "Näita kõiki" + +msgid "Save" +msgstr "Salvesta" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Otsing" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s tulemus" +msgstr[1] "%(counter)s tulemust" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "Kokku %(full_result_count)s" + +msgid "Save as new" +msgstr "Salvesta uuena" + +msgid "Save and add another" +msgstr "Salvesta ja lisa uus" + +msgid "Save and continue editing" +msgstr "Salvesta ja jätka muutmist" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Muuda valitud %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Lisa veel üks %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Kustuta valitud %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Tänan, et veetsite aega meie lehel." + +msgid "Log in again" +msgstr "Logi uuesti sisse" + +msgid "Password change" +msgstr "Salasõna muutmine" + +msgid "Your password was changed." +msgstr "Teie salasõna on vahetatud." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Turvalisuse tagamiseks palun sisestage oma praegune salasõna ning seejärel " +"uus salasõna.Veendumaks, et uue salasõna sisestamisel ei tekkinud vigu, " +"palun sisestage see kaks korda." + +msgid "Change my password" +msgstr "Muuda salasõna" + +msgid "Password reset" +msgstr "Uue parooli loomine" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Teie salasõna on määratud. Võite nüüd sisse logida." + +msgid "Password reset confirmation" +msgstr "Uue salasõna loomise kinnitamine" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Palun sisestage uus salasõna kaks korda, et saaksime veenduda, et " +"sisestamisel ei tekkinud vigu." + +msgid "New password:" +msgstr "Uus salasõna:" + +msgid "Confirm password:" +msgstr "Kinnita salasõna:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Uue salasõna loomise link ei olnud korrektne. Võimalik, et seda on varem " +"kasutatud. Esitage uue salasõna taotlus uuesti." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Saatsime teile parooli muutmise juhendi, kui teie poolt sisestatud e-posti " +"aadressiga konto on olemas. Peaksite selle lähiajal kätte saama." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Kui te ei saa kirja siis kontrollige, et sisestasite e-posti aadressi " +"millega registreerisite ning kontrollige oma rämpsposti kausta." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Saite käesoleva kirja kuna soovisite muuta lehel %(site_name)s oma " +"kasutajakontoga seotud parooli." + +msgid "Please go to the following page and choose a new password:" +msgstr "Palun minge järmisele lehele ning sisestage uus salasõna" + +msgid "Your username, in case you've forgotten:" +msgstr "Teie kasutajatunnus juhul, kui olete unustanud:" + +msgid "Thanks for using our site!" +msgstr "Täname meie lehte külastamast!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s meeskond" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Unustasite oma parooli? Sisestage allpool oma e-posti aadress ja me saadame " +"teile juhendi, kuidas parooli muuta." + +msgid "Email address:" +msgstr "E-posti aadress:" + +msgid "Reset my password" +msgstr "Reseti parool" + +msgid "All dates" +msgstr "Kõik kuupäevad" + +#, python-format +msgid "Select %s" +msgstr "Vali %s" + +#, python-format +msgid "Select %s to change" +msgstr "Vali %s mida muuta" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "Kuupäev:" + +msgid "Time:" +msgstr "Aeg:" + +msgid "Lookup" +msgstr "Otsi" + +msgid "Currently:" +msgstr "Hetkel:" + +msgid "Change:" +msgstr "Muuda:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e3c840f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..9176368 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,713 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aitzol Naberan , 2013,2016 +# Eneko Illarramendi , 2017-2019 +# Jannis Leidel , 2011 +# julen, 2012-2013 +# julen, 2013 +# Urtzi Odriozola , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-22 09:57+0000\n" +"Last-Translator: Eneko Illarramendi \n" +"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s elementu ezabatu dira." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ezin da %(name)s ezabatu" + +msgid "Are you sure?" +msgstr "Ziur al zaude?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ezabatu aukeratutako %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Kudeaketa" + +msgid "All" +msgstr "Dena" + +msgid "Yes" +msgstr "Bai" + +msgid "No" +msgstr "Ez" + +msgid "Unknown" +msgstr "Ezezaguna" + +msgid "Any date" +msgstr "Edozein data" + +msgid "Today" +msgstr "Gaur" + +msgid "Past 7 days" +msgstr "Aurreko 7 egunak" + +msgid "This month" +msgstr "Hilabete hau" + +msgid "This year" +msgstr "Urte hau" + +msgid "No date" +msgstr "Datarik ez" + +msgid "Has date" +msgstr "Data dauka" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Idatzi kudeaketa gunerako %(username)s eta pasahitz zuzena. Kontuan izan " +"biek maiuskula/minuskulak desberdintzen dituztela." + +msgid "Action:" +msgstr "Ekintza:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Gehitu beste %(verbose_name)s bat" + +msgid "Remove" +msgstr "Kendu" + +msgid "Addition" +msgstr "Gehitzea" + +msgid "Change" +msgstr "Aldatu" + +msgid "Deletion" +msgstr "Ezabatzea" + +msgid "action time" +msgstr "Ekintza hordua" + +msgid "user" +msgstr "erabiltzailea" + +msgid "content type" +msgstr "eduki mota" + +msgid "object id" +msgstr "objetuaren id-a" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "objeturaren adierazpena" + +msgid "action flag" +msgstr "Ekintza botoia" + +msgid "change message" +msgstr "Mezua aldatu" + +msgid "log entry" +msgstr "Log sarrera" + +msgid "log entries" +msgstr "log sarrerak" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" gehituta." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" aldatuta - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" ezabatuta." + +msgid "LogEntry Object" +msgstr "LogEntry objetua" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" gehitu." + +msgid "Added." +msgstr "Gehituta" + +msgid "and" +msgstr "eta" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{fields}-(e)tik {name} \"{object}\" aldatatuta." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} aldatuta." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "{name} \"{object}\" ezabatuta." + +msgid "No fields changed." +msgstr "Ez da eremurik aldatu." + +msgid "None" +msgstr "Bat ere ez" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Bat baino gehiago hautatzeko, sakatu \"Kontrol\" tekla edo \"Command\" Mac " +"batean." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" ondo gehitu da." + +msgid "You may edit it again below." +msgstr "Aldaketa gehiago egin ditzazkezu jarraian." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" ondo gehitu da. Beste {name} bat gehitu dezakezu jarraian." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" ondo aldatu da. Aldaketa gehiago egin ditzazkezu jarraian." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" ondo gehitu da. Aldaketa gehiago egin ditzazkezu jarraian." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" ondo aldatu da. Beste {name} bat gehitu dezakezu jarraian." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" ondo aldatu da." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Elementuak aukeratu behar dira beraien gain ekintzak burutzeko. Ez da " +"elementurik aldatu." + +msgid "No action selected." +msgstr "Ez dago ekintzarik aukeratuta." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" ondo ezabatu da." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" +"\"%(key)s\" ID dun %(name)s ez dira existitzen. Agian ezabatua izan da?" + +#, python-format +msgid "Add %s" +msgstr "Gehitu %s" + +#, python-format +msgid "Change %s" +msgstr "Aldatu %s" + +#, python-format +msgid "View %s" +msgstr "%s ikusi" + +msgid "Database error" +msgstr "Errorea datu-basean" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(name)s %(count)s ondo aldatu da." +msgstr[1] "%(count)s %(name)s ondo aldatu dira." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Guztira %(total_count)s aukeratuta" +msgstr[1] "Guztira %(total_count)s aukeratuta" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Guztira %(cnt)s, 0 aukeratuta" + +#, python-format +msgid "Change history: %s" +msgstr "Aldaketen historia: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s klaseko %(instance)s instantziak ezabatzeak erlazionatutako " +"objektu hauek ezabatzea eragingo du:\n" +"%(related_objects)s" + +msgid "Django site admin" +msgstr "Django kudeaketa gunea" + +msgid "Django administration" +msgstr "Django kudeaketa" + +msgid "Site administration" +msgstr "Webgunearen kudeaketa" + +msgid "Log in" +msgstr "Sartu" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s kudeaketa" + +msgid "Page not found" +msgstr "Ez da orririk aurkitu" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Barkatu, eskatutako orria ezin daiteke aurkitu" + +msgid "Home" +msgstr "Hasiera" + +msgid "Server error" +msgstr "Zerbitzariaren errorea" + +msgid "Server error (500)" +msgstr "Zerbitzariaren errorea (500)" + +msgid "Server Error (500)" +msgstr "Zerbitzariaren errorea (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Errore bat gertatu da. Errorea guneko kudeatzaileari jakinarazi zaio email " +"bidez eta laster egon beharko luke konponduta. Barkatu eragozpenak." + +msgid "Run the selected action" +msgstr "Burutu aukeratutako ekintza" + +msgid "Go" +msgstr "Joan" + +msgid "Click here to select the objects across all pages" +msgstr "Egin klik hemen orri guztietako objektuak aukeratzeko" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Hautatu %(total_count)s %(module_name)s guztiak" + +msgid "Clear selection" +msgstr "Garbitu hautapena" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Lehenik idatzi erabiltzaile-izena eta pasahitza. Gero erabiltzaile-aukera " +"gehiago aldatu ahal izango dituzu." + +msgid "Enter a username and password." +msgstr "Sartu erabiltzaile izen eta pasahitz bat." + +msgid "Change password" +msgstr "Aldatu pasahitza" + +msgid "Please correct the error below." +msgstr "Mesedez zuzendu erroreak behean." + +msgid "Please correct the errors below." +msgstr "Mesedez zuzendu erroreak behean." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Idatzi pasahitz berria %(username)s erabiltzailearentzat." + +msgid "Welcome," +msgstr "Ongi etorri," + +msgid "View site" +msgstr "Webgunea ikusi" + +msgid "Documentation" +msgstr "Dokumentazioa" + +msgid "Log out" +msgstr "Irten" + +#, python-format +msgid "Add %(name)s" +msgstr "Gehitu %(name)s" + +msgid "History" +msgstr "Historia" + +msgid "View on site" +msgstr "Webgunean ikusi" + +msgid "Filter" +msgstr "Iragazkia" + +msgid "Remove from sorting" +msgstr "Kendu ordenaziotik" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Ordenatzeko lehentasuna: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Txandakatu ordenazioa" + +msgid "Delete" +msgstr "Ezabatu" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s ezabatzean bere '%(escaped_object)s' ere ezabatzen dira, " +"baina zure kontuak ez dauka baimenik objetu mota hauek ezabatzeko:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' ezabatzeak erlazionatutako objektu " +"babestu hauek ezabatzea eskatzen du:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ziur zaude %(object_name)s \"%(escaped_object)s\" ezabatu nahi dituzula? " +"Erlazionaturik dauden hurrengo elementuak ere ezabatuko dira:" + +msgid "Objects" +msgstr "Objetuak" + +msgid "Yes, I'm sure" +msgstr "Bai, ziur nago" + +msgid "No, take me back" +msgstr "Ez, itzuli atzera" + +msgid "Delete multiple objects" +msgstr "Ezabatu hainbat objektu" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektuak ezabatzea " +"eskatzen du baina zure kontuak ez dauka baimen nahikorik objektu mota hauek " +"ezabatzeko: " + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Aukeratutako %(objects_name)s ezabatzeak erlazionatutako objektu babestu " +"hauek ezabatzea eskatzen du:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ziur zaude aukeratutako %(objects_name)s ezabatu nahi duzula? Objektu guzti " +"hauek eta erlazionatutako elementu guztiak ezabatuko dira:" + +msgid "View" +msgstr "Ikusi" + +msgid "Delete?" +msgstr "Ezabatu?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Irizpidea: %(filter_title)s" + +msgid "Summary" +msgstr "Laburpena" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s aplikazioaren modeloak" + +msgid "Add" +msgstr "Gehitu" + +msgid "You don't have permission to view or edit anything." +msgstr "Ez duzu ezer ikusi edo ezabatzeko baimenik." + +msgid "Recent actions" +msgstr "Azken ekintzak" + +msgid "My actions" +msgstr "Nire ekintzak" + +msgid "None available" +msgstr "Ez dago ezer" + +msgid "Unknown content" +msgstr "Eduki ezezaguna" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Zerbait gaizki dago zure datu-basearen instalazioan. Ziurtatu datu-baseko " +"taulak sortu direla eta dagokion erabiltzaileak irakurtzeko baimena duela." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"%(username)s bezala autentikatu zara, baina ez daukazu orrialde honetara " +"sarbidea. Nahi al duzu kontu ezberdin batez sartu?" + +msgid "Forgotten your password or username?" +msgstr "Pasahitza edo erabiltzaile-izena ahaztu duzu?" + +msgid "Date/time" +msgstr "Data/ordua" + +msgid "User" +msgstr "Erabiltzailea" + +msgid "Action" +msgstr "Ekintza" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Objektu honek ez dauka aldaketen historiarik. Ziurrenik kudeaketa gunetik " +"kanpo gehituko zen." + +msgid "Show all" +msgstr "Erakutsi dena" + +msgid "Save" +msgstr "Gorde" + +msgid "Popup closing…" +msgstr "Popup leihoa ixten..." + +msgid "Search" +msgstr "Bilatu" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "Emaitza %(counter)s " +msgstr[1] "%(counter)s emaitza" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s guztira" + +msgid "Save as new" +msgstr "Gorde berri gisa" + +msgid "Save and add another" +msgstr "Gorde eta beste bat gehitu" + +msgid "Save and continue editing" +msgstr "Gorde eta editatzen jarraitu" + +msgid "Save and view" +msgstr "Gorde eta ikusi" + +msgid "Close" +msgstr "Itxi" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Aldatu aukeratutako %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Gehitu beste %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Ezabatu aukeratutako %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Eskerrik asko webguneari zure probetxuzko denbora eskaintzeagatik." + +msgid "Log in again" +msgstr "Hasi saioa berriro" + +msgid "Password change" +msgstr "Aldatu pasahitza" + +msgid "Your password was changed." +msgstr "Zure pasahitza aldatu egin da." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Idatzi pasahitz zaharra segurtasun arrazoiengatik eta gero pasahitz berria " +"bi aldiz, akatsik egiten ez duzula ziurta dezagun." + +msgid "Change my password" +msgstr "Nire pasahitza aldatu" + +msgid "Password reset" +msgstr "Berrezarri pasahitza" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Zure pasahitza ezarri da. Orain aurrera egin eta sartu zaitezke." + +msgid "Password reset confirmation" +msgstr "Pasahitza berrezartzeko berrespena" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "Idatzi pasahitz berria birritan ondo idatzita dagoela ziurta dezagun." + +msgid "New password:" +msgstr "Pasahitz berria:" + +msgid "Confirm password:" +msgstr "Berretsi pasahitza:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Pasahitza berrezartzeko loturak baliogabea dirudi. Baliteke lotura aurretik " +"erabilita egotea. Eskatu berriro pasahitza berrezartzea." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Zure pasahitza ezartzeko jarraibideak bidali dizkizugu email bidez, sartu " +"duzun helbide elektronikoa kontu bati lotuta badago. Laster jaso beharko " +"zenituzke." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Ez baduzu mezurik jasotzen, ziurtatu izena ematean erabilitako helbide " +"berdina idatzi duzula eta egiaztatu spam karpeta." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Mezu hau %(site_name)s webgunean pasahitza berrezartzea eskatu duzulako jaso " +"duzu." + +msgid "Please go to the following page and choose a new password:" +msgstr "Zoaz hurrengo orrira eta aukeratu pasahitz berria:" + +msgid "Your username, in case you've forgotten:" +msgstr "Zure erabiltzaile-izena (ahaztu baduzu):" + +msgid "Thanks for using our site!" +msgstr "Mila esker gure webgunea erabiltzeagatik!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s webguneko taldea" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Pasahitza ahaztu duzu? Idatzi zure helbide elektronikoa eta berri bat " +"ezartzeko jarraibideak bidaliko dizkizugu." + +msgid "Email address:" +msgstr "Helbide elektronikoa:" + +msgid "Reset my password" +msgstr "Berrezarri pasahitza" + +msgid "All dates" +msgstr "Data guztiak" + +#, python-format +msgid "Select %s" +msgstr "Aukeratu %s" + +#, python-format +msgid "Select %s to change" +msgstr "Aukeratu %s aldatzeko" + +#, python-format +msgid "Select %s to view" +msgstr "Aukeratu %s ikusteko" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Ordua:" + +msgid "Lookup" +msgstr "Lookup" + +msgid "Currently:" +msgstr "Oraingoa:" + +msgid "Change:" +msgstr "Aldatu:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6b9adaa Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..40d86fa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aitzol Naberan , 2011 +# Eneko Illarramendi , 2017 +# Jannis Leidel , 2011 +# julen , 2012-2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Eneko Illarramendi \n" +"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s erabilgarri" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Hau da aukeran dauden %s zerrenda. Hauetako zenbait aukera ditzakezu " +"azpiko \n" +"kaxan hautatu eta kutxen artean dagoen \"Aukeratu\" gezian klik eginez." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Idatzi kutxa honetan erabilgarri dauden %s objektuak iragazteko." + +msgid "Filter" +msgstr "Filtroa" + +msgid "Choose all" +msgstr "Denak aukeratu" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Egin klik %s guztiak batera aukeratzeko." + +msgid "Choose" +msgstr "Aukeratu" + +msgid "Remove" +msgstr "Kendu" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s aukeratuak" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Hau da aukeratutako %s zerrenda. Hauetako zenbait ezaba ditzakezu azpiko " +"kutxan hautatu eta bi kutxen artean dagoen \"Ezabatu\" gezian klik eginez." + +msgid "Remove all" +msgstr "Kendu guztiak" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Egin klik aukeratutako %s guztiak kentzeko." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)s-etik %(sel)s aukeratuta" +msgstr[1] "%(cnt)s-etik %(sel)s aukeratuta" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Gorde gabeko aldaketak dauzkazu eremuetan. Ekintza bat exekutatzen baduzu, " +"gorde gabeko aldaketak galduko dira." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Ekintza bat hautatu duzu, baina oraindik ez duzu eremuetako aldaketak gorde. " +"Mesedez, sakatu OK gordetzeko. Ekintza berriro exekutatu beharko duzu." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Ekintza bat hautatu duzu, baina ez duzu inongo aldaketarik egin eremuetan. " +"Litekeena da, Gorde botoia beharrean Aurrera botoiaren bila aritzea." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s aurrerago zaude" +msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu aurrerago zaude" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s atzerago zaude. " +msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu atzerago zaude. " + +msgid "Now" +msgstr "Orain" + +msgid "Choose a Time" +msgstr "Aukeratu ordu bat" + +msgid "Choose a time" +msgstr "Aukeratu ordu bat" + +msgid "Midnight" +msgstr "Gauerdia" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Eguerdia" + +msgid "6 p.m." +msgstr "6 p.m." + +msgid "Cancel" +msgstr "Atzera" + +msgid "Today" +msgstr "Gaur" + +msgid "Choose a Date" +msgstr "Aukeratu data bat" + +msgid "Yesterday" +msgstr "Atzo" + +msgid "Tomorrow" +msgstr "Bihar" + +msgid "January" +msgstr "Urtarrila" + +msgid "February" +msgstr "Otsaila" + +msgid "March" +msgstr "Martxoa" + +msgid "April" +msgstr "Apirila" + +msgid "May" +msgstr "Maiatza" + +msgid "June" +msgstr "Ekaina" + +msgid "July" +msgstr "Uztaila" + +msgid "August" +msgstr "Abuztua" + +msgid "September" +msgstr "Iraila" + +msgid "October" +msgstr "Urria" + +msgid "November" +msgstr "Azaroa" + +msgid "December" +msgstr "Abendua" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "I" + +msgctxt "one letter Monday" +msgid "M" +msgstr "A" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "A" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "A" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "O" + +msgctxt "one letter Friday" +msgid "F" +msgstr "O" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "L" + +msgid "Show" +msgstr "Erakutsi" + +msgid "Hide" +msgstr "Izkutatu" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7c6fa11 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..a2c0a38 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,708 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017 +# Antti Kaihola , 2011 +# Jannis Leidel , 2011 +# Klaus Dahlén , 2012 +# Nikolay Korotkiy , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:36+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d \"%(items)s\"-kohdetta poistettu." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ei voida poistaa: %(name)s" + +msgid "Are you sure?" +msgstr "Oletko varma?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet" + +msgid "Administration" +msgstr "Hallinta" + +msgid "All" +msgstr "Kaikki" + +msgid "Yes" +msgstr "Kyllä" + +msgid "No" +msgstr "Ei" + +msgid "Unknown" +msgstr "Tuntematon" + +msgid "Any date" +msgstr "Mikä tahansa päivä" + +msgid "Today" +msgstr "Tänään" + +msgid "Past 7 days" +msgstr "Viimeiset 7 päivää" + +msgid "This month" +msgstr "Tässä kuussa" + +msgid "This year" +msgstr "Tänä vuonna" + +msgid "No date" +msgstr "Ei päivämäärää" + +msgid "Has date" +msgstr "On päivämäärä" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Ole hyvä ja syötä henkilökuntatilin %(username)s ja salasana. Huomaa että " +"kummassakin kentässä isoilla ja pienillä kirjaimilla saattaa olla merkitystä." + +msgid "Action:" +msgstr "Toiminto:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Lisää toinen %(verbose_name)s" + +msgid "Remove" +msgstr "Poista" + +msgid "Addition" +msgstr "Lisäys" + +msgid "Change" +msgstr "Muokkaa" + +msgid "Deletion" +msgstr "Poisto" + +msgid "action time" +msgstr "tapahtumahetki" + +msgid "user" +msgstr "käyttäjä" + +msgid "content type" +msgstr "sisältötyyppi" + +msgid "object id" +msgstr "kohteen tunniste" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "kohteen tiedot" + +msgid "action flag" +msgstr "tapahtumatyyppi" + +msgid "change message" +msgstr "selitys" + +msgid "log entry" +msgstr "lokimerkintä" + +msgid "log entries" +msgstr "lokimerkinnät" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Lisätty \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Muokattu \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Poistettu \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Lokimerkintätietue" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Lisätty {name} \"{object}\"." + +msgid "Added." +msgstr "Lisätty." + +msgid "and" +msgstr "ja" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Muutettu {fields} {name}-kohteelle \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Muutettu {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Poistettu {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Ei muutoksia kenttiin." + +msgid "None" +msgstr "Ei arvoa" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +" Pidä \"Ctrl\" (tai Macin \"Command\") pohjassa valitaksesi useita " +"vaihtoehtoja." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" on lisätty." + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" on lisätty. Voit lisätä toisen {name} alla." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" on muokattu. Voit muokata sitä edelleen alla." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" on lisätty. Voit muokata sitä uudelleen alla." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" on muokattu. Voit lisätä toisen alla." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" on muokattu." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Kohteiden täytyy olla valittuna, jotta niihin voi kohdistaa toimintoja. " +"Kohteita ei ole muutettu." + +msgid "No action selected." +msgstr "Ei toimintoa valittuna." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" on poistettu." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s tunnisteella %(key)s puuttuu. Se on voitu poistaa." + +#, python-format +msgid "Add %s" +msgstr "Lisää %s" + +#, python-format +msgid "Change %s" +msgstr "Muokkaa %s" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "Tietokantavirhe" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s on muokattu." +msgstr[1] "%(count)s \"%(name)s\"-kohdetta on muokattu." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s valittu" +msgstr[1] "Kaikki %(total_count)s valittu" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 valittuna %(cnt)s mahdollisesta" + +#, python-format +msgid "Change history: %s" +msgstr "Muokkaushistoria: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s %(instance)s poistaminen vaatisi myös seuraavien suojattujen " +"liittyvien kohteiden poiston: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django-sivuston ylläpito" + +msgid "Django administration" +msgstr "Djangon ylläpito" + +msgid "Site administration" +msgstr "Sivuston ylläpito" + +msgid "Log in" +msgstr "Kirjaudu sisään" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s-ylläpito" + +msgid "Page not found" +msgstr "Sivua ei löydy" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt." + +msgid "Home" +msgstr "Etusivu" + +msgid "Server error" +msgstr "Palvelinvirhe" + +msgid "Server error (500)" +msgstr "Palvelinvirhe (500)" + +msgid "Server Error (500)" +msgstr "Palvelinvirhe (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Sattui virhe. Virheestä on huomautettu sivuston ylläpitäjille sähköpostitse " +"ja se korjautunee piakkoin. Kiitos kärsivällisyydestä." + +msgid "Run the selected action" +msgstr "Suorita valittu toiminto" + +msgid "Go" +msgstr "Suorita" + +msgid "Click here to select the objects across all pages" +msgstr "Klikkaa tästä valitaksesi kohteet kaikilta sivuilta" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Valitse kaikki %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Tyhjennä valinta" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita " +"käyttäjän tietoja." + +msgid "Enter a username and password." +msgstr "Syötä käyttäjätunnus ja salasana." + +msgid "Change password" +msgstr "Vaihda salasana" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "Korjaa allaolevat virheet." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Syötä käyttäjän %(username)s uusi salasana." + +msgid "Welcome," +msgstr "Tervetuloa," + +msgid "View site" +msgstr "Näytä sivusto" + +msgid "Documentation" +msgstr "Ohjeita" + +msgid "Log out" +msgstr "Kirjaudu ulos" + +#, python-format +msgid "Add %(name)s" +msgstr "Lisää %(name)s" + +msgid "History" +msgstr "Muokkaushistoria" + +msgid "View on site" +msgstr "Näytä lopputulos" + +msgid "Filter" +msgstr "Suodatin" + +msgid "Remove from sorting" +msgstr "Poista järjestämisestä" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Järjestysprioriteetti: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Kytke järjestäminen" + +msgid "Delete" +msgstr "Poista" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen " +"liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden " +"poistamiseen:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s': poistettaessa joudutaan poistamaan " +"myös seuraavat suojatut siihen liittyvät kohteet:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? " +"Myös seuraavat kohteet poistettaisiin samalla:" + +msgid "Objects" +msgstr "Kohteet" + +msgid "Yes, I'm sure" +msgstr "Kyllä, olen varma" + +msgid "No, take me back" +msgstr "Ei, mennään takaisin" + +msgid "Delete multiple objects" +msgstr "Poista useita kohteita" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Jos valitut %(objects_name)s poistettaisiin, jouduttaisiin poistamaan niihin " +"liittyviä kohteita. Sinulla ei kuitenkaan ole oikeutta poistaa seuraavia " +"kohdetyyppejä:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Jos valitut %(objects_name)s poistetaan, pitää poistaa myös seuraavat " +"suojatut niihin liittyvät kohteet:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Haluatki varmasti poistaa valitut %(objects_name)s? Samalla poistetaan " +"kaikki alla mainitut ja niihin liittyvät kohteet:" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "Poista?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s " + +msgid "Summary" +msgstr "Yhteenveto" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s -applikaation mallit" + +msgid "Add" +msgstr "Lisää" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "Viimeisimmät tapahtumat" + +msgid "My actions" +msgstr "Omat tapahtumat" + +msgid "None available" +msgstr "Ei yhtään" + +msgid "Unknown content" +msgstr "Tuntematon sisältö" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Tietokanta-asennuksessa on jotain vialla. Varmista, että sopivat taulut on " +"luotu ja että oikea käyttäjä voi lukea tietokantaa." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Olet kirjautunut käyttäjänä %(username)s, mutta sinulla ei ole pääsyä tälle " +"sivulle. Haluaisitko kirjautua eri tilille?" + +msgid "Forgotten your password or username?" +msgstr "Unohditko salasanasi tai käyttäjätunnuksesi?" + +msgid "Date/time" +msgstr "Pvm/klo" + +msgid "User" +msgstr "Käyttäjä" + +msgid "Action" +msgstr "Tapahtuma" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole ilmeisesti lisätty tämän " +"ylläpitosivun avulla." + +msgid "Show all" +msgstr "Näytä kaikki" + +msgid "Save" +msgstr "Tallenna ja poistu" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Haku" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s osuma" +msgstr[1] "%(counter)s osumaa" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "yhteensä %(full_result_count)s" + +msgid "Save as new" +msgstr "Tallenna uutena" + +msgid "Save and add another" +msgstr "Tallenna ja lisää toinen" + +msgid "Save and continue editing" +msgstr "Tallenna välillä ja jatka muokkaamista" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "Sulje" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Muuta valittuja %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Lisää toinen %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Poista valitut %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Kiitos sivuillamme viettämästäsi ajasta." + +msgid "Log in again" +msgstr "Kirjaudu uudelleen sisään" + +msgid "Password change" +msgstr "Salasanan vaihtaminen" + +msgid "Your password was changed." +msgstr "Salasanasi on vaihdettu." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi kaksi " +"kertaa, jotta se tulee varmasti oikein." + +msgid "Change my password" +msgstr "Vaihda salasana" + +msgid "Password reset" +msgstr "Salasanan nollaus" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Salasanasi on asetettu. Nyt voit kirjautua sisään." + +msgid "Password reset confirmation" +msgstr "Salasanan nollauksen vahvistus" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Syötä uusi salasanasi kaksi kertaa, jotta voimme varmistaa että syötit sen " +"oikein." + +msgid "New password:" +msgstr "Uusi salasana:" + +msgid "Confirm password:" +msgstr "Varmista uusi salasana:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Salasanan nollauslinkki oli virheellinen, mahdollisesti siksi että se on jo " +"käytetty. Ole hyvä ja pyydä uusi salasanan nollaus." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Sinulle on lähetetty sähköpostitse ohjeet salasanasi asettamiseen, mikäli " +"antamallasi sähköpostiosoitteella on olemassa tili." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Jos viestiä ei näy, ole hyvä ja varmista syöttäneesi oikea sähköpostiosoite " +"sekä tarkista sähköpostisi roskapostikansio." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Tämä viesti on lähetetty sinulle, koska olet pyytänyt %(site_name)s -" +"sivustolla salasanan palautusta." + +msgid "Please go to the following page and choose a new password:" +msgstr "Määrittele uusi salasanasi oheisella sivulla:" + +msgid "Your username, in case you've forgotten:" +msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:" + +msgid "Thanks for using our site!" +msgstr "Kiitos vierailustasi sivuillamme!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s -sivuston ylläpitäjät" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Unohditko salasanasi? Syötä sähköpostiosoitteesi alle ja lähetämme sinulle " +"ohjeet uuden salasanan asettamiseksi." + +msgid "Email address:" +msgstr "Sähköpostiosoite:" + +msgid "Reset my password" +msgstr "Nollaa salasanani" + +msgid "All dates" +msgstr "Kaikki päivät" + +#, python-format +msgid "Select %s" +msgstr "Valitse %s" + +#, python-format +msgid "Select %s to change" +msgstr "Valitse muokattava %s" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "Pvm:" + +msgid "Time:" +msgstr "Klo:" + +msgid "Lookup" +msgstr "Etsi" + +msgid "Currently:" +msgstr "Tällä hetkellä:" + +msgid "Change:" +msgstr "Muokkaa:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..10d6422 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fefbe0d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6803b9c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po new file mode 100644 index 0000000..e531548 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,703 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alex Gaynor , 2011 +# Jannis Leidel , 2011 +# Meir Kriheli , 2011-2015,2017,2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-19 16:40+0000\n" +"Last-Translator: Meir Kriheli \n" +"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " +"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s נמחקו בהצלחה." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "לא ניתן למחוק %(name)s" + +msgid "Are you sure?" +msgstr "האם את/ה בטוח/ה ?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "מחק %(verbose_name_plural)s שנבחרו" + +msgid "Administration" +msgstr "ניהול" + +msgid "All" +msgstr "הכל" + +msgid "Yes" +msgstr "כן" + +msgid "No" +msgstr "לא" + +msgid "Unknown" +msgstr "לא ידוע" + +msgid "Any date" +msgstr "כל תאריך" + +msgid "Today" +msgstr "היום" + +msgid "Past 7 days" +msgstr "בשבוע האחרון" + +msgid "This month" +msgstr "החודש" + +msgid "This year" +msgstr "השנה" + +msgid "No date" +msgstr "ללא תאריך" + +msgid "Has date" +msgstr "עם תאריך" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"נא להזין את %(username)s והסיסמה הנכונים לחשבון איש צוות. נא לשים לב כי שני " +"השדות רגישים לאותיות גדולות/קטנות." + +msgid "Action:" +msgstr "פעולה" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "הוספת %(verbose_name)s" + +msgid "Remove" +msgstr "להסיר" + +msgid "Addition" +msgstr "הוספה" + +msgid "Change" +msgstr "שינוי" + +msgid "Deletion" +msgstr "מחיקה" + +msgid "action time" +msgstr "זמן פעולה" + +msgid "user" +msgstr "משתמש" + +msgid "content type" +msgstr "סוג תוכן" + +msgid "object id" +msgstr "מזהה אובייקט" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "ייצוג אובייקט" + +msgid "action flag" +msgstr "דגל פעולה" + +msgid "change message" +msgstr "הערה לשינוי" + +msgid "log entry" +msgstr "רישום יומן" + +msgid "log entries" +msgstr "רישומי יומן" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "בוצעה הוספת \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "בוצע שינוי \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "בוצעה מחיקת \"%(object)s\"." + +msgid "LogEntry Object" +msgstr "אובייקט LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "בוצעה הוספת {name} \"{object}\"." + +msgid "Added." +msgstr "נוסף." + +msgid "and" +msgstr "ו" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "בוצע שינוי {fields} עבור {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr " {fields} שונו." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "בוצעה מחיקת {name} \"{object}\"." + +msgid "No fields changed." +msgstr "אף שדה לא השתנה." + +msgid "None" +msgstr "ללא" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"יש להחזיק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה." + +msgid "You may edit it again below." +msgstr "ניתן לערוך שוב מתחת." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה. ניתן להוסיף עוד {name} מתחת.." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "עדכון {name} \"{obj}\" " + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה. ניתן לערוך שוב מתחת." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "עדכון {name} \"{obj}\" בוצע בהצלחה. ניתן להוסיף עוד {name} מתחת." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "שינוי {name} \"{obj}\" בוצע בהצלחה." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "יש לסמן פריטים כדי לבצע עליהם פעולות. לא שונו פריטים." + +msgid "No action selected." +msgstr "לא נבחרה פעולה." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s עם ID \"%(key)s\" לא במצאי. אולי זה נמחק?" + +#, python-format +msgid "Add %s" +msgstr "הוספת %s" + +#, python-format +msgid "Change %s" +msgstr "שינוי %s" + +#, python-format +msgid "View %s" +msgstr "צפיה ב%s" + +msgid "Database error" +msgstr "שגיאת בסיס נתונים" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "שינוי %(count)s %(name)s בוצע בהצלחה." +msgstr[1] "שינוי %(count)s %(name)s בוצע בהצלחה." +msgstr[2] "שינוי %(count)s %(name)s בוצע בהצלחה." +msgstr[3] "שינוי %(count)s %(name)s בוצע בהצלחה." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s נבחר" +msgstr[1] "כל ה־%(total_count)s נבחרו" +msgstr[2] "כל ה־%(total_count)s נבחרו" +msgstr[3] "כל ה־%(total_count)s נבחרו" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 מ %(cnt)s נבחרים" + +#, python-format +msgid "Change history: %s" +msgstr "היסטוריית שינוי: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"מחיקת %(class_name)s %(instance)s תדרוש מחיקת האובייקטים הקשורים והמוגנים " +"הבאים: %(related_objects)s" + +msgid "Django site admin" +msgstr "ניהול אתר Django" + +msgid "Django administration" +msgstr "ניהול Django" + +msgid "Site administration" +msgstr "ניהול אתר" + +msgid "Log in" +msgstr "כניסה" + +#, python-format +msgid "%(app)s administration" +msgstr "ניהול %(app)s" + +msgid "Page not found" +msgstr "דף לא קיים" + +msgid "We're sorry, but the requested page could not be found." +msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש." + +msgid "Home" +msgstr "דף הבית" + +msgid "Server error" +msgstr "שגיאת שרת" + +msgid "Server error (500)" +msgstr "שגיאת שרת (500)" + +msgid "Server Error (500)" +msgstr "שגיאת שרת (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." + +msgid "Run the selected action" +msgstr "הפעל את הפעולה שבחרת בה." + +msgid "Go" +msgstr "בצע" + +msgid "Click here to select the objects across all pages" +msgstr "לחיצה כאן תבחר את האובייקטים בכל העמודים" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "בחירת כל %(total_count)s ה־%(module_name)s" + +msgid "Clear selection" +msgstr "איפוס בחירה" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"ראשית יש להזין שם משתמש וסיסמה. לאחר מכן יהיה ביכולתך לערוך אפשרויות נוספות " +"עבור המשתמש." + +msgid "Enter a username and password." +msgstr "נא לשים שם משתמש וסיסמה." + +msgid "Change password" +msgstr "שינוי סיסמה" + +msgid "Please correct the error below." +msgstr "נא לתקן את השגיאה מתחת." + +msgid "Please correct the errors below." +msgstr "נא לתקן את השגיאות מתחת." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "יש להזין סיסמה חדשה עבור המשתמש %(username)s." + +msgid "Welcome," +msgstr "שלום," + +msgid "View site" +msgstr "צפיה באתר" + +msgid "Documentation" +msgstr "תיעוד" + +msgid "Log out" +msgstr "יציאה" + +#, python-format +msgid "Add %(name)s" +msgstr "הוספת %(name)s" + +msgid "History" +msgstr "היסטוריה" + +msgid "View on site" +msgstr "צפיה באתר" + +msgid "Filter" +msgstr "סינון" + +msgid "Remove from sorting" +msgstr "הסרה ממיון" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "עדיפות מיון: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "החלף כיוון מיון" + +msgid "Delete" +msgstr "מחיקה" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"מחיקת %(object_name)s '%(escaped_object)s' מצריכה מחיקת אובייקטים מקושרים, " +"אך לחשבון שלך אין הרשאות למחיקת סוגי האובייקטים הבאים:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"מחיקת ה%(object_name)s '%(escaped_object)s' תדרוש מחיקת האובייקטים הקשורים " +"והמוגנים הבאים:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"האם ברצונך למחוק את %(object_name)s \"%(escaped_object)s\"? כל הפריטים " +"הקשורים הבאים יימחקו:" + +msgid "Objects" +msgstr "אובייקטים" + +msgid "Yes, I'm sure" +msgstr "כן, אני בטוח/ה" + +msgid "No, take me back" +msgstr "לא, קח אותי חזרה." + +msgid "Delete multiple objects" +msgstr "מחק כמה פריטים" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"מחיקת ב%(objects_name)s הנבחרת תביא במחיקת אובייקטים קשורים, אבל החשבון שלך " +"אינו הרשאה למחוק את הסוגים הבאים של אובייקטים:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"מחיקת ה%(objects_name)s אשר סימנת תדרוש מחיקת האובייקטים הקשורים והמוגנים " +"הבאים:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"האם אתה בטוח שאתה רוצה למחוק את ה%(objects_name)s הנבחר? כל האובייקטים הבאים " +"ופריטים הקשורים להם יימחקו:" + +msgid "View" +msgstr "צפיה" + +msgid "Delete?" +msgstr "מחיקה ?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " לפי %(filter_title)s " + +msgid "Summary" +msgstr "סיכום" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "מודלים ביישום %(name)s" + +msgid "Add" +msgstr "הוספה" + +msgid "You don't have permission to view or edit anything." +msgstr "אין לך הרשאות לצפיה או עריכה." + +msgid "Recent actions" +msgstr "פעולות אחרונות" + +msgid "My actions" +msgstr "הפעולות שלי" + +msgid "None available" +msgstr "לא נמצאו" + +msgid "Unknown content" +msgstr "תוכן לא ידוע" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים " +"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"התחברת בתור %(username)s, אך אין לך הרשאות גישה לעמוד זה. האם ברצונך להתחבר " +"בתור משתמש אחר?" + +msgid "Forgotten your password or username?" +msgstr "שכחת את שם המשתמש והסיסמה שלך ?" + +msgid "Date/time" +msgstr "תאריך/שעה" + +msgid "User" +msgstr "משתמש" + +msgid "Action" +msgstr "פעולה" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו." + +msgid "Show all" +msgstr "הצג הכל" + +msgid "Save" +msgstr "שמירה" + +msgid "Popup closing…" +msgstr "חלון צץ נסגר..." + +msgid "Search" +msgstr "חיפוש" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "תוצאה %(counter)s" +msgstr[1] "%(counter)s תוצאות" +msgstr[2] "%(counter)s תוצאות" +msgstr[3] "%(counter)s תוצאות" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s סה\"כ" + +msgid "Save as new" +msgstr "שמירה כחדש" + +msgid "Save and add another" +msgstr "שמירה והוספת אחר" + +msgid "Save and continue editing" +msgstr "שמירה והמשך עריכה" + +msgid "Save and view" +msgstr "שמירה וצפיה" + +msgid "Close" +msgstr "סגירה" + +#, python-format +msgid "Change selected %(model)s" +msgstr "שינוי %(model)s הנבחר." + +#, python-format +msgid "Add another %(model)s" +msgstr "הוספת %(model)s נוסף." + +#, python-format +msgid "Delete selected %(model)s" +msgstr "מחיקת %(model)s הנבחר." + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "תודה על בילוי זמן איכות עם האתר." + +msgid "Log in again" +msgstr "התחבר/י שוב" + +msgid "Password change" +msgstr "שינוי סיסמה" + +msgid "Your password was changed." +msgstr "סיסמתך שונתה." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"נא להזין את סיסמתך הישנה, לצרכי אבטחה, ולאחר מכן את סיסמתך החדשה פעמיים כדי " +"שנוכל לוודא שהקלדת אותה כראוי." + +msgid "Change my password" +msgstr "שנה את סיסמתי" + +msgid "Password reset" +msgstr "איפוס סיסמה" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "ססמתך נשמרה. כעת ניתן להתחבר." + +msgid "Password reset confirmation" +msgstr "אימות איפוס סיסמה" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "נא להזין את סיסמתך החדשה פעמיים כדי שנוכל לוודא שהקלדת אותה כראוי." + +msgid "New password:" +msgstr "סיסמה חדשה:" + +msgid "Confirm password:" +msgstr "אימות סיסמה:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"הקישור לאיפוס הסיסמה אינו חוקי. ייתכן והשתמשו בו כבר. נא לבקש איפוס סיסמה " +"חדש." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"שלחנו אליך דואר אלקטרוני עם הוראות לקביעת הסיסמה, אם קיים חשבון עם כתובת " +"הדואר שהזנת. ההודעה אמור להגיע בקרוב." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"אם הדוא\"ל לא הגיע, נא לוודא שהזנת כתובת נכונה בעת הרישום ולבדוק את תיקיית " +"דואר הזבל." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"הודעה זו נשלחה אליך עקב בקשתך לאיפוס הסיסמה עבור המשתמש שלך באתר " +"%(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:" + +msgid "Your username, in case you've forgotten:" +msgstr "שם המשתמש שלך, במקרה ששכחת:" + +msgid "Thanks for using our site!" +msgstr "תודה על השימוש באתר שלנו!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "צוות %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"שכחת את סיסמתך ? נא להזין את כתובת הדוא\"ל מתחת, ואנו נשלח הוראות לקביעת " +"סיסמה חדשה." + +msgid "Email address:" +msgstr "כתובת דוא\"ל:" + +msgid "Reset my password" +msgstr "אפס את סיסמתי" + +msgid "All dates" +msgstr "כל התאריכים" + +#, python-format +msgid "Select %s" +msgstr "בחירת %s" + +#, python-format +msgid "Select %s to change" +msgstr "בחירת %s לשינוי" + +#, python-format +msgid "Select %s to view" +msgstr "בחירת %s לצפיה" + +msgid "Date:" +msgstr "תאריך:" + +msgid "Time:" +msgstr "שעה:" + +msgid "Lookup" +msgstr "חפש" + +msgid "Currently:" +msgstr "נוכחי:" + +msgid "Change:" +msgstr "שינוי:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fe37ec5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b8c97bb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po new file mode 100644 index 0000000..8ed2fb9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/django.po @@ -0,0 +1,666 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# alkuma , 2013 +# Chandan kumar , 2012 +# Jannis Leidel , 2011 +# Pratik , 2013 +# Sandeep Satavlekar , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है| |" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s नहीं हटा सकते" + +msgid "Are you sure?" +msgstr "क्या आप निश्चित हैं?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये " + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "सभी" + +msgid "Yes" +msgstr "हाँ" + +msgid "No" +msgstr "नहीं" + +msgid "Unknown" +msgstr "अनजान" + +msgid "Any date" +msgstr "कोई भी तारीख" + +msgid "Today" +msgstr "आज" + +msgid "Past 7 days" +msgstr "पिछले 7 दिन" + +msgid "This month" +msgstr "इस महीने" + +msgid "This year" +msgstr "इस साल" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"कृपया कर्मचारी खाते का सही %(username)s व कूटशब्द भरें। भरते समय दीर्घाक्षर और लघु अक्षर " +"का खयाल रखें।" + +msgid "Action:" +msgstr " क्रिया:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "एक और %(verbose_name)s जोड़ें " + +msgid "Remove" +msgstr "निकालें" + +msgid "action time" +msgstr "कार्य समय" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "वस्तु आई डी " + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "वस्तु प्रतिनिधित्व" + +msgid "action flag" +msgstr "कार्य ध्वज" + +msgid "change message" +msgstr "परिवर्तन सन्देश" + +msgid "log entry" +msgstr "लॉग प्रविष्टि" + +msgid "log entries" +msgstr "लॉग प्रविष्टियाँ" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" को जोड़ा गया." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "परिवर्तित \"%(object)s\" - %(changes)s " + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" को नष्ट कर दिया है." + +msgid "LogEntry Object" +msgstr "LogEntry ऑब्जेक्ट" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "और" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "कोई क्षेत्र नहीं बदला" + +msgid "None" +msgstr "कोई नहीं" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "कार्रवाई हेतु आयटम सही अनुक्रम में चुने जाने चाहिए | कोई आइटम नहीं बदले गये हैं." + +msgid "No action selected." +msgstr "कोई कार्रवाई नहीं चुनी है |" + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" को कामयाबी से निकाला गया है" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "%s बढाएं" + +#, python-format +msgid "Change %s" +msgstr "%s बदलो" + +msgid "Database error" +msgstr "डेटाबेस त्रुटि" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" +msgstr[1] "%(count)s %(name)s का परिवर्तन कामयाब हुआ |" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s चुने" +msgstr[1] "सभी %(total_count)s चुने " + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s में से 0 चुने" + +#, python-format +msgid "Change history: %s" +msgstr "इतिहास बदलो: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "ज्याँगो साइट प्रशासन" + +msgid "Django administration" +msgstr "ज्याँगो प्रशासन" + +msgid "Site administration" +msgstr "साइट प्रशासन" + +msgid "Log in" +msgstr "लॉगिन" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "पृष्ठ लापता" + +msgid "We're sorry, but the requested page could not be found." +msgstr "क्षमा कीजिए पर निवेदित पृष्ठ लापता है ।" + +msgid "Home" +msgstr "गृह" + +msgid "Server error" +msgstr "सर्वर त्रुटि" + +msgid "Server error (500)" +msgstr "सर्वर त्रुटि (500)" + +msgid "Server Error (500)" +msgstr "सर्वर त्रुटि (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"एक त्रुटि मिली है। इसकी जानकारी स्थल के संचालकों को डाक द्वारा दे दी गई है, और यह जल्द " +"ठीक हो जानी चाहिए। धीरज रखने के लिए शुक्रिया।" + +msgid "Run the selected action" +msgstr "चयनित कार्रवाई चलाइये" + +msgid "Go" +msgstr "आगे बढ़े" + +msgid "Click here to select the objects across all pages" +msgstr "सभी पृष्ठों पर मौजूद वस्तुओं को चुनने के लिए यहाँ क्लिक करें " + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "तमाम %(total_count)s %(module_name)s चुनें" + +msgid "Clear selection" +msgstr "चयन खालिज किया जाये " + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"पहले प्रदवोक्ता नाम और कूटशब्द दर्ज करें । उसके पश्चात ही आप अधिक प्रवोक्ता विकल्प बदल " +"सकते हैं ।" + +msgid "Enter a username and password." +msgstr "उपयोगकर्ता का नाम और कूटशब्द दर्ज करें." + +msgid "Change password" +msgstr "कूटशब्द बदलें" + +msgid "Please correct the error below." +msgstr "कृपया नीचे पायी गयी गलतियाँ ठीक करें ।" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s प्रवोक्ता के लिए नयी कूटशब्द दर्ज करें ।" + +msgid "Welcome," +msgstr "आपका स्वागत है," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "दस्तावेज़ीकरण" + +msgid "Log out" +msgstr "लॉग आउट" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s बढाएं" + +msgid "History" +msgstr "इतिहास" + +msgid "View on site" +msgstr "साइट पे देखें" + +msgid "Filter" +msgstr "छन्नी" + +msgid "Remove from sorting" +msgstr "श्रेणीकरण से हटाये " + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "श्रेणीकरण प्राथमिकता : %(priority_number)s" + +msgid "Toggle sorting" +msgstr "टॉगल श्रेणीकरण" + +msgid "Delete" +msgstr "मिटाएँ" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' को मिटाने पर सम्बंधित वस्तुएँ भी मिटा दी " +"जाएगी, परन्तु आप के खाते में निम्नलिखित प्रकार की वस्तुओं को मिटाने की अनुमति नहीं हैं |" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' को हटाने के लिए उनसे संबंधित निम्नलिखित " +"संरक्षित वस्तुओं को हटाने की आवश्यकता होगी:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"क्या आप %(object_name)s \"%(escaped_object)s\" हटाना चाहते हैं? निम्नलिखित सभी " +"संबंधित वस्तुएँ नष्ट की जाएगी" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "हाँ, मैंने पक्का तय किया हैं " + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "अनेक वस्तुएं हटाएँ" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"चयनित %(objects_name)s हटाने पर उस से सम्बंधित वस्तुएं भी हट जाएगी, परन्तु आपके खाते में " +"वस्तुओं के निम्नलिखित प्रकार हटाने की अनुमति नहीं है:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"चयनित %(objects_name)s को हटाने के पश्चात् निम्नलिखित संरक्षित संबंधित वस्तुओं को हटाने " +"की आवश्यकता होगी |" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"क्या आप ने पक्का तय किया हैं की चयनित %(objects_name)s को नष्ट किया जाये ? " +"निम्नलिखित सभी वस्तुएं और उनसे सम्बंधित वस्तुए भी नष्ट की जाएगी:" + +msgid "Change" +msgstr "बदलें" + +msgid "Delete?" +msgstr "मिटाएँ ?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s द्वारा" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s अनुप्रयोग के प्रतिरूप" + +msgid "Add" +msgstr "बढाएं" + +msgid "You don't have permission to edit anything." +msgstr "आपके पास कुछ भी संपादन करने के लिये अनुमति नहीं है ।" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr " कोई भी उपलब्ध नहीं" + +msgid "Unknown content" +msgstr "अज्ञात सामग्री" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"अपने डेटाबेस स्थापना के साथ कुछ गलत तो है | सुनिश्चित करें कि उचित डेटाबेस तालिका बनायीं " +"गयी है, और सुनिश्चित करें कि डेटाबेस उपयुक्त उपयोक्ता के द्वारा पठनीय है |" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "अपना पासवर्ड या उपयोगकर्ता नाम भूल गये हैं?" + +msgid "Date/time" +msgstr "तिथि / समय" + +msgid "User" +msgstr "उपभोक्ता" + +msgid "Action" +msgstr "कार्य" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"इस वस्तु का बदलाव इतिहास नहीं है. शायद वह इस साइट व्यवस्थापक के माध्यम से नहीं जोड़ा " +"गया है." + +msgid "Show all" +msgstr "सभी दिखाएँ" + +msgid "Save" +msgstr "सुरक्षित कीजिये" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "खोज" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s परिणाम" +msgstr[1] "%(counter)s परिणाम" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s कुल परिणाम" + +msgid "Save as new" +msgstr "नये सा सहेजें" + +msgid "Save and add another" +msgstr "सहेजें और एक और जोडें" + +msgid "Save and continue editing" +msgstr "सहेजें और संपादन करें" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "आज हमारे वेब साइट पर आने के लिए धन्यवाद ।" + +msgid "Log in again" +msgstr "फिर से लॉगिन कीजिए" + +msgid "Password change" +msgstr "कूटशब्द बदलें" + +msgid "Your password was changed." +msgstr "आपके कूटशब्द को बदला गया है" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"सुरक्षा कारणों के लिए कृपया पुराना कूटशब्द दर्ज करें । उसके पश्चात नए कूटशब्द को दो बार दर्ज " +"करें ताकि हम उसे सत्यापित कर सकें ।" + +msgid "Change my password" +msgstr "कूटशब्द बदलें" + +msgid "Password reset" +msgstr "कूटशब्द पुनस्थाप" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "आपके कूटशब्द को स्थापित किया गया है । अब आप लॉगिन कर सकते है ।" + +msgid "Password reset confirmation" +msgstr "कूटशब्द पुष्टि" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "कृपया आपके नये कूटशब्द को दो बार दर्ज करें ताकि हम उसकी सत्याप्ती कर सकते है ।" + +msgid "New password:" +msgstr "नया कूटशब्द " + +msgid "Confirm password:" +msgstr "कूटशब्द पुष्टि कीजिए" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"कूटशब्द पुनस्थाप संपर्क अमान्य है, संभावना है कि उसे उपयोग किया गया है। कृपया फिर से कूटशब्द " +"पुनस्थाप की आवेदन करें ।" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"अगर आपको कोई ईमेल प्राप्त नई होता है,यह ध्यान रखे की आपने सही पता रजिस्ट्रीकृत किया है " +"और आपने स्पॅम फोल्डर को जाचे|" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"आपको यह डाक इसलिए आई है क्योंकि आप ने %(site_name)s पर अपने खाते का कूटशब्द बदलने का " +"अनुरोध किया था |" + +msgid "Please go to the following page and choose a new password:" +msgstr "कृपया निम्नलिखित पृष्ठ पर नया कूटशब्द चुनिये :" + +msgid "Your username, in case you've forgotten:" +msgstr "आपका प्रवोक्ता नाम, यदि भूल गये हों :" + +msgid "Thanks for using our site!" +msgstr "हमारे साइट को उपयोग करने के लिए धन्यवाद ।" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s दल" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"कूटशब्द भूल गए? नीचे अपना डाक पता भरें, वहाँ पर हम आपको नया कूटशब्द रखने के निर्देश भेजेंगे।" + +msgid "Email address:" +msgstr "डाक पता -" + +msgid "Reset my password" +msgstr " मेरे कूटशब्द की पुनःस्थापना" + +msgid "All dates" +msgstr "सभी तिथियों" + +#, python-format +msgid "Select %s" +msgstr "%s चुनें" + +#, python-format +msgid "Select %s to change" +msgstr "%s के बदली के लिए चयन करें" + +msgid "Date:" +msgstr "तिथि:" + +msgid "Time:" +msgstr "समय:" + +msgid "Lookup" +msgstr "लुक अप" + +msgid "Currently:" +msgstr "फ़िलहाल - " + +msgid "Change:" +msgstr "बदलाव -" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..bb755ad Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..78b49e7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hi/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chandan kumar , 2012 +# Jannis Leidel , 2011 +# Sandeep Satavlekar , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "उपलब्ध %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को चुन सकते हैं और " +"उसके बाद दो बॉक्स के बीच \"चुनें\" तीर पर क्लिक करें." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "इस बॉक्स में टाइप करने के लिए नीचे उपलब्ध %s की सूची को फ़िल्टर करें." + +msgid "Filter" +msgstr "छानना" + +msgid "Choose all" +msgstr "सभी चुनें" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "एक ही बार में सभी %s को चुनने के लिए क्लिक करें." + +msgid "Choose" +msgstr "चुनें" + +msgid "Remove" +msgstr "हटाना" + +#, javascript-format +msgid "Chosen %s" +msgstr "चुनें %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"यह उपलब्ध %s की सूची है. आप उन्हें नीचे दिए गए बॉक्स में से चयन करके कुछ को हटा सकते हैं और " +"उसके बाद दो बॉक्स के बीच \"हटायें\" तीर पर क्लिक करें." + +msgid "Remove all" +msgstr "सभी को हटाएँ" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "एक ही बार में सभी %s को हटाने के लिए क्लिक करें." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)s में से %(sel)s चुना गया हैं" +msgstr[1] "%(cnt)s में से %(sel)s चुने गए हैं" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी रक्षित नहीं हैं | अगर आप कुछ कार्रवाई " +"करते हो तो वे खो जायेंगे |" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"आप ने कार्रवाई तो चुनी हैं, पर स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में किये हुए बदल अभी सुरक्षित " +"नहीं किये हैं| उन्हें सुरक्षित करने के लिए कृपया 'ओके' क्लिक करे | आप को चुनी हुई कार्रवाई " +"दोबारा चलानी होगी |" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"आप ने कार्रवाई चुनी हैं, और आप ने स्वतंत्र सम्पादनक्षम क्षेत्र/स्तम्भ में बदल नहीं किये हैं| " +"संभवतः 'सेव' बटन के बजाय आप 'गो' बटन ढून्ढ रहे हो |" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "अब" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "एक समय चुनें" + +msgid "Midnight" +msgstr "मध्यरात्री" + +msgid "6 a.m." +msgstr "सुबह 6 बजे" + +msgid "Noon" +msgstr "दोपहर" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "रद्द करें" + +msgid "Today" +msgstr "आज" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "कल (बीता)" + +msgid "Tomorrow" +msgstr "कल" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "दिखाओ" + +msgid "Hide" +msgstr " छिपाओ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..e8231f6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hr/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..fd76d35 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..f7986c9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,664 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s delite con successo." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Non pote deler %(name)s" + +msgid "Are you sure?" +msgstr "Es tu secur?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Deler le %(verbose_name_plural)s seligite" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Totes" + +msgid "Yes" +msgstr "Si" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Incognite" + +msgid "Any date" +msgstr "Omne data" + +msgid "Today" +msgstr "Hodie" + +msgid "Past 7 days" +msgstr "Ultime 7 dies" + +msgid "This month" +msgstr "Iste mense" + +msgid "This year" +msgstr "Iste anno" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "Action:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Adder un altere %(verbose_name)s" + +msgid "Remove" +msgstr "Remover" + +msgid "action time" +msgstr "hora de action" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "id de objecto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr de objecto" + +msgid "action flag" +msgstr "marca de action" + +msgid "change message" +msgstr "message de cambio" + +msgid "log entry" +msgstr "entrata de registro" + +msgid "log entries" +msgstr "entratas de registro" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" addite." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" cambiate - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" delite." + +msgid "LogEntry Object" +msgstr "Objecto LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "e" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Nulle campo cambiate." + +msgid "None" +msgstr "Nulle" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Es necessari seliger elementos pro poter exequer actiones. Nulle elemento ha " +"essite cambiate." + +msgid "No action selected." +msgstr "Nulle action seligite." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Le %(name)s \"%(obj)s\" ha essite delite con successo." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Adder %s" + +#, python-format +msgid "Change %s" +msgstr "Cambiar %s" + +msgid "Database error" +msgstr "Error in le base de datos" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s cambiate con successo." +msgstr[1] "%(count)s %(name)s cambiate con successo." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s seligite" +msgstr[1] "Tote le %(total_count)s seligite" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 de %(cnt)s seligite" + +#, python-format +msgid "Change history: %s" +msgstr "Historia de cambiamentos: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Administration del sito Django" + +msgid "Django administration" +msgstr "Administration de Django" + +msgid "Site administration" +msgstr "Administration del sito" + +msgid "Log in" +msgstr "Aperir session" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Pagina non trovate" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Regrettabilemente, le pagina requestate non poteva esser trovate." + +msgid "Home" +msgstr "Initio" + +msgid "Server error" +msgstr "Error del servitor" + +msgid "Server error (500)" +msgstr "Error del servitor (500)" + +msgid "Server Error (500)" +msgstr "Error del servitor (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Exequer le action seligite" + +msgid "Go" +msgstr "Va" + +msgid "Click here to select the objects across all pages" +msgstr "Clicca hic pro seliger le objectos in tote le paginas" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Seliger tote le %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Rader selection" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Primo, specifica un nomine de usator e un contrasigno. Postea, tu potera " +"modificar plus optiones de usator." + +msgid "Enter a username and password." +msgstr "Specifica un nomine de usator e un contrasigno." + +msgid "Change password" +msgstr "Cambiar contrasigno" + +msgid "Please correct the error below." +msgstr "Per favor corrige le errores sequente." + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Specifica un nove contrasigno pro le usator %(username)s." + +msgid "Welcome," +msgstr "Benvenite," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Documentation" + +msgid "Log out" +msgstr "Clauder session" + +#, python-format +msgid "Add %(name)s" +msgstr "Adder %(name)s" + +msgid "History" +msgstr "Historia" + +msgid "View on site" +msgstr "Vider in sito" + +msgid "Filter" +msgstr "Filtro" + +msgid "Remove from sorting" +msgstr "Remover del ordination" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioritate de ordination: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Alternar le ordination" + +msgid "Delete" +msgstr "Deler" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Deler le %(object_name)s '%(escaped_object)s' resultarea in le deletion de " +"objectos associate, me tu conto non ha le permission de deler objectos del " +"sequente typos:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Deler le %(object_name)s '%(escaped_object)s' necessitarea le deletion del " +"sequente objectos associate protegite:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Es tu secur de voler deler le %(object_name)s \"%(escaped_object)s\"? Tote " +"le sequente objectos associate essera delite:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Si, io es secur" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Deler plure objectos" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Deler le %(objects_name)s seligite resultarea in le deletion de objectos " +"associate, ma tu conto non ha le permission de deler objectos del sequente " +"typos:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Deler le %(objects_name)s seligite necessitarea le deletion del sequente " +"objectos associate protegite:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Es tu secur de voler deler le %(objects_name)s seligite? Tote le sequente " +"objectos e le objectos associate a illo essera delite:" + +msgid "Change" +msgstr "Cambiar" + +msgid "Delete?" +msgstr "Deler?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Per %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Adder" + +msgid "You don't have permission to edit anything." +msgstr "Tu non ha le permission de modificar alcun cosa." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Nihil disponibile" + +msgid "Unknown content" +msgstr "Contento incognite" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Il ha un problema con le installation del base de datos. Assecura te que le " +"tabellas correcte ha essite create, e que le base de datos es legibile pro " +"le usator appropriate." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Contrasigno o nomine de usator oblidate?" + +msgid "Date/time" +msgstr "Data/hora" + +msgid "User" +msgstr "Usator" + +msgid "Action" +msgstr "Action" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Iste objecto non ha un historia de cambiamentos. Illo probabilemente non " +"esseva addite per medio de iste sito administrative." + +msgid "Show all" +msgstr "Monstrar toto" + +msgid "Save" +msgstr "Salveguardar" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Cercar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultato" +msgstr[1] "%(counter)s resultatos" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s in total" + +msgid "Save as new" +msgstr "Salveguardar como nove" + +msgid "Save and add another" +msgstr "Salveguardar e adder un altere" + +msgid "Save and continue editing" +msgstr "Salveguardar e continuar le modification" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Gratias pro haber passate un tempore agradabile con iste sito web." + +msgid "Log in again" +msgstr "Aperir session de novo" + +msgid "Password change" +msgstr "Cambio de contrasigno" + +msgid "Your password was changed." +msgstr "Tu contrasigno ha essite cambiate." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Per favor specifica tu ancian contrasigno, pro securitate, e postea " +"specifica tu nove contrasigno duo vices pro verificar que illo es scribite " +"correctemente." + +msgid "Change my password" +msgstr "Cambiar mi contrasigno" + +msgid "Password reset" +msgstr "Reinitialisar contrasigno" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Tu contrasigno ha essite reinitialisate. Ora tu pote aperir session." + +msgid "Password reset confirmation" +msgstr "Confirmation de reinitialisation de contrasigno" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Per favor scribe le nove contrasigno duo vices pro verificar que illo es " +"scribite correctemente." + +msgid "New password:" +msgstr "Nove contrasigno:" + +msgid "Confirm password:" +msgstr "Confirma contrasigno:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Le ligamine pro le reinitialisation del contrasigno esseva invalide, forsan " +"perque illo ha jam essite usate. Per favor submitte un nove demanda de " +"reinitialisation del contrasigno." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "Per favor va al sequente pagina pro eliger un nove contrasigno:" + +msgid "Your username, in case you've forgotten:" +msgstr "Tu nomine de usator, in caso que tu lo ha oblidate:" + +msgid "Thanks for using our site!" +msgstr "Gratias pro usar nostre sito!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Le equipa de %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "Reinitialisar mi contrasigno" + +msgid "All dates" +msgstr "Tote le datas" + +#, python-format +msgid "Select %s" +msgstr "Selige %s" + +#, python-format +msgid "Select %s to change" +msgstr "Selige %s a modificar" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Hora:" + +msgid "Lookup" +msgstr "Recerca" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..4c9eccc Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ia/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po new file mode 100644 index 0000000..f4b29b2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/django.po @@ -0,0 +1,715 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014 +# Fery Setiawan , 2015-2019 +# Jannis Leidel , 2011 +# M Asep Indrayana , 2015 +# oon arfiandwi , 2016 +# rodin , 2011-2013 +# rodin , 2013-2017 +# Sutrisno Efendi , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-26 23:57+0000\n" +"Last-Translator: Fery Setiawan \n" +"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Sukes menghapus %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Tidak dapat menghapus %(name)s" + +msgid "Are you sure?" +msgstr "Yakin?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Hapus %(verbose_name_plural)s yang dipilih" + +msgid "Administration" +msgstr "Administrasi" + +msgid "All" +msgstr "Semua" + +msgid "Yes" +msgstr "Ya" + +msgid "No" +msgstr "Tidak" + +msgid "Unknown" +msgstr "Tidak diketahui" + +msgid "Any date" +msgstr "Kapanpun" + +msgid "Today" +msgstr "Hari ini" + +msgid "Past 7 days" +msgstr "Tujuh hari terakhir" + +msgid "This month" +msgstr "Bulan ini" + +msgid "This year" +msgstr "Tahun ini" + +msgid "No date" +msgstr "Tidak ada tanggal" + +msgid "Has date" +msgstr "Ada tanggal" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Masukkan nama pengguna %(username)s dan sandi yang benar untuk akun staf. " +"Huruf besar/kecil pada bidang ini berpengaruh." + +msgid "Action:" +msgstr "Aksi:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Tambahkan %(verbose_name)s lagi" + +msgid "Remove" +msgstr "Hapus" + +msgid "Addition" +msgstr "Tambahan" + +msgid "Change" +msgstr "Ubah" + +msgid "Deletion" +msgstr "Penghapusan" + +msgid "action time" +msgstr "waktu aksi" + +msgid "user" +msgstr "pengguna" + +msgid "content type" +msgstr "jenis isi" + +msgid "object id" +msgstr "id objek" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "representasi objek" + +msgid "action flag" +msgstr "jenis aksi" + +msgid "change message" +msgstr "ganti pesan" + +msgid "log entry" +msgstr "entri pencatatan" + +msgid "log entries" +msgstr "entri pencatatan" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" ditambahkan." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" diubah - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" dihapus." + +msgid "LogEntry Object" +msgstr "Objek LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} ditambahkan \"{object}\"." + +msgid "Added." +msgstr "Ditambahkan." + +msgid "and" +msgstr "dan" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{fields} berubah untuk {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} berubah." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr " {name} dihapus \"{object}\"." + +msgid "No fields changed." +msgstr "Tidak ada bidang yang berubah." + +msgid "None" +msgstr "None" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Tekan \"Control\", atau \"Command\" pada Mac, untuk memilih lebih dari satu." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" telah berhasil ditambahkan." + +msgid "You may edit it again below." +msgstr "Anda dapat menyunting itu kembali dibawah." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" telah berhasil ditambahkan. Anda dapat menambahkan {name} " +"lain di bawah." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +" {name} \"{obj}\" telah berhasil diubah. Anda dapat mengeditnya kembali di " +"bawah." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" telah berhasil ditambahkan. Anda dapat mengeditnya kembali " +"di bawah." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" telah berhasil diubah. Anda dapat menambahkan {name} lain " +"di bawah." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" telah berhasil diubah." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Objek harus dipilih sebelum dimanipulasi. Tidak ada objek yang berubah." + +msgid "No action selected." +msgstr "Tidak ada aksi yang dipilih." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" berhasil dihapus." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s dengan ID \"%(key)s\" tidak ada. Mungkin telah dihapus?" + +#, python-format +msgid "Add %s" +msgstr "Tambahkan %s" + +#, python-format +msgid "Change %s" +msgstr "Ubah %s" + +#, python-format +msgid "View %s" +msgstr "Melihat %s" + +msgid "Database error" +msgstr "Galat basis data" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s berhasil diubah." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s dipilih" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 dari %(cnt)s dipilih" + +#, python-format +msgid "Change history: %s" +msgstr "Ubah riwayat: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Menghapus %(class_name)s %(instance)s memerlukan penghapusanobjek " +"terlindungi yang terkait sebagai berikut: %(related_objects)s" + +msgid "Django site admin" +msgstr "Admin situs Django" + +msgid "Django administration" +msgstr "Administrasi Django" + +msgid "Site administration" +msgstr "Administrasi situs" + +msgid "Log in" +msgstr "Masuk" + +#, python-format +msgid "%(app)s administration" +msgstr "Administrasi %(app)s" + +msgid "Page not found" +msgstr "Laman tidak ditemukan" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Maaf, laman yang Anda minta tidak ditemukan." + +msgid "Home" +msgstr "Beranda" + +msgid "Server error" +msgstr "Galat server" + +msgid "Server error (500)" +msgstr "Galat server (500)" + +msgid "Server Error (500)" +msgstr "Galat Server (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Galat terjadi dan telah dilaporkan ke administrator situs lewat email untuk " +"diperbaiki. Terima kasih atas pengertiannya." + +msgid "Run the selected action" +msgstr "Jalankan aksi terpilih" + +msgid "Go" +msgstr "Buka" + +msgid "Click here to select the objects across all pages" +msgstr "Klik di sini untuk memilih semua objek pada semua laman" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Pilih seluruh %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Bersihkan pilihan" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Pertama-tama, masukkan nama pengguna dan sandi. Anda akan dapat mengubah " +"opsi pengguna lain setelah itu." + +msgid "Enter a username and password." +msgstr "Masukkan nama pengguna dan sandi." + +msgid "Change password" +msgstr "Ganti sandi" + +msgid "Please correct the error below." +msgstr "Harap perbaiki kesalahan dibawah." + +msgid "Please correct the errors below." +msgstr "Perbaiki galat di bawah ini." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Masukkan sandi baru untuk pengguna %(username)s." + +msgid "Welcome," +msgstr "Selamat datang," + +msgid "View site" +msgstr "Lihat situs" + +msgid "Documentation" +msgstr "Dokumentasi" + +msgid "Log out" +msgstr "Keluar" + +#, python-format +msgid "Add %(name)s" +msgstr "Tambahkan %(name)s" + +msgid "History" +msgstr "Riwayat" + +msgid "View on site" +msgstr "Lihat di situs" + +msgid "Filter" +msgstr "Filter" + +msgid "Remove from sorting" +msgstr "Dihapus dari pengurutan" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioritas pengurutan: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Ubah pengurutan" + +msgid "Delete" +msgstr "Hapus" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Menghapus %(object_name)s '%(escaped_object)s' akan menghapus objek lain " +"yang terkait, tetapi akun Anda tidak memiliki izin untuk menghapus objek " +"dengan tipe berikut:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Menghapus %(object_name)s '%(escaped_object)s' memerlukan penghapusan objek " +"terlindungi yang terkait sebagai berikut:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Yakin ingin menghapus %(object_name)s \"%(escaped_object)s\"? Semua objek " +"lain yang terkait juga akan dihapus:" + +msgid "Objects" +msgstr "Objek" + +msgid "Yes, I'm sure" +msgstr "Ya, tentu saja" + +msgid "No, take me back" +msgstr "Tidak, bawa saya kembali" + +msgid "Delete multiple objects" +msgstr "Hapus beberapa objek sekaligus" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Menghapus %(objects_name)s terpilih akan menghapus objek yang terkait, " +"tetapi akun Anda tidak memiliki izin untuk menghapus objek dengan tipe " +"berikut:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Menghapus %(objects_name)s terpilih memerlukan penghapusan objek terlindungi " +"yang terkait sebagai berikut:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Yakin akan menghapus %(objects_name)s terpilih? Semua objek berikut beserta " +"objek terkait juga akan dihapus:" + +msgid "View" +msgstr "Tampilan" + +msgid "Delete?" +msgstr "Hapus?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Berdasarkan %(filter_title)s " + +msgid "Summary" +msgstr "Ringkasan" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model pada aplikasi %(name)s" + +msgid "Add" +msgstr "Tambah" + +msgid "You don't have permission to view or edit anything." +msgstr "Anda tidak mempunyai perizinan untuk melihat atau menyunting apapun." + +msgid "Recent actions" +msgstr "Tindakan terbaru" + +msgid "My actions" +msgstr "Tindakan saya" + +msgid "None available" +msgstr "Tidak ada yang tersedia" + +msgid "Unknown content" +msgstr "Konten tidak diketahui" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Ada masalah dengan instalasi basis data Anda. Pastikan tabel yang sesuai " +"pada basis data telah dibuat dan dapat dibaca oleh pengguna yang benar." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Anda diautentikasi sebagai %(username)s, tapi tidak diperbolehkan untuk " +"mengakses halaman ini. Ingin mencoba mengakses menggunakan akun yang lain?" + +msgid "Forgotten your password or username?" +msgstr "Lupa nama pengguna atau sandi?" + +msgid "Date/time" +msgstr "Tanggal/waktu" + +msgid "User" +msgstr "Pengguna" + +msgid "Action" +msgstr "Aksi" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Objek ini tidak memiliki riwayat perubahan. Kemungkinan objek ini tidak " +"ditambahkan melalui situs administrasi ini." + +msgid "Show all" +msgstr "Tampilkan semua" + +msgid "Save" +msgstr "Simpan" + +msgid "Popup closing…" +msgstr "Menutup popup..." + +msgid "Search" +msgstr "Cari" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s buah" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s total" + +msgid "Save as new" +msgstr "Simpan sebagai baru" + +msgid "Save and add another" +msgstr "Simpan dan tambahkan lagi" + +msgid "Save and continue editing" +msgstr "Simpan dan terus mengedit" + +msgid "Save and view" +msgstr "Simpan dan tampilkan" + +msgid "Close" +msgstr "Tutup" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Ubah %(model)s yang dipilih" + +#, python-format +msgid "Add another %(model)s" +msgstr "Tambahkan %(model)s yang lain" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Hapus %(model)s yang dipilih" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Terima kasih telah menggunakan situs ini hari ini." + +msgid "Log in again" +msgstr "Masuk kembali" + +msgid "Password change" +msgstr "Ubah sandi" + +msgid "Your password was changed." +msgstr "Sandi Anda telah diubah." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Dengan alasan keamanan, masukkan sandi lama Anda dua kali untuk memastikan " +"Anda tidak salah mengetikkannya." + +msgid "Change my password" +msgstr "Ubah sandi saya" + +msgid "Password reset" +msgstr "Setel ulang sandi" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Sandi Anda telah diperbarui. Silakan masuk." + +msgid "Password reset confirmation" +msgstr "Konfirmasi penyetelan ulang sandi" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Masukkan sandi baru dua kali untuk memastikan Anda tidak salah " +"mengetikkannya." + +msgid "New password:" +msgstr "Sandi baru:" + +msgid "Confirm password:" +msgstr "Konfirmasi sandi:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Tautan penyetelan ulang sandi tidak valid. Kemungkinan karena tautan " +"tersebut telah dipakai sebelumnya. Ajukan permintaan penyetelan sandi sekali " +"lagi." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Kami mengirimi Anda petunjuk untuk mengubah kata sandi. Jika ada akun dengan " +"alamat email yang sesuai. Anda seharusnya menerimanya sesaat lagi." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Jika Anda tidak menerima email, pastikan Anda telah memasukkan alamat yang " +"digunakan saat pendaftaran serta periksa folder spam Anda." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Anda menerima email ini karena Anda meminta penyetelan ulang sandi untuk " +"akun pengguna di %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Kunjungi laman di bawah ini dan ketikkan sandi baru:" + +msgid "Your username, in case you've forgotten:" +msgstr "Nama pengguna Anda, jika lupa:" + +msgid "Thanks for using our site!" +msgstr "Terima kasih telah menggunakan situs kami!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Tim %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Lupa sandinya? Masukkan alamat email Anda di bawah ini agar kami dapat " +"mengirimkan petunjuk untuk menyetel ulang sandinya." + +msgid "Email address:" +msgstr "Alamat email:" + +msgid "Reset my password" +msgstr "Setel ulang sandi saya" + +msgid "All dates" +msgstr "Semua tanggal" + +#, python-format +msgid "Select %s" +msgstr "Pilih %s" + +#, python-format +msgid "Select %s to change" +msgstr "Pilih %s untuk diubah" + +#, python-format +msgid "Select %s to view" +msgstr "Pilih %s untuk melihat" + +msgid "Date:" +msgstr "Tanggal:" + +msgid "Time:" +msgstr "Waktu:" + +msgid "Lookup" +msgstr "Cari" + +msgid "Currently:" +msgstr "Saat ini:" + +msgid "Change:" +msgstr "Ubah:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..6b7bff3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..aa096df --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fery Setiawan , 2015-2016 +# Jannis Leidel , 2011 +# rodin , 2011-2012 +# rodin , 2014,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: rodin \n" +"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s yang tersedia" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Berikut adalah daftar %s yang tersedia. Anda dapat memilih satu atau lebih " +"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Pilih\" " +"di antara kedua kotak." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Ketik pada kotak ini untuk menyaring daftar %s yang tersedia." + +msgid "Filter" +msgstr "Filter" + +msgid "Choose all" +msgstr "Pilih semua" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Pilih untuk memilih seluruh %s sekaligus." + +msgid "Choose" +msgstr "Pilih" + +msgid "Remove" +msgstr "Hapus" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s terpilih" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Berikut adalah daftar %s yang terpilih. Anda dapat menghapus satu atau lebih " +"dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Hapus\" " +"di antara kedua kotak." + +msgid "Remove all" +msgstr "Hapus semua" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik untuk menghapus semua pilihan %s sekaligus." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s dari %(cnt)s terpilih" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Beberapa perubahan bidang yang Anda lakukan belum tersimpan. Perubahan yang " +"telah dilakukan akan hilang." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Anda telah memilih sebuah aksi, tetapi belum menyimpan perubahan ke bidang " +"yang ada. Klik OK untuk menyimpan perubahan ini. Anda akan perlu mengulangi " +"aksi tersebut kembali." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Anda telah memilih sebuah aksi, tetapi belum mengubah bidang apapun. " +"Kemungkinan Anda mencari tombol Buka dan bukan tombol Simpan." + +msgid "Now" +msgstr "Sekarang" + +msgid "Midnight" +msgstr "Tengah malam" + +msgid "6 a.m." +msgstr "6 pagi" + +msgid "Noon" +msgstr "Siang" + +msgid "6 p.m." +msgstr "18.00" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Catatan: Waktu Anda lebih cepat %s jam dibandingkan waktu server." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Catatan: Waktu Anda lebih lambat %s jam dibandingkan waktu server." + +msgid "Choose a Time" +msgstr "Pilih Waktu" + +msgid "Choose a time" +msgstr "Pilih waktu" + +msgid "Cancel" +msgstr "Batal" + +msgid "Today" +msgstr "Hari ini" + +msgid "Choose a Date" +msgstr "Pilih Tanggal" + +msgid "Yesterday" +msgstr "Kemarin" + +msgid "Tomorrow" +msgstr "Besok" + +msgid "January" +msgstr "Januari" + +msgid "February" +msgstr "Februari" + +msgid "March" +msgstr "Maret" + +msgid "April" +msgstr "April" + +msgid "May" +msgstr "Mei" + +msgid "June" +msgstr "Juni" + +msgid "July" +msgstr "Juli" + +msgid "August" +msgstr "Agustus" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "Oktober" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "Desember" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "M" + +msgctxt "one letter Monday" +msgid "M" +msgstr "S" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "S" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "R" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "K" + +msgctxt "one letter Friday" +msgid "F" +msgstr "J" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Bentangkan" + +msgid "Hide" +msgstr "Ciutkan" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..ddf09c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,668 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viko Bartero , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-20 01:58+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: io\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s eliminesis sucesoze." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Onu ne povas eliminar %(name)s" + +msgid "Are you sure?" +msgstr "Ka vu esas certa?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar selektita %(verbose_name_plural)s" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Omni" + +msgid "Yes" +msgstr "Yes" + +msgid "No" +msgstr "No" + +msgid "Unknown" +msgstr "Nekonocato" + +msgid "Any date" +msgstr "Irga dato" + +msgid "Today" +msgstr "Hodie" + +msgid "Past 7 days" +msgstr "7 antea dii" + +msgid "This month" +msgstr "Ca monato" + +msgid "This year" +msgstr "Ca yaro" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Skribez la korekta %(username)s e pasvorto di kelka staff account. Remarkez " +"ke both feldi darfas rikonocar miniskulo e mayuskulo." + +msgid "Action:" +msgstr "Ago:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Agregar altra %(verbose_name)s" + +msgid "Remove" +msgstr "Eliminar" + +msgid "action time" +msgstr "horo dil ago" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "id dil objekto" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "repr dil objekto" + +msgid "action flag" +msgstr "flago dil ago" + +msgid "change message" +msgstr "chanjar mesajo" + +msgid "log entry" +msgstr "logo informo" + +msgid "log entries" +msgstr "logo informi" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" agregesis." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" chanjesis - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" eliminesis." + +msgid "LogEntry Object" +msgstr "LogEntry Objekto" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "e" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Nula feldo chanjesis." + +msgid "None" +msgstr "Nula" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Onu devas selektar la objekti por aplikar oli irga ago. Nula objekto " +"chanjesis." + +msgid "No action selected." +msgstr "Nula ago selektesis." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "La %(name)s \"%(obj)s\" eliminesis sucesoze." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Agregar %s" + +#, python-format +msgid "Change %s" +msgstr "Chanjar %s" + +msgid "Database error" +msgstr "Eroro del datumaro" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s chanjesis sucesoze." +msgstr[1] "%(count)s %(name)s chanjesis sucesoze." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s selektita" +msgstr[1] "La %(total_count)s selektita" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Selektita 0 di %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "Modifikuro historio: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Por eliminar %(class_name)s %(instance)s on mustas eliminar la sequanta " +"protektita objekti relatita: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django situo admin" + +msgid "Django administration" +msgstr "Django administreyo" + +msgid "Site administration" +msgstr "Administrayo dil ret-situo" + +msgid "Log in" +msgstr "Startar sesiono" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "La pagino ne renkontresis" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Pardonez, ma la demandita pagino ne renkontresis." + +msgid "Home" +msgstr "Hemo" + +msgid "Server error" +msgstr "Eroro del servilo" + +msgid "Server error (500)" +msgstr "Eroro del servilo (500)" + +msgid "Server Error (500)" +msgstr "Eroro del servilo (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Eroro eventis. Ico informesis per e-posto a la administranti dil ret-situo e " +"la eroro esos korektigata balde. Danko pro vua pacienteso." + +msgid "Run the selected action" +msgstr "Exekutar la selektita ago" + +msgid "Go" +msgstr "Irar" + +msgid "Click here to select the objects across all pages" +msgstr "Kliktez hike por selektar la objekti di omna pagini" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Selektar omna %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Desfacar selekto" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Unesme, skribez uzer-nomo ed pasvorto. Pos, vu povos modifikar altra uzer-" +"selekto." + +msgid "Enter a username and password." +msgstr "Skribez uzer-nomo ed pasvorto." + +msgid "Change password" +msgstr "Chanjar pasvorto" + +msgid "Please correct the error below." +msgstr "Korektigez la eroro infre." + +msgid "Please correct the errors below." +msgstr "Korektigez la erori infre." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Skribez nova pasvorto por la uzero %(username)s." + +msgid "Welcome," +msgstr "Bonvenez," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Dokumento" + +msgid "Log out" +msgstr "Klozar sesiono" + +#, python-format +msgid "Add %(name)s" +msgstr "Agregar %(name)s" + +msgid "History" +msgstr "Historio" + +msgid "View on site" +msgstr "Vidar en la ret-situo" + +msgid "Filter" +msgstr "Filtrar" + +msgid "Remove from sorting" +msgstr "Eskartar de klasifiko" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Precedo dil klasifiko: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Aktivar/desaktivar klasifiko" + +msgid "Delete" +msgstr "Eliminar" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eliminar la %(object_name)s '%(escaped_object)s' eliminos relatita objekti, " +"ma vua account ne havas permiso por eliminar la sequanta objekti:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Eliminar la %(object_name)s '%(escaped_object)s' eliminus la sequanta " +"protektita objekti relatita:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ka vu volas eliminar la %(object_name)s \"%(escaped_object)s\"? Omna " +"sequanta objekti relatita eliminesos:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Yes, me esas certa" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Eliminar multopla objekti" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Eliminar la selektita %(objects_name)s eliminos relatita objekti, ma vua " +"account ne havas permiso por eliminar la sequanta objekti:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Eliminar la selektita %(objects_name)s eliminos la sequanta protektita " +"objekti relatita:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ka vu volas eliminar la selektita %(objects_name)s? Omna sequanta objekti ed " +"olia relatita objekti eliminesos:" + +msgid "Change" +msgstr "Modifikar" + +msgid "Delete?" +msgstr "Ka eliminar?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Per %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeli en la %(name)s apliko" + +msgid "Add" +msgstr "Agregar" + +msgid "You don't have permission to edit anything." +msgstr "Vu ne havas permiso por facar modifiki." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Nulo disponebla" + +msgid "Unknown content" +msgstr "Nekonocata kontenajo" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Vua datumaro instaluro esas defektiva. Verifikez ke la datumaro tabeli " +"kreadesis e ke la uzero havas permiso por lektar la datumaro." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Ka vu obliviis vua pasvorto od uzer-nomo?" + +msgid "Date/time" +msgstr "Dato/horo" + +msgid "User" +msgstr "Uzero" + +msgid "Action" +msgstr "Ago" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ica objekto ne havas chanjo-historio. Olu forsan ne agregesis per ica " +"administrala ret-situo." + +msgid "Show all" +msgstr "Montrar omni" + +msgid "Save" +msgstr "Salvar" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Serchar" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resulto" +msgstr[1] "%(counter)s resulti" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s totala" + +msgid "Save as new" +msgstr "Salvar kom nova" + +msgid "Save and add another" +msgstr "Salvar ed agregar altra" + +msgid "Save and continue editing" +msgstr "Salvar e durar la modifiko" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Danko pro vua spensita tempo en la ret-situo hodie." + +msgid "Log in again" +msgstr "Ristartar sesiono" + +msgid "Password change" +msgstr "Pasvorto chanjo" + +msgid "Your password was changed." +msgstr "Vua pasvorto chanjesis." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Por kauciono, skribez vua anta pasvorto e pos skribez vua nova pasvorto " +"dufoye por verifikar ke olu skribesis korekte." + +msgid "Change my password" +msgstr "Modifikar mea pasvorto" + +msgid "Password reset" +msgstr "Pasvorto chanjo" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Vua pasvorto chanjesis. Vu darfas startar sesiono nun." + +msgid "Password reset confirmation" +msgstr "Pasvorto chanjo konfirmo" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Skribez vua nova pasvorto dufoye por verifikar ke olu skribesis korekte." + +msgid "New password:" +msgstr "Nova pasvorto:" + +msgid "Confirm password:" +msgstr "Konfirmez pasvorto:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"La link por chanjar pasvorto ne esis valida, forsan pro ke olu ja uzesis. " +"Demandez nova pasvorto chanjo." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Se vu ne recevas mesajo, verifikez ke vu skribis la sama e-posto adreso " +"uzita por vua registro e lektez vua spam mesaji." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Vu esas recevanta ica mesajo pro ke vu demandis pasvorto chanjo por vua " +"uzero account che %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Irez al sequanta pagino e selektez nova pasvorto:" + +msgid "Your username, in case you've forgotten:" +msgstr "Vua uzernomo, se vu obliviis olu:" + +msgid "Thanks for using our site!" +msgstr "Danko pro uzar nia ret-situo!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "La equipo di %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Ka vu obliviis vua pasvorto? Skribez vua e-posto adreso infre e ni sendos " +"instrucioni por kreadar nova pasvorto." + +msgid "Email address:" +msgstr "E-postala adreso:" + +msgid "Reset my password" +msgstr "Chanjar mea pasvorto" + +msgid "All dates" +msgstr "Omna dati" + +#, python-format +msgid "Select %s" +msgstr "Selektar %s" + +#, python-format +msgid "Select %s to change" +msgstr "Selektar %s por chanjar" + +msgid "Date:" +msgstr "Dato:" + +msgid "Time:" +msgstr "Horo:" + +msgid "Lookup" +msgstr "Serchado" + +msgid "Currently:" +msgstr "Aktuale" + +msgid "Change:" +msgstr "Chanjo:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1e029ac Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..c6bbad9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,711 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Dagur Ammendrup , 2019 +# Hafsteinn Einarsson , 2011-2012 +# Jannis Leidel , 2011 +# Kári Tristan Helgason , 2013 +# Thordur Sigurdsson , 2016-2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-06-05 12:48+0000\n" +"Last-Translator: Dagur Ammendrup \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Eyddi %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Get ekki eytt %(name)s" + +msgid "Are you sure?" +msgstr "Ertu viss?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eyða völdum %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Vefstjórn" + +msgid "All" +msgstr "Allt" + +msgid "Yes" +msgstr "Já" + +msgid "No" +msgstr "Nei" + +msgid "Unknown" +msgstr "Óþekkt" + +msgid "Any date" +msgstr "Allar dagsetningar" + +msgid "Today" +msgstr "Dagurinn í dag" + +msgid "Past 7 days" +msgstr "Síðustu 7 dagar" + +msgid "This month" +msgstr "Þessi mánuður" + +msgid "This year" +msgstr "Þetta ár" + +msgid "No date" +msgstr "Engin dagsetning" + +msgid "Has date" +msgstr "Hefur dagsetningu" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Vinsamlegast sláðu inn rétt %(username)s og lykilorð fyrir starfsmanna " +"aðgang. Takið eftir að í báðum reitum skipta há- og lágstafir máli." + +msgid "Action:" +msgstr "Aðgerð:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Bæta við öðrum %(verbose_name)s" + +msgid "Remove" +msgstr "Fjarlægja" + +msgid "Addition" +msgstr "Viðbót" + +msgid "Change" +msgstr "Breyta" + +msgid "Deletion" +msgstr "Eyðing" + +msgid "action time" +msgstr "tími aðgerðar" + +msgid "user" +msgstr "notandi" + +msgid "content type" +msgstr "efnistag" + +msgid "object id" +msgstr "kenni hlutar" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "framsetning hlutar" + +msgid "action flag" +msgstr "aðgerðarveifa" + +msgid "change message" +msgstr "breyta skilaboði" + +msgid "log entry" +msgstr "kladdafærsla" + +msgid "log entries" +msgstr "kladdafærslur" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "„%(object)s“ bætt við." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Breytti „%(object)s“ - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Eyddi „%(object)s.“" + +msgid "LogEntry Object" +msgstr "LogEntry hlutur" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Bætti við {name} „{object}“." + +msgid "Added." +msgstr "Bætti við." + +msgid "and" +msgstr "og" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Breytti {fields} fyrir {name} „{object}“." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Breytti {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Eyddi {name} „{object}“." + +msgid "No fields changed." +msgstr "Engum reitum breytt." + +msgid "None" +msgstr "Ekkert" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Haltu inni „Control“, eða „Command“ á Mac til þess að velja fleira en eitt." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} „{obj}“ var bætt við." + +msgid "You may edit it again below." +msgstr "Þú mátt breyta þessu aftur hér að neðan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} „{obj}“ hefur verið breytt. Þú getur bætt við öðru {name} að neðan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} „{obj}“ hefur verið breytt. Þú getur breytt því aftur að neðan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} „{obj}“ hefur verið bætt við. Þú getur breytt því aftur að neðan." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" hefur verið breytt. Þú getur bætt við öðru {name} að neðan." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} „{obj}“ hefur verið breytt." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Hlutir verða að vera valdir til að framkvæma aðgerðir á þeim. Engu hefur " +"verið breytt." + +msgid "No action selected." +msgstr "Engin aðgerð valin." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s „%(obj)s“ var eytt." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s með ID \"%(key)s\" er ekki til. Var því mögulega eytt?" + +#, python-format +msgid "Add %s" +msgstr "Bæta við %s" + +#, python-format +msgid "Change %s" +msgstr "Breyta %s" + +#, python-format +msgid "View %s" +msgstr "Skoða %s" + +msgid "Database error" +msgstr "Gagnagrunnsvilla" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s var breytt." +msgstr[1] "%(count)s %(name)s var breytt." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Allir %(total_count)s valdir" +msgstr[1] "Allir %(total_count)s valdir" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 af %(cnt)s valin" + +#, python-format +msgid "Change history: %s" +msgstr "Breytingarsaga: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Að eyða %(class_name)s %(instance)s þyrfti að eyða eftirfarandi tengdum " +"hlutum: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django vefstjóri" + +msgid "Django administration" +msgstr "Django vefstjórn" + +msgid "Site administration" +msgstr "Vefstjóri" + +msgid "Log in" +msgstr "Skrá inn" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s vefstjórn" + +msgid "Page not found" +msgstr "Síða fannst ekki" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Því miður fannst umbeðin síða ekki." + +msgid "Home" +msgstr "Heim" + +msgid "Server error" +msgstr "Kerfisvilla" + +msgid "Server error (500)" +msgstr "Kerfisvilla (500)" + +msgid "Server Error (500)" +msgstr "Kerfisvilla (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Villa kom upp. Hún hefur verið tilkynnt til vefstjóra með tölvupósti og ætti " +"að lagast fljótlega. Þökkum þolinmæðina." + +msgid "Run the selected action" +msgstr "Keyra valda aðgerð" + +msgid "Go" +msgstr "Áfram" + +msgid "Click here to select the objects across all pages" +msgstr "Smelltu hér til að velja alla hluti" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Velja alla %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Hreinsa val" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Fyrst, settu inn notendanafn og lykilorð. Svo geturðu breytt öðrum " +"notendamöguleikum." + +msgid "Enter a username and password." +msgstr "Sláðu inn notandanafn og lykilorð." + +msgid "Change password" +msgstr "Breyta lykilorði" + +msgid "Please correct the error below." +msgstr "Vinsamlegast lagfærðu villuna fyrir neðan." + +msgid "Please correct the errors below." +msgstr "Vinsamlegast leiðréttu villurnar hér að neðan." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Settu inn nýtt lykilorð fyrir notandann %(username)s." + +msgid "Welcome," +msgstr "Velkomin(n)," + +msgid "View site" +msgstr "Skoða vef" + +msgid "Documentation" +msgstr "Skjölun" + +msgid "Log out" +msgstr "Skrá út" + +#, python-format +msgid "Add %(name)s" +msgstr "Bæta við %(name)s" + +msgid "History" +msgstr "Saga" + +msgid "View on site" +msgstr "Skoða á vef" + +msgid "Filter" +msgstr "Sía" + +msgid "Remove from sorting" +msgstr "Taka úr röðun" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Forgangur röðunar: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Röðun af/á" + +msgid "Delete" +msgstr "Eyða" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Eyðing á %(object_name)s „%(escaped_object)s“ hefði í för með sér eyðingu á " +"tengdum hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Að eyða %(object_name)s „%(escaped_object)s“ þyrfti að eyða eftirfarandi " +"tengdum hlutum:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ertu viss um að þú viljir eyða %(object_name)s „%(escaped_object)s“? Öllu " +"eftirfarandi verður eytt:" + +msgid "Objects" +msgstr "Hlutir" + +msgid "Yes, I'm sure" +msgstr "Já ég er viss." + +msgid "No, take me back" +msgstr "Nei, fara til baka" + +msgid "Delete multiple objects" +msgstr "Eyða mörgum hlutum." + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Að eyða völdu %(objects_name)s leiðir til þess að skyldum hlutum er eytt, en " +"þinn aðgangur hefur ekki réttindi til að eyða eftirtöldum hlutum:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Að eyða völdum %(objects_name)s myndi leiða til þess að eftirtöldum skyldum " +"hlutum yrði eytt:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ertu viss um að þú viljir eyða völdum %(objects_name)s? Öllum eftirtöldum " +"hlutum og skyldum hlutum verður eytt:" + +msgid "View" +msgstr "Skoða" + +msgid "Delete?" +msgstr "Eyða?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Eftir %(filter_title)s " + +msgid "Summary" +msgstr "Samantekt" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Módel í appinu %(name)s" + +msgid "Add" +msgstr "Bæta við" + +msgid "You don't have permission to view or edit anything." +msgstr "Þú hefur ekki réttindi til að skoða eða breyta neinu." + +msgid "Recent actions" +msgstr "Nýlegar aðgerðir" + +msgid "My actions" +msgstr "Mínar aðgerðir" + +msgid "None available" +msgstr "Engin fáanleg" + +msgid "Unknown content" +msgstr "Óþekkt innihald" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Eitthvað er að gagnagrunnsuppsetningu. Gakktu úr skugga um að allar töflur " +"séu til staðar og að notandinn hafi aðgang að grunninum." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Þú ert skráður inn sem %(username)s, en ert ekki með réttindi að þessari " +"síðu. Viltu skrá þig inn sem annar notandi?" + +msgid "Forgotten your password or username?" +msgstr "Gleymt notandanafn eða lykilorð?" + +msgid "Date/time" +msgstr "Dagsetning/tími" + +msgid "User" +msgstr "Notandi" + +msgid "Action" +msgstr "Aðgerð" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á " +"þessu stjórnunarsvæði." + +msgid "Show all" +msgstr "Sýna allt" + +msgid "Save" +msgstr "Vista" + +msgid "Popup closing…" +msgstr "Sprettigluggi lokast..." + +msgid "Search" +msgstr "Leita" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s niðurstaða" +msgstr[1] "%(counter)s niðurstöður" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s í heildina" + +msgid "Save as new" +msgstr "Vista sem nýtt" + +msgid "Save and add another" +msgstr "Vista og búa til nýtt" + +msgid "Save and continue editing" +msgstr "Vista og halda áfram að breyta" + +msgid "Save and view" +msgstr "Vista og skoða" + +msgid "Close" +msgstr "Loka" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Breyta völdu %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Bæta við %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Eyða völdu %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Takk fyrir að verja tíma í vefsíðuna í dag." + +msgid "Log in again" +msgstr "Skráðu þig inn aftur" + +msgid "Password change" +msgstr "Breyta lykilorði" + +msgid "Your password was changed." +msgstr "Lykilorði þínu var breytt" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja " +"lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki " +"gert innsláttarvillu." + +msgid "Change my password" +msgstr "Breyta lykilorðinu mínu" + +msgid "Password reset" +msgstr "Endurstilla lykilorð" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Lykilorðið var endurstillt. Þú getur núna skráð þig inn á vefsvæðið." + +msgid "Password reset confirmation" +msgstr "Staðfesting endurstillingar lykilorðs" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Vinsamlegast settu inn nýja lykilorðið tvisvar til að forðast " +"innsláttarvillur." + +msgid "New password:" +msgstr "Nýtt lykilorð:" + +msgid "Confirm password:" +msgstr "Staðfestu lykilorð:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Endurstilling lykilorðs tókst ekki. Slóðin var ógild. Hugsanlega hefur hún " +"nú þegar verið notuð. Vinsamlegast biddu um nýja endurstillingu." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Við höfum sent þér tölvupóst með leiðbeiningum til að endurstilla lykilorðið " +"þitt, sé aðgangur til með netfanginu sem þú slóst inn. Þú ættir að fá " +"leiðbeiningarnar fljótlega. " + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Ef þú færð ekki tölvupóstinn, gakktu úr skugga um að netfangið sem þú slóst " +"inn sé það sama og þú notaðir til að stofna aðganginn og að það hafi ekki " +"lent í spamsíu." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Þú ert að fá þennan tölvupóst því þú baðst um endurstillingu á lykilorði " +"fyrir aðganginn þinn á %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Vinsamlegast farðu á eftirfarandi síðu og veldu nýtt lykilorð:" + +msgid "Your username, in case you've forgotten:" +msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:" + +msgid "Thanks for using our site!" +msgstr "Takk fyrir að nota vefinn okkar!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s hópurinn" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Hefurðu gleymt lykilorðinu þínu? Sláðu inn netfangið þitt hér að neðan og " +"við sendum þér tölvupóst með leiðbeiningum til að setja nýtt lykilorð. " + +msgid "Email address:" +msgstr "Netfang:" + +msgid "Reset my password" +msgstr "Endursstilla lykilorðið mitt" + +msgid "All dates" +msgstr "Allar dagsetningar" + +#, python-format +msgid "Select %s" +msgstr "Veldu %s" + +#, python-format +msgid "Select %s to change" +msgstr "Veldu %s til að breyta" + +#, python-format +msgid "Select %s to view" +msgstr "Veldu %s til að skoða" + +msgid "Date:" +msgstr "Dagsetning:" + +msgid "Time:" +msgstr "Tími:" + +msgid "Lookup" +msgstr "Fletta upp" + +msgid "Currently:" +msgstr "Eins og er:" + +msgid "Change:" +msgstr "Breyta:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3f47b7b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..847c39c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po @@ -0,0 +1,219 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# gudbergur , 2012 +# Hafsteinn Einarsson , 2011-2012 +# Jannis Leidel , 2011 +# Matt R, 2018 +# Thordur Sigurdsson , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2018-05-18 14:09+0000\n" +"Last-Translator: Matt R\n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Fáanleg %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Þetta er listi af því %s sem er í boði. Þú getur ákveðið hluti með því að " +"velja þá í boxinu að neðan og ýta svo á \"Velja\" örina milli boxana tveggja." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Skrifaðu í boxið til að sía listann af því %s sem er í boði." + +msgid "Filter" +msgstr "Sía" + +msgid "Choose all" +msgstr "Velja öll" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Smelltu til að velja allt %s í einu." + +msgid "Choose" +msgstr "Veldu" + +msgid "Remove" +msgstr "Fjarlægja" + +#, javascript-format +msgid "Chosen %s" +msgstr "Valin %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Þetta er listinn af völdu %s. Þú getur fjarlægt hluti með því að velja þá í " +"boxinu að neðan og ýta svo á \"Eyða\" örina á milli boxana tveggja." + +msgid "Remove all" +msgstr "Eyða öllum" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Smelltu til að fjarlægja allt valið %s í einu." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] " %(sel)s í %(cnt)s valin" +msgstr[1] " %(sel)s í %(cnt)s valin" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Enn eru óvistaðar breytingar í reitum. Ef þú keyrir aðgerð munu breytingar " +"ekki verða vistaðar." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Þú hefur valið aðgerð en hefur ekki vistað breytingar á reitum. Vinsamlegast " +"veldu 'Í lagi' til að vista. Þú þarft að endurkeyra aðgerðina." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Þú hefur valið aðgerð en hefur ekki gert breytingar á reitum. Þú ert líklega " +"að leita að 'Fara' hnappnum frekar en 'Vista' hnappnum." + +msgid "Now" +msgstr "Núna" + +msgid "Midnight" +msgstr "Miðnætti" + +msgid "6 a.m." +msgstr "6 f.h." + +msgid "Noon" +msgstr "Hádegi" + +msgid "6 p.m." +msgstr "6 e.h." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Athugaðu að þú ert %s klukkustund á undan tíma vefþjóns." +msgstr[1] "Athugaðu að þú ert %s klukkustundum á undan tíma vefþjóns." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Athugaðu að þú ert %s klukkustund á eftir tíma vefþjóns." +msgstr[1] "Athugaðu að þú ert %s klukkustundum á eftir tíma vefþjóns." + +msgid "Choose a Time" +msgstr "Veldu tíma" + +msgid "Choose a time" +msgstr "Veldu tíma" + +msgid "Cancel" +msgstr "Hætta við" + +msgid "Today" +msgstr "Í dag" + +msgid "Choose a Date" +msgstr "Veldu dagsetningu" + +msgid "Yesterday" +msgstr "Í gær" + +msgid "Tomorrow" +msgstr "Á morgun" + +msgid "January" +msgstr "janúar" + +msgid "February" +msgstr "febrúar" + +msgid "March" +msgstr "mars" + +msgid "April" +msgstr "apríl" + +msgid "May" +msgstr "maí" + +msgid "June" +msgstr "júní" + +msgid "July" +msgstr "júlí" + +msgid "August" +msgstr "ágúst" + +msgid "September" +msgstr "september" + +msgid "October" +msgstr "október" + +msgid "November" +msgstr "nóvember" + +msgid "December" +msgstr "desember" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "S" + +msgctxt "one letter Monday" +msgid "M" +msgstr "M" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Þ" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "M" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "F" + +msgctxt "one letter Friday" +msgid "F" +msgstr "F" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "L" + +msgid "Show" +msgstr "Sýna" + +msgid "Hide" +msgstr "Fela" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..72b2ffa Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..baa69c6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po @@ -0,0 +1,223 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Denis Darii , 2011 +# Jannis Leidel , 2011 +# Luciano De Falco Alfano, 2016 +# Marco Bonetti, 2014 +# Nicola Larosa , 2011-2012 +# palmux , 2015 +# Stefano Brentegani , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s disponibili" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Questa è la lista dei %s disponibili. Puoi sceglierne alcuni selezionandoli " +"nella casella qui sotto e poi facendo clic sulla freccia \"Scegli\" tra le " +"due caselle." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Scrivi in questa casella per filtrare l'elenco dei %s disponibili." + +msgid "Filter" +msgstr "Filtro" + +msgid "Choose all" +msgstr "Scegli tutto" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Fai clic per scegliere tutti i %s in una volta." + +msgid "Choose" +msgstr "Scegli" + +msgid "Remove" +msgstr "Elimina" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s scelti" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Questa è la lista dei %s scelti. Puoi eliminarne alcuni selezionandoli nella " +"casella qui sotto e poi facendo clic sulla freccia \"Elimina\" tra le due " +"caselle." + +msgid "Remove all" +msgstr "Elimina tutti" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Fai clic per eliminare tutti i %s in una volta." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s di %(cnt)s selezionato" +msgstr[1] "%(sel)s di %(cnt)s selezionati" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Ci sono aggiornamenti non salvati su singoli campi modificabili. Se esegui " +"un'azione, le modifiche non salvate andranno perse." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Hai selezionato un'azione, ma non hai ancora salvato le modifiche apportate " +"a campi singoli. Fai clic su OK per salvare. Poi dovrai ri-eseguire l'azione." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Hai selezionato un'azione, e non hai ancora apportato alcuna modifica a " +"campi singoli. Probabilmente stai cercando il pulsante Go, invece di Save." + +msgid "Now" +msgstr "Adesso" + +msgid "Midnight" +msgstr "Mezzanotte" + +msgid "6 a.m." +msgstr "6 del mattino" + +msgid "Noon" +msgstr "Mezzogiorno" + +msgid "6 p.m." +msgstr "6 del pomeriggio" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Nota: Sei %s ora in anticipo rispetto al server." +msgstr[1] "Nota: Sei %s ore in anticipo rispetto al server." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Nota: Sei %s ora in ritardo rispetto al server." +msgstr[1] "Nota: Sei %s ore in ritardo rispetto al server." + +msgid "Choose a Time" +msgstr "Scegli un orario" + +msgid "Choose a time" +msgstr "Scegli un orario" + +msgid "Cancel" +msgstr "Annulla" + +msgid "Today" +msgstr "Oggi" + +msgid "Choose a Date" +msgstr "Scegli una data" + +msgid "Yesterday" +msgstr "Ieri" + +msgid "Tomorrow" +msgstr "Domani" + +msgid "January" +msgstr "Gennaio" + +msgid "February" +msgstr "Febbraio" + +msgid "March" +msgstr "Marzo" + +msgid "April" +msgstr "Aprile" + +msgid "May" +msgstr "Maggio" + +msgid "June" +msgstr "Giugno" + +msgid "July" +msgstr "Luglio" + +msgid "August" +msgstr "Agosto" + +msgid "September" +msgstr "Settembre" + +msgid "October" +msgstr "Ottobre" + +msgid "November" +msgstr "Novembre" + +msgid "December" +msgstr "Dicembre" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "D" + +msgctxt "one letter Monday" +msgid "M" +msgstr "L" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Ma" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Me" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "G" + +msgctxt "one letter Friday" +msgid "F" +msgstr "V" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Mostra" + +msgid "Hide" +msgstr "Nascondi" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..afa002d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,704 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2016 +# Jannis Leidel , 2011 +# Shinichi Katsumata , 2019 +# Shinya Okano , 2012-2018 +# Tetsuya Morimoto , 2011 +# 上田慶祐 , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-19 07:00+0000\n" +"Last-Translator: Shinichi Katsumata \n" +"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d 個の %(items)s を削除しました。" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s が削除できません" + +msgid "Are you sure?" +msgstr "よろしいですか?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "選択された %(verbose_name_plural)s の削除" + +msgid "Administration" +msgstr "管理" + +msgid "All" +msgstr "全て" + +msgid "Yes" +msgstr "はい" + +msgid "No" +msgstr "いいえ" + +msgid "Unknown" +msgstr "不明" + +msgid "Any date" +msgstr "いつでも" + +msgid "Today" +msgstr "今日" + +msgid "Past 7 days" +msgstr "過去 7 日間" + +msgid "This month" +msgstr "今月" + +msgid "This year" +msgstr "今年" + +msgid "No date" +msgstr "日付なし" + +msgid "Has date" +msgstr "日付あり" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"スタッフアカウントの正しい%(username)sとパスワードを入力してください。どちら" +"のフィールドも大文字と小文字は区別されます。" + +msgid "Action:" +msgstr "操作:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "%(verbose_name)s の追加" + +msgid "Remove" +msgstr "削除" + +msgid "Addition" +msgstr "追加" + +msgid "Change" +msgstr "変更" + +msgid "Deletion" +msgstr "削除" + +msgid "action time" +msgstr "操作時刻" + +msgid "user" +msgstr "ユーザー" + +msgid "content type" +msgstr "コンテンツタイプ" + +msgid "object id" +msgstr "オブジェクト ID" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "オブジェクトの文字列表現" + +msgid "action flag" +msgstr "操作種別" + +msgid "change message" +msgstr "変更メッセージ" + +msgid "log entry" +msgstr "ログエントリー" + +msgid "log entries" +msgstr "ログエントリー" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" を追加しました。" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" を変更しました - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\"を削除しました。" + +msgid "LogEntry Object" +msgstr "ログエントリー オブジェクト" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" を追加しました。" + +msgid "Added." +msgstr "追加されました。" + +msgid "and" +msgstr "と" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{name} \"{object}\" の {fields} を変更しました。" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} を変更しました。" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "{name} \"{object}\" を削除しました。" + +msgid "No fields changed." +msgstr "変更はありませんでした。" + +msgid "None" +msgstr "None" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"複数選択するときには Control キーを押したまま選択してください。Mac では " +"Command キーを使ってください" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" を追加しました。" + +msgid "You may edit it again below." +msgstr "以下で再度編集できます。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" を追加しました。 別の {name} を以下から追加できます。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" を変更しました。 以下から再度編集できます。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" を追加しました。続けて編集できます。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" を変更しました。 別の {name} を以下から追加できます。" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" を変更しました。" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"操作を実行するには、対象を選択する必要があります。何も変更されませんでした。" + +msgid "No action selected." +msgstr "操作が選択されていません。" + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" を削除しました。" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" +"ID \"%(key)s\" の%(name)sは見つかりませんでした。削除された可能性があります。" + +#, python-format +msgid "Add %s" +msgstr "%s を追加" + +#, python-format +msgid "Change %s" +msgstr "%s を変更" + +#, python-format +msgid "View %s" +msgstr "%sを表示" + +msgid "Database error" +msgstr "データベースエラー" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s 個の %(name)s を変更しました。" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s 個選択されました" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s個の内ひとつも選択されていません" + +#, python-format +msgid "Change history: %s" +msgstr "変更履歴: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s %(instance)s を削除するには以下の保護された関連オブジェクトを" +"削除することになります: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django サイト管理" + +msgid "Django administration" +msgstr "Django 管理サイト" + +msgid "Site administration" +msgstr "サイト管理" + +msgid "Log in" +msgstr "ログイン" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s 管理" + +msgid "Page not found" +msgstr "ページが見つかりません" + +msgid "We're sorry, but the requested page could not be found." +msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。" + +msgid "Home" +msgstr "ホーム" + +msgid "Server error" +msgstr "サーバーエラー" + +msgid "Server error (500)" +msgstr "サーバーエラー (500)" + +msgid "Server Error (500)" +msgstr "サーバーエラー (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"エラーが発生しました。サイト管理者にメールで報告されたので、修正されるまでし" +"ばらくお待ちください。" + +msgid "Run the selected action" +msgstr "選択された操作を実行" + +msgid "Go" +msgstr "実行" + +msgid "Click here to select the objects across all pages" +msgstr "全ページの項目を選択するにはここをクリック" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "%(total_count)s個ある%(module_name)s を全て選択" + +msgid "Clear selection" +msgstr "選択を解除" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"まずユーザー名とパスワードを登録してください。その後詳細情報が編集可能になり" +"ます。" + +msgid "Enter a username and password." +msgstr "ユーザー名とパスワードを入力してください。" + +msgid "Change password" +msgstr "パスワードの変更" + +msgid "Please correct the error below." +msgstr "下記のエラーを修正してください。" + +msgid "Please correct the errors below." +msgstr "下記のエラーを修正してください。" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"%(username)sさんの新しいパスワードを入力してください。" + +msgid "Welcome," +msgstr "ようこそ" + +msgid "View site" +msgstr "サイトを表示" + +msgid "Documentation" +msgstr "ドキュメント" + +msgid "Log out" +msgstr "ログアウト" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s を追加" + +msgid "History" +msgstr "履歴" + +msgid "View on site" +msgstr "サイト上で表示" + +msgid "Filter" +msgstr "フィルター" + +msgid "Remove from sorting" +msgstr "ソート条件から外します" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "ソート優先順位: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "昇順降順を切り替えます" + +msgid "Delete" +msgstr "削除" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' の削除時に関連づけられたオブジェクトも削" +"除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除" +"するパーミッションがありません:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' を削除するには以下の保護された関連オブ" +"ジェクトを削除することになります:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"%(object_name)s \"%(escaped_object)s\"を削除しますか? 関連づけられている以下" +"のオブジェクトも全て削除されます:" + +msgid "Objects" +msgstr "オブジェクト" + +msgid "Yes, I'm sure" +msgstr "はい" + +msgid "No, take me back" +msgstr "戻る" + +msgid "Delete multiple objects" +msgstr "複数のオブジェクトを削除します" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"選択した %(objects_name)s を削除すると関連するオブジェクトも削除しますが、あ" +"なたのアカウントは以下のオブジェクト型を削除する権限がありません:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"選択した %(objects_name)s を削除すると以下の保護された関連オブジェクトを削除" +"することになります:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"本当に選択した %(objects_name)s を削除しますか? 以下の全てのオブジェクトと関" +"連する要素が削除されます:" + +msgid "View" +msgstr "表示" + +msgid "Delete?" +msgstr "削除しますか?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s で絞り込む" + +msgid "Summary" +msgstr "概要" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s アプリケーション内のモデル" + +msgid "Add" +msgstr "追加" + +msgid "You don't have permission to view or edit anything." +msgstr "表示または変更のためのパーミッションがありません。" + +msgid "Recent actions" +msgstr "最近行った操作" + +msgid "My actions" +msgstr "自分の操作" + +msgid "None available" +msgstr "利用不可" + +msgid "Unknown content" +msgstr "不明なコンテント" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"データベースの設定に問題があるようです。適切なテーブルが作られていること、適" +"切なユーザーでデータベースのデータを読み込めることを確認してください。" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"あなたは %(username)s として認証されましたが、このページへのアクセス許可があ" +"りません。他のアカウントでログインしますか?" + +msgid "Forgotten your password or username?" +msgstr "パスワードまたはユーザー名を忘れましたか?" + +msgid "Date/time" +msgstr "日付/時刻" + +msgid "User" +msgstr "ユーザー" + +msgid "Action" +msgstr "操作" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも" +"のではありません。" + +msgid "Show all" +msgstr "全件表示" + +msgid "Save" +msgstr "保存" + +msgid "Popup closing…" +msgstr "ポップアップを閉じています..." + +msgid "Search" +msgstr "検索" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "結果 %(counter)s" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "全 %(full_result_count)s 件" + +msgid "Save as new" +msgstr "新規保存" + +msgid "Save and add another" +msgstr "保存してもう一つ追加" + +msgid "Save and continue editing" +msgstr "保存して編集を続ける" + +msgid "Save and view" +msgstr "保存して表示" + +msgid "Close" +msgstr "閉じる" + +#, python-format +msgid "Change selected %(model)s" +msgstr "選択された %(model)s の変更" + +#, python-format +msgid "Add another %(model)s" +msgstr "%(model)s の追加" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "選択された %(model)s を削除" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "ご利用ありがとうございました。" + +msgid "Log in again" +msgstr "もう一度ログイン" + +msgid "Password change" +msgstr "パスワードの変更" + +msgid "Your password was changed." +msgstr "あなたのパスワードは変更されました" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正" +"しく入力したか確認できるように二度入力してください。" + +msgid "Change my password" +msgstr "パスワードの変更" + +msgid "Password reset" +msgstr "パスワードをリセット" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "パスワードがセットされました。ログインしてください。" + +msgid "Password reset confirmation" +msgstr "パスワードリセットの確認" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "確認のために、新しいパスワードを二回入力してください。" + +msgid "New password:" +msgstr "新しいパスワード:" + +msgid "Confirm password:" +msgstr "新しいパスワード (確認用) :" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"パスワードリセットのリンクが不正です。おそらくこのリンクは既に使われていま" +"す。もう一度パスワードリセットしてください。" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"入力されたメールアドレスを持つアカウントが存在する場合、パスワードを設定する" +"ためのメールを送信しました。すぐに受け取る必要があります。" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"メールが届かない場合は、登録したメールアドレスを入力したか確認し、スパムフォ" +"ルダに入っていないか確認してください。" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"このメールは %(site_name)s で、あなたのアカウントのパスワードリセットが要求さ" +"れたため、送信されました。" + +msgid "Please go to the following page and choose a new password:" +msgstr "次のページで新しいパスワードを選んでください:" + +msgid "Your username, in case you've forgotten:" +msgstr "あなたのユーザー名 (念のため):" + +msgid "Thanks for using our site!" +msgstr "ご利用ありがとうございました!" + +#, python-format +msgid "The %(site_name)s team" +msgstr " %(site_name)s チーム" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"パスワードを忘れましたか? メールアドレスを以下に入力すると、新しいパスワード" +"の設定方法をお知らせします。" + +msgid "Email address:" +msgstr "メールアドレス:" + +msgid "Reset my password" +msgstr "パスワードをリセット" + +msgid "All dates" +msgstr "いつでも" + +#, python-format +msgid "Select %s" +msgstr "%s を選択" + +#, python-format +msgid "Select %s to change" +msgstr "変更する %s を選択" + +#, python-format +msgid "Select %s to view" +msgstr "表示する%sを選択" + +msgid "Date:" +msgstr "日付:" + +msgid "Time:" +msgstr "時刻:" + +msgid "Lookup" +msgstr "検索" + +msgid "Currently:" +msgstr "現在の値:" + +msgid "Change:" +msgstr "変更後:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ed45180 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..75aee9c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,699 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013-2015 +# David A. , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:36+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s წარმატებით წაიშალა." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s ვერ იშლება" + +msgid "Are you sure?" +msgstr "დარწმუნებული ხართ?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "არჩეული %(verbose_name_plural)s-ის წაშლა" + +msgid "Administration" +msgstr "ადმინისტრირება" + +msgid "All" +msgstr "ყველა" + +msgid "Yes" +msgstr "კი" + +msgid "No" +msgstr "არა" + +msgid "Unknown" +msgstr "გაურკვეველი" + +msgid "Any date" +msgstr "ნებისმიერი თარიღი" + +msgid "Today" +msgstr "დღეს" + +msgid "Past 7 days" +msgstr "ბოლო 7 დღე" + +msgid "This month" +msgstr "მიმდინარე თვე" + +msgid "This year" +msgstr "მიმდინარე წელი" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"გთხოვთ, შეიყვანოთ სწორი %(username)s და პაროლი პერსონალის ანგარიშისთვის. " +"იქონიეთ მხედველობაში, რომ ორივე ველი ითვალისწინებს მთავრულს." + +msgid "Action:" +msgstr "მოქმედება:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "კიდევ ერთი %(verbose_name)s-ის დამატება" + +msgid "Remove" +msgstr "წაშლა" + +msgid "Addition" +msgstr "" + +msgid "Change" +msgstr "შეცვლა" + +msgid "Deletion" +msgstr "" + +msgid "action time" +msgstr "მოქმედების დრო" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "ობიექტის id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "ობიექტის წარმ." + +msgid "action flag" +msgstr "მოქმედების დროშა" + +msgid "change message" +msgstr "შეცვლის შეტყობინება" + +msgid "log entry" +msgstr "ლოგის ერთეული" + +msgid "log entries" +msgstr "ლოგის ერთეულები" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "დამატებულია \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "შეცვლილია \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "წაშლილია \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "ჟურნალის ჩანაწერის ობიექტი" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "და" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "არცერთი ველი არ შეცვლილა." + +msgid "None" +msgstr "არცერთი" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"ობიექტებზე მოქმედებების შესასრულებლად ისინი არჩეული უნდა იყოს. არცერთი " +"ობიექტი არჩეული არ არის." + +msgid "No action selected." +msgstr "მოქმედება არჩეული არ არის." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" წარმატებით წაიშალა." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "დავამატოთ %s" + +#, python-format +msgid "Change %s" +msgstr "შევცვალოთ %s" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "მონაცემთა ბაზის შეცდომა" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s წარმატებით შეიცვალა." +msgstr[1] "%(count)s %(name)s წარმატებით შეიცვალა." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s-ია არჩეული" +msgstr[1] "%(total_count)s-ია არჩეული" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s-დან არცერთი არჩეული არ არის" + +#, python-format +msgid "Change history: %s" +msgstr "ცვლილებების ისტორია: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django-ს ადმინისტრირების საიტი" + +msgid "Django administration" +msgstr "Django-ს ადმინისტრირება" + +msgid "Site administration" +msgstr "საიტის ადმინისტრირება" + +msgid "Log in" +msgstr "შესვლა" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s ადმინისტრირება" + +msgid "Page not found" +msgstr "გვერდი ვერ მოიძებნა" + +msgid "We're sorry, but the requested page could not be found." +msgstr "უკაცრავად, მოთხოვნილი გვერდი ვერ მოიძებნა." + +msgid "Home" +msgstr "საწყისი გვერდი" + +msgid "Server error" +msgstr "სერვერის შეცდომა" + +msgid "Server error (500)" +msgstr "სერვერის შეცდომა (500)" + +msgid "Server Error (500)" +msgstr "სერვერის შეცდომა (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"მოხდა შეცდომა. ინფორმაცია მასზე გადაეცა საიტის ადმინისტრატორებს ელ. ფოსტით " +"და ის უნდა შესწორდეს უმოკლეს ვადებში. გმადლობთ მოთმინებისთვის." + +msgid "Run the selected action" +msgstr "არჩეული მოქმედების შესრულება" + +msgid "Go" +msgstr "გადასვლა" + +msgid "Click here to select the objects across all pages" +msgstr "ყველა გვერდზე არსებული ობიექტის მოსანიშნად დააწკაპეთ აქ" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "ყველა %(total_count)s %(module_name)s-ის მონიშვნა" + +msgid "Clear selection" +msgstr "მონიშვნის გასუფთავება" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"ჯერ შეიყვანეთ მომხმარებლის სახელი და პაროლი. ამის შემდეგ თქვენ გექნებათ " +"მომხმარებლის სხვა ოპციების რედაქტირების შესაძლებლობა." + +msgid "Enter a username and password." +msgstr "შეიყვანეთ მომხმარებლის სახელი და პაროლი" + +msgid "Change password" +msgstr "პაროლის შეცვლა" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "გთხოვთ, შეასწოროთ ქვემოთმოყვანილი შეცდომები." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"შეიყვანეთ ახალი პაროლი მომხმარებლისათვის %(username)s." + +msgid "Welcome," +msgstr "კეთილი იყოს თქვენი მობრძანება," + +msgid "View site" +msgstr "საიტის ნახვა" + +msgid "Documentation" +msgstr "დოკუმენტაცია" + +msgid "Log out" +msgstr "გამოსვლა" + +#, python-format +msgid "Add %(name)s" +msgstr "დავამატოთ %(name)s" + +msgid "History" +msgstr "ისტორია" + +msgid "View on site" +msgstr "წარმოდგენა საიტზე" + +msgid "Filter" +msgstr "ფილტრი" + +msgid "Remove from sorting" +msgstr "დალაგებიდან მოშორება" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "დალაგების პრიორიტეტი: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "დალაგების გადართვა" + +msgid "Delete" +msgstr "წავშალოთ" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"ობიექტების წაშლა: %(object_name)s '%(escaped_object)s' გამოიწვევს " +"დაკავშირებული ობიექტების წაშლას, მაგრამ თქვენ არა გაქვთ შემდეგი ტიპების " +"ობიექტების წაშლის უფლება:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s ტიპის '%(escaped_object)s' ობიექტის წაშლა მოითხოვს ასევე " +"შემდეგი დაკავშირებული ობიექტების წაშლას:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"ნამდვილად გსურთ, წაშალოთ %(object_name)s \"%(escaped_object)s\"? ყველა " +"ქვემოთ მოყვანილი დაკავშირებული ობიექტი წაშლილი იქნება:" + +msgid "Objects" +msgstr "ობიექტები" + +msgid "Yes, I'm sure" +msgstr "კი, ნამდვილად" + +msgid "No, take me back" +msgstr "არა, დამაბრუნეთ უკან" + +msgid "Delete multiple objects" +msgstr "რამდენიმე ობიექტის წაშლა" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"%(objects_name)s ტიპის ობიექტის წაშლა ითხოვს ასევე შემდეგი ობიექტების " +"წაშლას, მაგრამ თქვენ არ გაქვთ ამის ნებართვა:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"არჩეული %(objects_name)s ობიექტის წაშლა მოითხოვს ასევე შემდეგი დაცული " +"დაკავშირეული ობიექტების წაშლას:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"დარწმუნებული ხართ, რომ გსურთ %(objects_name)s ობიექტის წაშლა? ყველა შემდეგი " +"ობიექტი, და მათზე დამოკიდებული ჩანაწერები წაშლილი იქნება:" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "წავშალოთ?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s მიხედვით " + +msgid "Summary" +msgstr "შეჯამება" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "მოდელები %(name)s აპლიკაციაში" + +msgid "Add" +msgstr "დამატება" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "არ არის მისაწვდომი" + +msgid "Unknown content" +msgstr "უცნობი შიგთავსი" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"თქვენი მონაცემთა ბაზის ინსტალაცია არაკორექტულია. დარწმუნდით, რომ მონაცემთა " +"ბაზის შესაბამისი ცხრილები შექმნილია, და მონაცემთა ბაზის წაკითხვა შეუძლია " +"შესაბამის მომხმარებელს." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "დაგავიწყდათ თქვენი პაროლი ან მომხმარებლის სახელი?" + +msgid "Date/time" +msgstr "თარიღი/დრო" + +msgid "User" +msgstr "მომხმარებელი" + +msgid "Action" +msgstr "მოქმედება" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"ამ ობიექტს ცვლილებების ისტორია არა აქვს. როგორც ჩანს, იგი არ იყო დამატებული " +"ადმინისტრირების საიტის მეშვეობით." + +msgid "Show all" +msgstr "ვაჩვენოთ ყველა" + +msgid "Save" +msgstr "შევინახოთ" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "ძებნა" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s შედეგი" +msgstr[1] "%(counter)s შედეგი" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "სულ %(full_result_count)s" + +msgid "Save as new" +msgstr "შევინახოთ, როგორც ახალი" + +msgid "Save and add another" +msgstr "შევინახოთ და დავამატოთ ახალი" + +msgid "Save and continue editing" +msgstr "შევინახოთ და გავაგრძელოთ რედაქტირება" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "მონიშნული %(model)s-ის შეცვლა" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "მონიშნული %(model)s-ის წაშლა" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "გმადლობთ, რომ დღეს ამ საიტთან მუშაობას დაუთმეთ დრო." + +msgid "Log in again" +msgstr "ხელახლა შესვლა" + +msgid "Password change" +msgstr "პაროლის შეცვლა" + +msgid "Your password was changed." +msgstr "თქვენი პაროლი შეიცვალა." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"გთხოვთ, უსაფრთხოების დაცვის მიზნით, შეიყვანოთ თქვენი ძველი პაროლი, შემდეგ კი " +"ახალი პაროლი ორჯერ, რათა დარწმუნდეთ, რომ იგი შეყვანილია სწორად." + +msgid "Change my password" +msgstr "შევცვალოთ ჩემი პაროლი" + +msgid "Password reset" +msgstr "პაროლის აღდგენა" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"თქვენი პაროლი დაყენებულია. ახლა შეგიძლიათ გადახვიდეთ შემდეგ გვერდზე და " +"შეხვიდეთ სისტემაში." + +msgid "Password reset confirmation" +msgstr "პაროლი შეცვლის დამოწმება" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"გთხოვთ, შეიყვანეთ თქვენი ახალი პაროლი ორჯერ, რათა დავრწმუნდეთ, რომ იგი " +"სწორად ჩაბეჭდეთ." + +msgid "New password:" +msgstr "ახალი პაროლი:" + +msgid "Confirm password:" +msgstr "პაროლის დამოწმება:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"პაროლის აღდგენის ბმული არასწორი იყო, შესაძლოა იმის გამო, რომ იგი უკვე ყოფილა " +"გამოყენებული. გთხოვთ, კიდევ ერთხელ სცადოთ პაროლის აღდგენა." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"თქვენ მიიღეთ ეს წერილი იმიტომ, რომ გააკეთეთ პაროლის თავიდან დაყენების " +"მოთხოვნა თქვენი მომხმარებლის ანგარიშისთვის %(site_name)s-ზე." + +msgid "Please go to the following page and choose a new password:" +msgstr "გთხოვთ, გადახვიდეთ შემდეგ გვერდზე და აირჩიოთ ახალი პაროლი:" + +msgid "Your username, in case you've forgotten:" +msgstr "თქვენი მომხმარებლის სახელი (თუ დაგავიწყდათ):" + +msgid "Thanks for using our site!" +msgstr "გმადლობთ, რომ იყენებთ ჩვენს საიტს!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s საიტის გუნდი" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"დაგავიწყდათ თქვენი პაროლი? შეიყვანეთ თქვენი ელ. ფოსტის მისამართი ქვემოთ და " +"ჩვენ გამოგიგზავნით მითითებებს ახალი პაროლის დასაყენებლად." + +msgid "Email address:" +msgstr "ელ. ფოსტის მისამართი:" + +msgid "Reset my password" +msgstr "აღვადგინოთ ჩემი პაროლი" + +msgid "All dates" +msgstr "ყველა თარიღი" + +#, python-format +msgid "Select %s" +msgstr "ავირჩიოთ %s" + +#, python-format +msgid "Select %s to change" +msgstr "აირჩიეთ %s შესაცვლელად" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "თარიღი;" + +msgid "Time:" +msgstr "დრო:" + +msgid "Lookup" +msgstr "ძიება" + +msgid "Currently:" +msgstr "ამჟამად:" + +msgid "Change:" +msgstr "შეცვლა:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..65ee60f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ka/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013,2015 +# David A. , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "მისაწვდომი %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"ეს არის მისაწვდომი %s-ის სია. ზოგიერთი მათგანის ასარჩევად, მონიშვნით ისინი " +"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"არჩევა\" ." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "აკრიფეთ ამ სარკმელში მისაწვდომი %s-ის სიის გასაფილტრად." + +msgid "Filter" +msgstr "ფილტრი" + +msgid "Choose all" +msgstr "ავირჩიოთ ყველა" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "დააწკაპუნეთ ერთდროულად ყველა %s-ის ასარჩევად." + +msgid "Choose" +msgstr "არჩევა" + +msgid "Remove" +msgstr "წავშალოთ" + +#, javascript-format +msgid "Chosen %s" +msgstr "არჩეული %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"ეს არის არჩეული %s-ის სია. ზოგიერთი მათგანის მოსაშორებლად, მონიშვნით ისინი " +"ქვედა სარკმელში და დააწკაპუნეთ ორ სარკმელს შორის მდებარე ისარზე \"მოშორება" +"\" ." + +msgid "Remove all" +msgstr "ყველას მოშორება" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "დააწკაპუნეთ ყველა არჩეული %s-ის ერთდროულად მოსაშორებლად." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)s-დან არჩეულია %(sel)s" +msgstr[1] "%(cnt)s-დან არჩეულია %(sel)s" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"ცალკეულ ველებში შეუნახავი ცვლილებები გაქვთ! თუ მოქმედებას შეასრულებთ, " +"შეუნახავი ცვლილებები დაიკარაგება." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"აგირჩევიათ მოქმედება, მაგრამ ცალკეული ველები ჯერ არ შეგინახიათ! გთხოვთ, " +"შენახვისთვის დააჭიროთ OK. მოქმედების ხელახლა გაშვება მოგიწევთ." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"აგირჩევიათ მოქმედება, მაგრამ ცალკეულ ველებში ცვლილებები არ გაგიკეთებიათ! " +"სავარაუდოდ, ეძებთ ღილაკს \"Go\", და არა \"შენახვა\"" + +msgid "Now" +msgstr "ახლა" + +msgid "Midnight" +msgstr "შუაღამე" + +msgid "6 a.m." +msgstr "დილის 6 სთ" + +msgid "Noon" +msgstr "შუადღე" + +msgid "6 p.m." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." +msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით წინ სერვერის დროზე." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." +msgstr[1] "შენიშვნა: თქვენ ხართ %s საათით უკან სერვერის დროზე." + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "ავირჩიოთ დრო" + +msgid "Cancel" +msgstr "უარი" + +msgid "Today" +msgstr "დღეს" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "გუშინ" + +msgid "Tomorrow" +msgstr "ხვალ" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "ვაჩვენოთ" + +msgid "Hide" +msgstr "დავმალოთ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d095721 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..57f70c9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kab/LC_MESSAGES/djangojs.po @@ -0,0 +1,204 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-10-06 08:10+0000\n" +"Last-Translator: Muḥend Belqasem \n" +"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" +"kab/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kab\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Yella %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "Tastayt" + +msgid "Choose all" +msgstr "Fren akk" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +msgid "Choose" +msgstr "Fren" + +msgid "Remove" +msgstr "kkes" + +#, javascript-format +msgid "Chosen %s" +msgstr "Ifren %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "Kkes akk" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s si %(cnt)s yettwafren" +msgstr[1] "%(sel)s si %(cnt)s ttwafernen" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "Tura" + +msgid "Choose a Time" +msgstr "Fren akud:" + +msgid "Choose a time" +msgstr "Fren akud" + +msgid "Midnight" +msgstr "Ttnaṣfa n yiḍ" + +msgid "6 a.m." +msgstr "6 f.t." + +msgid "Noon" +msgstr "Ttnaṣfa n uzal" + +msgid "6 p.m." +msgstr "6 m.d." + +msgid "Cancel" +msgstr "Sefsex" + +msgid "Today" +msgstr "Ass-a" + +msgid "Choose a Date" +msgstr "Fren azemz" + +msgid "Yesterday" +msgstr "Iḍelli" + +msgid "Tomorrow" +msgstr "Azekka" + +msgid "January" +msgstr "Yennayer" + +msgid "February" +msgstr "Fuṛaṛ" + +msgid "March" +msgstr "Meɣres" + +msgid "April" +msgstr "Yebrir" + +msgid "May" +msgstr "Mayyu" + +msgid "June" +msgstr "Yunyu" + +msgid "July" +msgstr "Yulyu" + +msgid "August" +msgstr "Ɣuct" + +msgid "September" +msgstr "Ctamber" + +msgid "October" +msgstr "Tuber" + +msgid "November" +msgstr "Wamber" + +msgid "December" +msgstr "Dujamber" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Sken" + +msgid "Hide" +msgstr "Ffer" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..abc3c54 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..fbe0ae1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/km/LC_MESSAGES/djangojs.po @@ -0,0 +1,201 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s ដែលអាច​ជ្រើសរើសបាន" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "ស្វែងរកជាមួយ" + +msgid "Choose all" +msgstr "ជ្រើសរើសទាំងអស់" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +msgid "Choose" +msgstr "" + +msgid "Remove" +msgstr "លប់ចេញ" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s ដែលបានជ្រើសរើស" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" + +msgid "Now" +msgstr "ឥឡូវនេះ" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "ជ្រើសរើសម៉ោង" + +msgid "Midnight" +msgstr "អធ្រាត្រ" + +msgid "6 a.m." +msgstr "ម៉ោង ៦ ព្រឹក" + +msgid "Noon" +msgstr "ពេលថ្ងែត្រង់" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "លប់ចោល" + +msgid "Today" +msgstr "ថ្ងៃនេះ" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "ម្សិលមិញ" + +msgid "Tomorrow" +msgstr "ថ្ងៃស្អែក" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "" + +msgid "Hide" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..0c93418 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,720 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# lauris , 2011 +# Matas Dailyda , 2015-2019 +# Nikolajus Krauklis , 2013 +# Simonas Kazlauskas , 2012-2013 +# sirex , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 10:32+0000\n" +"Last-Translator: Matas Dailyda \n" +"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" +"lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Sėkmingai ištrinta %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Ištrinti %(name)s negalima" + +msgid "Are you sure?" +msgstr "Ar esate tikras?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ištrinti pasirinktus %(verbose_name_plural)s " + +msgid "Administration" +msgstr "Administravimas" + +msgid "All" +msgstr "Visi" + +msgid "Yes" +msgstr "Taip" + +msgid "No" +msgstr "Ne" + +msgid "Unknown" +msgstr "Nežinomas" + +msgid "Any date" +msgstr "Betkokia data" + +msgid "Today" +msgstr "Šiandien" + +msgid "Past 7 days" +msgstr "Paskutinės 7 dienos" + +msgid "This month" +msgstr "Šį mėnesį" + +msgid "This year" +msgstr "Šiais metais" + +msgid "No date" +msgstr "Nėra datos" + +msgid "Has date" +msgstr "Turi datą" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Prašome įvesti tinkamą personalo paskyros %(username)s ir slaptažodį. " +"Atminkite, kad abu laukeliai yra jautrūs raidžių dydžiui." + +msgid "Action:" +msgstr "Veiksmas:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Pridėti dar viena %(verbose_name)s" + +msgid "Remove" +msgstr "Pašalinti" + +msgid "Addition" +msgstr "Pridėjimas" + +msgid "Change" +msgstr "Pakeisti" + +msgid "Deletion" +msgstr "Pašalinimas" + +msgid "action time" +msgstr "veiksmo laikas" + +msgid "user" +msgstr "vartotojas" + +msgid "content type" +msgstr "turinio tipas" + +msgid "object id" +msgstr "objekto id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "objekto repr" + +msgid "action flag" +msgstr "veiksmo žymė" + +msgid "change message" +msgstr "pakeisti žinutę" + +msgid "log entry" +msgstr "log įrašas" + +msgid "log entries" +msgstr "log įrašai" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "„%(object)s“ pridėti." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Pakeisti „%(object)s“ - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "„%(object)s“ ištrinti." + +msgid "LogEntry Object" +msgstr "LogEntry objektas" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Pridėtas {name} \"{object}\"." + +msgid "Added." +msgstr "Pridėta." + +msgid "and" +msgstr "ir" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Pakeisti {fields} arba {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Pakeisti {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Pašalintas {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Nei vienas laukas nepakeistas" + +msgid "None" +msgstr "None" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Nuspauskite \"Control\", arba \"Command\" Mac kompiuteriuose, kad pasirinkti " +"daugiau nei vieną." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" buvo sėkmingai pridėtas." + +msgid "You may edit it again below." +msgstr "Galite tai dar kartą redaguoti žemiau." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite pridėti kitą {name} žemiau." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas. Galite jį koreguoti žemiau." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" buvo sėkmingai pridėtas. Galite jį vėl redaguoti žemiau." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" buvo sėkmingai pakeistas. Galite pridėti kitą {name} žemiau." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" buvo sėkmingai pakeistas." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Įrašai turi būti pasirinkti, kad būtų galima atlikti veiksmus. Įrašai " +"pakeisti nebuvo." + +msgid "No action selected." +msgstr "Veiksmai atlikti nebuvo." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" sėkmingai ištrintas." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s su ID \"%(key)s\" neegzistuoja. Gal tai buvo ištrinta?" + +#, python-format +msgid "Add %s" +msgstr "Pridėti %s" + +#, python-format +msgid "Change %s" +msgstr "Pakeisti %s" + +#, python-format +msgid "View %s" +msgstr "Peržiūrėti %s" + +msgid "Database error" +msgstr "Duomenų bazės klaida" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s sėkmingai pakeistas." +msgstr[1] "%(count)s %(name)s sėkmingai pakeisti." +msgstr[2] "%(count)s %(name)s " +msgstr[3] "%(count)s %(name)s " + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s pasirinktas" +msgstr[1] "%(total_count)s pasirinkti" +msgstr[2] "Visi %(total_count)s pasirinkti" +msgstr[3] "Visi %(total_count)s pasirinkti" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 iš %(cnt)s pasirinkta" + +#, python-format +msgid "Change history: %s" +msgstr "Pakeitimų istorija: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s %(instance)s šalinimas reikalautų pašalinti apsaugotus " +"susijusius objektus: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django tinklalapio administravimas" + +msgid "Django administration" +msgstr "Django administravimas" + +msgid "Site administration" +msgstr "Tinklalapio administravimas" + +msgid "Log in" +msgstr "Prisijungti" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s administravimas" + +msgid "Page not found" +msgstr "Puslapis nerastas" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Atsiprašome, bet prašytas puslapis nerastas." + +msgid "Home" +msgstr "Pradinis" + +msgid "Server error" +msgstr "Serverio klaida" + +msgid "Server error (500)" +msgstr "Serverio klaida (500)" + +msgid "Server Error (500)" +msgstr "Serverio klaida (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Netikėta klaida. Apie ją buvo pranešta administratoriams el. paštu ir ji " +"turėtų būti greitai sutvarkyta. Dėkui už kantrybę." + +msgid "Run the selected action" +msgstr "Vykdyti pasirinktus veiksmus" + +msgid "Go" +msgstr "Vykdyti" + +msgid "Click here to select the objects across all pages" +msgstr "Spauskite čia norėdami pasirinkti visus įrašus" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Pasirinkti visus %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Atstatyti į pradinę būseną" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Pirmiausia įveskite naudotojo vardą ir slaptažodį. Tada galėsite keisti " +"daugiau naudotojo nustatymų." + +msgid "Enter a username and password." +msgstr "Įveskite naudotojo vardą ir slaptažodį." + +msgid "Change password" +msgstr "Keisti slaptažodį" + +msgid "Please correct the error below." +msgstr "Prašome ištaisyti žemiau esančią klaidą." + +msgid "Please correct the errors below." +msgstr "Ištaisykite žemiau esančias klaidas." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Įveskite naują slaptažodį naudotojui %(username)s." + +msgid "Welcome," +msgstr "Sveiki," + +msgid "View site" +msgstr "Peržiūrėti tinklalapį" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Log out" +msgstr "Atsijungti" + +#, python-format +msgid "Add %(name)s" +msgstr "Naujas %(name)s" + +msgid "History" +msgstr "Istorija" + +msgid "View on site" +msgstr "Matyti tinklalapyje" + +msgid "Filter" +msgstr "Filtras" + +msgid "Remove from sorting" +msgstr "Pašalinti iš rikiavimo" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Rikiavimo prioritetas: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Perjungti rikiavimą" + +msgid "Delete" +msgstr "Ištrinti" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Trinant %(object_name)s '%(escaped_object)s' turi būti ištrinti ir susiję " +"objektai, bet tavo vartotojas neturi teisių ištrinti šių objektų:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Ištrinant %(object_name)s '%(escaped_object)s' būtų ištrinti šie apsaugoti " +"ir susiję objektai:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ar este tikri, kad norite ištrinti %(object_name)s \"%(escaped_object)s\"? " +"Visi susiję objektai bus ištrinti:" + +msgid "Objects" +msgstr "Objektai" + +msgid "Yes, I'm sure" +msgstr "Taip, esu tikras" + +msgid "No, take me back" +msgstr "Ne, grįžti atgal" + +msgid "Delete multiple objects" +msgstr "Ištrinti kelis objektus" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Ištrinant pasirinktą %(objects_name)s būtų ištrinti susiję objektai, tačiau " +"jūsų vartotojas neturi reikalingų teisių ištrinti šiuos objektų tipus:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Ištrinant pasirinktus %(objects_name)s būtų ištrinti šie apsaugoti ir susiję " +"objektai:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ar esate tikri, kad norite ištrinti pasirinktus %(objects_name)s? Sekantys " +"pasirinkti bei susiję objektai bus ištrinti:" + +msgid "View" +msgstr "Peržiūrėti" + +msgid "Delete?" +msgstr "Ištrinti?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Pagal %(filter_title)s " + +msgid "Summary" +msgstr "Santrauka" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s aplikacijos modeliai" + +msgid "Add" +msgstr "Pridėti" + +msgid "You don't have permission to view or edit anything." +msgstr "Jūs neturite teisių peržiūrai ir redagavimui." + +msgid "Recent actions" +msgstr "Paskutiniai veiksmai" + +msgid "My actions" +msgstr "Mano veiksmai" + +msgid "None available" +msgstr "Nėra prieinamų" + +msgid "Unknown content" +msgstr "Nežinomas turinys" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Kažkas yra negerai su jūsų duomenų bazės instaliacija. Įsitikink, kad visos " +"reikalingos lentelės sukurtos ir vartotojas turi teises skaityti duomenų " +"bazę." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Jūs esate prisijungęs kaip %(username)s, bet neturite teisių patekti į šį " +"puslapį. Ar norėtumete prisijungti su kitu vartotoju?" + +msgid "Forgotten your password or username?" +msgstr "Pamiršote slaptažodį ar vartotojo vardą?" + +msgid "Date/time" +msgstr "Data/laikas" + +msgid "User" +msgstr "Naudotojas" + +msgid "Action" +msgstr "Veiksmas" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Šis objektas neturi pakeitimų istorijos. Tikriausiai jis buvo pridėtas ne " +"per administravimo puslapį." + +msgid "Show all" +msgstr "Rodyti visus" + +msgid "Save" +msgstr "Išsaugoti" + +msgid "Popup closing…" +msgstr "Iškylantysis langas užsidaro..." + +msgid "Search" +msgstr "Ieškoti" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s rezultatas" +msgstr[1] "%(counter)s rezultatai" +msgstr[2] "%(counter)s rezultatai" +msgstr[3] "%(counter)s rezultatai" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s iš viso" + +msgid "Save as new" +msgstr "Išsaugoti kaip naują" + +msgid "Save and add another" +msgstr "Išsaugoti ir pridėti naują" + +msgid "Save and continue editing" +msgstr "Išsaugoti ir tęsti redagavimą" + +msgid "Save and view" +msgstr "Išsaugoti ir peržiūrėti" + +msgid "Close" +msgstr "Uždaryti" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Keisti pasirinktus %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Pridėti dar vieną %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Pašalinti pasirinktus %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Dėkui už šiandien tinklalapyje turiningai praleistą laiką." + +msgid "Log in again" +msgstr "Prisijungti dar kartą" + +msgid "Password change" +msgstr "Slaptažodžio keitimas" + +msgid "Your password was changed." +msgstr "Jūsų slaptažodis buvo pakeistas." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Saugumo sumetimais įveskite seną slaptažodį ir tada du kartus naują, kad " +"įsitikinti, jog nesuklydote rašydamas" + +msgid "Change my password" +msgstr "Keisti mano slaptažodį" + +msgid "Password reset" +msgstr "Slaptažodžio atstatymas" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Jūsų slaptažodis buvo išsaugotas. Dabas galite prisijungti." + +msgid "Password reset confirmation" +msgstr "Slaptažodžio atstatymo patvirtinimas" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Įveskite naująjį slaptažodį du kartus, taip užtikrinant, jog nesuklydote " +"rašydami." + +msgid "New password:" +msgstr "Naujasis slaptažodis:" + +msgid "Confirm password:" +msgstr "Slaptažodžio patvirtinimas:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Slaptažodžio atstatymo nuoroda buvo negaliojanti, nes ji tikriausiai jau " +"buvo panaudota. Prašykite naujo slaptažodžio pakeitimo." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Jei egzistuoja vartotojas su jūsų įvestu elektroninio pašto adresu, " +"išsiųsime jums slaptažodžio nustatymo instrukcijas . Instrukcijas turėtumėte " +"gauti netrukus." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Jei el. laiško negavote, prašome įsitikinti ar įvedėte tą el. pašto adresą " +"kuriuo registravotės ir patikrinkite savo šlamšto aplanką." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Jūs gaunate šį laišką nes prašėte paskyros slaptažodžio atkūrimo " +"%(site_name)s svetainėje." + +msgid "Please go to the following page and choose a new password:" +msgstr "Prašome eiti į šį puslapį ir pasirinkti naują slaptažodį:" + +msgid "Your username, in case you've forgotten:" +msgstr "Jūsų naudotojo vardas, jei netyčia jį užmiršote:" + +msgid "Thanks for using our site!" +msgstr "Dėkui, kad naudojatės mūsų tinklalapiu!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s komanda" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Pamiršote slaptažodį? Įveskite savo el. pašto adresą ir mes išsiųsime laišką " +"su instrukcijomis kaip nustatyti naują slaptažodį." + +msgid "Email address:" +msgstr "El. pašto adresas:" + +msgid "Reset my password" +msgstr "Atstatyti slaptažodį" + +msgid "All dates" +msgstr "Visos datos" + +#, python-format +msgid "Select %s" +msgstr "Pasirinkti %s" + +#, python-format +msgid "Select %s to change" +msgstr "Pasirinkite %s kurį norite keisti" + +#, python-format +msgid "Select %s to view" +msgstr "Pasirinkti %s peržiūrai" + +msgid "Date:" +msgstr "Data:" + +msgid "Time:" +msgstr "Laikas:" + +msgid "Lookup" +msgstr "Paieška" + +msgid "Currently:" +msgstr "Šiuo metu:" + +msgid "Change:" +msgstr "Pakeisti:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d68a14a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..61e6e33 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4f1b55f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po @@ -0,0 +1,224 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# NullIsNot0 , 2017 +# Jannis Leidel , 2011 +# peterisb , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-11-18 08:13+0000\n" +"Last-Translator: NullIsNot0 \n" +"Language-Team: Latvian (http://www.transifex.com/django/django/language/" +"lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Pieejams %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Šis ir saraksts ar pieejamajiem %s. Tev ir jāizvēlas atbilstošās vērtības " +"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izvēlēties" +"\", lai pārvietotu starp izvēļu sarakstiem." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" +"Raksti šajā logā, lai filtrētu zemāk esošo sarakstu ar pieejamajiem %s." + +msgid "Filter" +msgstr "Filtrs" + +msgid "Choose all" +msgstr "Izvēlēties visu" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Izvēlies, lai pievienotu visas %s izvēles vienā reizē." + +msgid "Choose" +msgstr "Izvēlies" + +msgid "Remove" +msgstr "Izņemt" + +#, javascript-format +msgid "Chosen %s" +msgstr "Izvēlies %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Šis ir saraksts ar izvēlētajiem %s. Tev ir jāizvēlas atbilstošās vērtības " +"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izņemt\", " +"lai izņemtu no izvēlēto ierakstu saraksta." + +msgid "Remove all" +msgstr "Izņemt visu" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Izvēlies, lai izņemtu visas %s izvēles vienā reizē." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s no %(cnt)s izvēlēts" +msgstr[1] "%(sel)s no %(cnt)s izvēlēti" +msgstr[2] "%(sel)s no %(cnt)s izvēlēti" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Jūs neesat saglabājis izmaiņas rediģējamiem laukiem. Ja jūs tagad " +"izpildīsiet izvēlēto darbību, šīs izmaiņas netiks saglabātas." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Jūs esat izvēlējies veikt darbību un neesat saglabājis veiktās izmaiņas. " +"Lūdzu nospiežat OK, lai saglabātu. Jums nāksies šo darbību izpildīt vēlreiz." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Jūs esat izvēlējies veikt darbību un neesat izmainījis nevienu lauku. Jūs " +"droši vien meklējat pogu 'Aiziet' nevis 'Saglabāt'." + +msgid "Now" +msgstr "Tagad" + +msgid "Midnight" +msgstr "Pusnakts" + +msgid "6 a.m." +msgstr "06.00" + +msgid "Noon" +msgstr "Pusdienas laiks" + +msgid "6 p.m." +msgstr "6:00" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." +msgstr[1] "Piezīme: Tavs laiks ir %s stundu pirms servera laika." +msgstr[2] "Piezīme: Tavs laiks ir %s stundas pirms servera laika." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." +msgstr[1] "Piezīme: Tavs laiks ir %s stundu pēc servera laika." +msgstr[2] "Piezīme: Tavs laiks ir %s stundas pēc servera laika." + +msgid "Choose a Time" +msgstr "Izvēlies laiku" + +msgid "Choose a time" +msgstr "Izvēlieties laiku" + +msgid "Cancel" +msgstr "Atcelt" + +msgid "Today" +msgstr "Šodien" + +msgid "Choose a Date" +msgstr "Izvēlies datumu" + +msgid "Yesterday" +msgstr "Vakar" + +msgid "Tomorrow" +msgstr "Rīt" + +msgid "January" +msgstr "janvāris" + +msgid "February" +msgstr "februāris" + +msgid "March" +msgstr "marts" + +msgid "April" +msgstr "aprīlis" + +msgid "May" +msgstr "maijs" + +msgid "June" +msgstr "jūnijs" + +msgid "July" +msgstr "jūlijs" + +msgid "August" +msgstr "augusts" + +msgid "September" +msgstr "septembris" + +msgid "October" +msgstr "oktobris" + +msgid "November" +msgstr "novembris" + +msgid "December" +msgstr "decembris" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Sv" + +msgctxt "one letter Monday" +msgid "M" +msgstr "Pr" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "O" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "T" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "C" + +msgctxt "one letter Friday" +msgid "F" +msgstr "Pk" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Se" + +msgid "Show" +msgstr "Parādīt" + +msgid "Hide" +msgstr "Slēpt" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5b11c78 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..57a9d75 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po new file mode 100644 index 0000000..8137103 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/django.po @@ -0,0 +1,712 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ankhbayar , 2013 +# Jannis Leidel , 2011 +# jargalan , 2011 +# Zorig, 2016 +# Анхбаяр Анхаа , 2013-2016,2018-2019 +# Баясгалан Цэвлээ , 2011,2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-13 09:17+0000\n" +"Last-Translator: Анхбаяр Анхаа \n" +"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(items)s ээс %(count)d-ийг амжилттай устгалаа." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s устгаж чадахгүй." + +msgid "Are you sure?" +msgstr "Итгэлтэй байна уу?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Сонгосон %(verbose_name_plural)s-ийг устга" + +msgid "Administration" +msgstr "Удирдлага" + +msgid "All" +msgstr "Бүгд " + +msgid "Yes" +msgstr "Тийм" + +msgid "No" +msgstr "Үгүй" + +msgid "Unknown" +msgstr "Тодорхойгүй" + +msgid "Any date" +msgstr "Бүх өдөр" + +msgid "Today" +msgstr "Өнөөдөр" + +msgid "Past 7 days" +msgstr "Өнгөрсөн долоо хоног" + +msgid "This month" +msgstr "Энэ сар" + +msgid "This year" +msgstr "Энэ жил" + +msgid "No date" +msgstr "Огноогүй" + +msgid "Has date" +msgstr "Огноотой" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Ажилтан хэрэглэгчийн %(username)s ба нууц үгийг зөв оруулна уу. Хоёр талбарт " +"том жижигээр үсгээр бичих ялгаатай." + +msgid "Action:" +msgstr "Үйлдэл:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Өөр %(verbose_name)s нэмэх " + +msgid "Remove" +msgstr "Хасах" + +msgid "Addition" +msgstr "Нэмэгдсэн" + +msgid "Change" +msgstr "Өөрчлөх" + +msgid "Deletion" +msgstr "Устгагдсан" + +msgid "action time" +msgstr "үйлдлийн хугацаа" + +msgid "user" +msgstr "хэрэглэгч" + +msgid "content type" +msgstr "агуулгын төрөл" + +msgid "object id" +msgstr "обектийн id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "обектийн хамаарал" + +msgid "action flag" +msgstr "үйлдэлийн тэмдэг" + +msgid "change message" +msgstr "өөрчлөлтийн мэдээлэл" + +msgid "log entry" +msgstr "лог өгөгдөл" + +msgid "log entries" +msgstr "лог өгөгдөлүүд" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" нэмсэн." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\"-ийг %(changes)s өөрчилсөн." + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" устгасан." + +msgid "LogEntry Object" +msgstr "Лог бүртгэлийн обект" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Нэмэгдсэн {name} \"{object}\"." + +msgid "Added." +msgstr "Нэмэгдсэн." + +msgid "and" +msgstr "ба" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{name} \"{object}\"-ны {fields} өөрчилөгдсөн." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Өөрчлөгдсөн {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Устгасан {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Өөрчилсөн талбар алга байна." + +msgid "None" +msgstr "Хоосон" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Олон утга сонгохын тулд \"Control\", эсвэл Mac дээр \"Command\" товчыг дарж " +"байгаад сонгоно." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr " {name} \"{obj}\" амжилттай нэмэгдлээ." + +msgid "You may edit it again below." +msgstr "Та дараахийг дахин засах боломжтой" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" амжилттай нэмэгдлээ. Доорх хэсгээс {name} өөрийн нэмэх " +"боломжтой." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" амжилттай өөрчилөгдлөө. Та дахин засах боломжтой." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" амжилттай нэмэгдлээ. Та дахин засах боломжтой." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" амжилттай өөрчилөгдлөө. Доорх хэсгээс {name} өөрийн нэмэх " +"боломжтой." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" амжилттай засагдлаа." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Үйлдэл хийхийн тулд Та ядаж 1-ийг сонгох хэрэгтэй. Өөрчилөлт хийгдсэнгүй." + +msgid "No action selected." +msgstr "Үйлдэл сонгоогүй." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr " %(name)s \"%(obj)s\" амжилттай устгагдлаа." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" +"\"%(key)s\" дугаартай %(name)s байхгүй байна. Устсан байсан юм болов уу?" + +#, python-format +msgid "Add %s" +msgstr "%s-ийг нэмэх" + +#, python-format +msgid "Change %s" +msgstr "%s-ийг өөрчлөх" + +#, python-format +msgid "View %s" +msgstr "%s харах " + +msgid "Database error" +msgstr "Өгөгдлийн сангийн алдаа" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." +msgstr[1] "%(count)s %(name)s-ийг амжилттай өөрчиллөө." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Бүгд %(total_count)s сонгогдсон" +msgstr[1] "Бүгд %(total_count)s сонгогдсон" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s оос 0 сонгосон" + +#, python-format +msgid "Change history: %s" +msgstr "Өөрчлөлтийн түүх: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(instance)s %(class_name)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +" %(class_name)s төрлийн %(instance)s-ийг устгах гэж байна. Эхлээд дараах " +"холбоотой хамгаалагдсан обектуудыг устгах шаардлагатай: %(related_objects)s" + +msgid "Django site admin" +msgstr "Сайтын удирдлага" + +msgid "Django administration" +msgstr "Удирдлага" + +msgid "Site administration" +msgstr "Сайтын удирдлага" + +msgid "Log in" +msgstr "Нэвтрэх" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s удирдлага" + +msgid "Page not found" +msgstr "Хуудас олдсонгүй." + +msgid "We're sorry, but the requested page could not be found." +msgstr "Уучлаарай, хандахыг хүссэн хуудас тань олдсонгүй." + +msgid "Home" +msgstr "Нүүр" + +msgid "Server error" +msgstr "Серверийн алдаа" + +msgid "Server error (500)" +msgstr "Серверийн алдаа (500)" + +msgid "Server Error (500)" +msgstr "Серверийн алдаа (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Алдаа гарсан байна. Энэ алдааг сайт хариуцагчид имэйлээр мэдэгдсэн бөгөөд " +"тэд нэн даруй засах хэрэгтэй. Хүлээцтэй хандсанд баярлалаа." + +msgid "Run the selected action" +msgstr "Сонгосон үйлдэлийг ажилуулах" + +msgid "Go" +msgstr "Гүйцэтгэх" + +msgid "Click here to select the objects across all pages" +msgstr "Бүх хуудаснууд дээрх объектуудыг сонгох" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Сонгосонг цэвэрлэх" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Эхлээд хэрэглэгчийн нэр нууц үгээ оруулна уу. Ингэснээр та хэрэглэгчийн " +"сонголтыг нэмж засварлах боломжтой болно. " + +msgid "Enter a username and password." +msgstr "Хэрэглэгчийн нэр ба нууц үгээ оруулна." + +msgid "Change password" +msgstr "Нууц үг өөрчлөх" + +msgid "Please correct the error below." +msgstr "Доорх алдааг засна уу" + +msgid "Please correct the errors below." +msgstr "Доор гарсан алдаануудыг засна уу." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s.хэрэглэгчид шинэ нууц үг оруулна уу." + +msgid "Welcome," +msgstr "Тавтай морилно уу" + +msgid "View site" +msgstr "Сайтаас харах" + +msgid "Documentation" +msgstr "Баримтжуулалт" + +msgid "Log out" +msgstr "Гарах" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s нэмэх" + +msgid "History" +msgstr "Түүх" + +msgid "View on site" +msgstr "Сайтаас харах" + +msgid "Filter" +msgstr "Шүүлтүүр" + +msgid "Remove from sorting" +msgstr "Эрэмблэлтээс хасах" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Эрэмблэх урьтамж: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Эрэмбэлэлтийг харуул" + +msgid "Delete" +msgstr "Устгах" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s'-ийг устгавал холбогдох объект нь устах " +"ч бүртгэл тань дараах төрлийн объектуудийг устгах зөвшөөрөлгүй байна:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +" %(object_name)s обектийг устгаж байна. '%(escaped_object)s' холбоотой " +"хамгаалагдсан обектуудыг заавал утсгах хэрэгтэй :" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Та %(object_name)s \"%(escaped_object)s\"-ийг устгахдаа итгэлтэй байна уу? " +"Үүнийг устгавал дараах холбогдох зүйлс нь бүгд устана:" + +msgid "Objects" +msgstr "Бичлэгүүд" + +msgid "Yes, I'm sure" +msgstr "Тийм, итгэлтэй байна." + +msgid "No, take me back" +msgstr "Үгүй, намайг буцаа" + +msgid "Delete multiple objects" +msgstr "Олон обектууд устгах" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Сонгосон %(objects_name)s обектуудыг устгасанаар хамаатай бүх обкетууд устах " +"болно. Гэхдээ таньд эрх эдгээр төрлийн обектуудыг утсгах эрх байхгүй байна: " + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"%(objects_name)s обектуудыг утсгаж байна дараах холбоотой хамгаалагдсан " +"обектуудыг устгах шаардлагатай:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Та %(objects_name)s ийг устгах гэж байна итгэлтэй байна? Дараах обектууд " +"болон холбоотой зүйлс хамт устагдах болно:" + +msgid "View" +msgstr "Харах" + +msgid "Delete?" +msgstr "Устгах уу?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s -ээр" + +msgid "Summary" +msgstr "Нийт" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s хэрэглүүр дэх моделууд." + +msgid "Add" +msgstr "Нэмэх" + +msgid "You don't have permission to view or edit anything." +msgstr "Танд харах болон засах эрх алга." + +msgid "Recent actions" +msgstr "Сүүлд хийсэн үйлдлүүд" + +msgid "My actions" +msgstr "Миний үйлдлүүд" + +msgid "None available" +msgstr "Үйлдэл алга" + +msgid "Unknown content" +msgstr "Тодорхойгүй агуулга" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Өгөгдлийн сангийн ямар нэг зүйл буруу суугдсан байна. Өгөгдлийн сангийн " +"зохих хүснэгт үүсгэгдсэн эсэх, өгөгдлийн санг зохих хэрэглэгч унших " +"боломжтой байгаа эсэхийг шалгаарай." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Та %(username)s нэрээр нэвтэрсэн байна гэвч энэ хуудасхуу хандах эрх " +"байхгүй байна. Та өөр эрхээр логин хийх үү?" + +msgid "Forgotten your password or username?" +msgstr "Таны мартсан нууц үг эсвэл нэрвтэр нэр?" + +msgid "Date/time" +msgstr "Огноо/цаг" + +msgid "User" +msgstr "Хэрэглэгч" + +msgid "Action" +msgstr "Үйлдэл" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Уг объектэд өөрчлөлтийн түүх байхгүй байна. Магадгүй үүнийг уг удирдлагын " +"сайтаар дамжуулан нэмээгүй байх." + +msgid "Show all" +msgstr "Бүгдийг харуулах" + +msgid "Save" +msgstr "Хадгалах" + +msgid "Popup closing…" +msgstr "Хааж байна..." + +msgid "Search" +msgstr "Хайлт" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s үр дүн" +msgstr[1] "%(counter)s үр дүн" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "Нийт %(full_result_count)s" + +msgid "Save as new" +msgstr "Шинээр хадгалах" + +msgid "Save and add another" +msgstr "Хадгалаад өөрийг нэмэх" + +msgid "Save and continue editing" +msgstr "Хадгалаад нэмж засах" + +msgid "Save and view" +msgstr "Хадгалаад харах." + +msgid "Close" +msgstr "Хаах" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Сонгосон %(model)s-ийг өөрчлөх" + +#, python-format +msgid "Add another %(model)s" +msgstr "Өөр %(model)s нэмэх" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Сонгосон %(model)s устгах" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Манай вэб сайтыг ашигласанд баярлалаа." + +msgid "Log in again" +msgstr "Ахин нэвтрэх " + +msgid "Password change" +msgstr "Нууц үгийн өөрчлөлт" + +msgid "Your password was changed." +msgstr "Нууц үг тань өөрчлөгдлөө." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Аюулгүй байдлын үүднээс хуучин нууц үгээ оруулаад шинэ нууц үгээ хоёр удаа " +"хийнэ үү. Ингэснээр нууц үгээ зөв бичиж байгаа эсэхийг тань шалгах юм." + +msgid "Change my password" +msgstr "Нууц үгээ солих" + +msgid "Password reset" +msgstr "Нууц үг шинэчилэх" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Та нууц үгтэй боллоо. Одоо бүртгэлд нэвтрэх боломжтой." + +msgid "Password reset confirmation" +msgstr "Нууц үг шинэчилэхийг баталгаажуулах" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Шинэ нууц үгээ хоёр удаа оруулна уу. Ингэснээр нууц үгээ зөв бичиж байгаа " +"эсэхийг тань шалгах юм. " + +msgid "New password:" +msgstr "Шинэ нууц үг:" + +msgid "Confirm password:" +msgstr "Нууц үгээ батлах:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Нууц үг авах холбоос болохгүй байна. Үүнийг аль хэдийнэ хэрэглэснээс болсон " +"байж болзошгүй. Шинэ нууц үг авахаар хүсэлт гаргана уу. " + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Таны оруулсан имайл хаяг бүртгэлтэй бол таны имайл хаягруу нууц үг " +"тохируулах зааварыг удахгүй очих болно. Та удахгүй имайл хүлээж авах болно. " + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Хэрвээ та имайл хүлээж аваагүй бол оруулсан имайл хаягаараа бүртгүүлсэн " +"эсхээ шалгаад мөн имайлийнхаа Spam фолдер ийг шалгана уу." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"%(site_name)s сайтанд бүртгүүлсэн эрхийн нууц үгийг сэргээх хүсэлт гаргасан " +"учир энэ имэйл ийг та хүлээн авсан болно. " + +msgid "Please go to the following page and choose a new password:" +msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:" + +msgid "Your username, in case you've forgotten:" +msgstr "Хэрэглэгчийн нэрээ мартсан бол :" + +msgid "Thanks for using our site!" +msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s баг" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Нууц үгээ мартсан уу? Доорх хэсэгт имайл хаягаа оруулвал бид хаягаар тань " +"нууц үг сэргэх зааварчилгаа явуулах болно." + +msgid "Email address:" +msgstr "Имэйл хаяг:" + +msgid "Reset my password" +msgstr "Нууц үгээ шинэчлэх" + +msgid "All dates" +msgstr "Бүх огноо" + +#, python-format +msgid "Select %s" +msgstr "%s-г сонго" + +#, python-format +msgid "Select %s to change" +msgstr "Өөрчлөх %s-г сонгоно уу" + +#, python-format +msgid "Select %s to view" +msgstr "Харахын тулд %s сонгоно уу" + +msgid "Date:" +msgstr "Огноо:" + +msgid "Time:" +msgstr "Цаг:" + +msgid "Lookup" +msgstr "Хайх" + +msgid "Currently:" +msgstr "Одоогийнх:" + +msgid "Change:" +msgstr "Өөрчилөлт:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9f58362 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5fda297 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mn/LC_MESSAGES/djangojs.po @@ -0,0 +1,218 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Tsolmon , 2012 +# Zorig, 2014,2018 +# Анхбаяр Анхаа , 2011-2012,2015,2019 +# Ганзориг БП , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2019-02-13 09:19+0000\n" +"Last-Translator: Анхбаяр Анхаа \n" +"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Боломжтой %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Энэ %s жагсаалт нь боломжит утгын жагсаалт. Та аль нэгийг нь сонгоод \"Сонгох" +"\" дээр дарж нөгөө хэсэгт оруулах боломжтой." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Энэ нүдэнд бичээд дараах %s жагсаалтаас шүүнэ үү. " + +msgid "Filter" +msgstr "Шүүлтүүр" + +msgid "Choose all" +msgstr "Бүгдийг нь сонгох" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Бүгдийг сонгох бол %s дарна уу" + +msgid "Choose" +msgstr "Сонгох" + +msgid "Remove" +msgstr "Хас" + +#, javascript-format +msgid "Chosen %s" +msgstr "Сонгогдсон %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Энэ %s сонгогдсон утгуудыг жагсаалт. Та аль нэгийг нь хасахыг хүсвэл сонгоох " +"\"Хас\" дээр дарна уу." + +msgid "Remove all" +msgstr "Бүгдийг арилгах" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "%s ийн сонгоод бүгдийг нь арилгана" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s ээс %(cnt)s сонгосон" +msgstr[1] "%(sel)s ээс %(cnt)s сонгосон" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Хадгалаагүй өөрчлөлтүүд байна. Энэ үйлдэлийг хийвэл өөрчлөлтүүд устах болно." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Та 1 үйлдлийг сонгосон байна, гэвч та өөрийн өөрчлөлтүүдээ тодорхой " +"талбаруудад нь оруулагүй байна. OK дарж сануулна уу. Энэ үйлдлийг та дахин " +"хийх шаардлагатай." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Та 1 үйлдлийг сонгосон байна бас та ямарваа өөрчлөлт оруулсангүй. Та Save " +"товчлуур биш Go товчлуурыг хайж байгаа бололтой." + +msgid "Now" +msgstr "Одоо" + +msgid "Midnight" +msgstr "Шөнө дунд" + +msgid "6 a.m." +msgstr "06 цаг" + +msgid "Noon" +msgstr "Үд дунд" + +msgid "6 p.m." +msgstr "18 цаг" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Та серверийн цагаас %s цагийн түрүүнд явж байна" +msgstr[1] "Та серверийн цагаас %s цагийн түрүүнд явж байна" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Та серверийн цагаас %s цагаар хоцорч байна" +msgstr[1] "Та серверийн цагаас %s цагаар хоцорч байна" + +msgid "Choose a Time" +msgstr "Цаг сонгох" + +msgid "Choose a time" +msgstr "Цаг сонгох" + +msgid "Cancel" +msgstr "Болих" + +msgid "Today" +msgstr "Өнөөдөр" + +msgid "Choose a Date" +msgstr "Өдөр сонгох" + +msgid "Yesterday" +msgstr "Өчигдөр" + +msgid "Tomorrow" +msgstr "Маргааш" + +msgid "January" +msgstr "1-р сар" + +msgid "February" +msgstr "2-р сар" + +msgid "March" +msgstr "3-р сар" + +msgid "April" +msgstr "4-р сар" + +msgid "May" +msgstr "5-р сар" + +msgid "June" +msgstr "6-р сар" + +msgid "July" +msgstr "7-р сар" + +msgid "August" +msgstr "8-р сар" + +msgid "September" +msgstr "9-р сар" + +msgid "October" +msgstr "10-р сар" + +msgid "November" +msgstr "11-р сар" + +msgid "December" +msgstr "12-р сар" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Н" + +msgctxt "one letter Monday" +msgid "M" +msgstr "Д" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "М" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Л" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "П" + +msgctxt "one letter Friday" +msgid "F" +msgstr "Ба" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Бя" + +msgid "Show" +msgstr "Үзэх" + +msgid "Hide" +msgstr "Нуух" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2026d16 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/mr/LC_MESSAGES/djangojs.po @@ -0,0 +1,145 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "" + +msgid "Choose all" +msgstr "" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +msgid "Choose" +msgstr "" + +msgid "Remove" +msgstr "" + +#, javascript-format +msgid "Chosen %s" +msgstr "" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "" + +msgid "Clock" +msgstr "" + +msgid "Choose a time" +msgstr "" + +msgid "Midnight" +msgstr "" + +msgid "6 a.m." +msgstr "" + +msgid "Noon" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Today" +msgstr "" + +msgid "Calendar" +msgstr "" + +msgid "Yesterday" +msgstr "" + +msgid "Tomorrow" +msgstr "" + +msgid "" +"January February March April May June July August September October November " +"December" +msgstr "" + +msgid "S M T W T F S" +msgstr "" + +msgid "Show" +msgstr "" + +msgid "Hide" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..000b8bc Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/my/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1f73294 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..c457c3d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,711 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# jensadne , 2013-2014 +# Jon , 2015-2016 +# Jon , 2017-2019 +# Jon , 2013 +# Jon , 2011,2013 +# Sigurd Gartmann , 2012 +# Tommy Strand , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-05-06 13:01+0000\n" +"Last-Translator: Jon \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Slettet %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Kan ikke slette %(name)s" + +msgid "Are you sure?" +msgstr "Er du sikker?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Slett valgte %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Administrasjon" + +msgid "All" +msgstr "Alle" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nei" + +msgid "Unknown" +msgstr "Ukjent" + +msgid "Any date" +msgstr "Når som helst" + +msgid "Today" +msgstr "I dag" + +msgid "Past 7 days" +msgstr "Siste syv dager" + +msgid "This month" +msgstr "Denne måneden" + +msgid "This year" +msgstr "I år" + +msgid "No date" +msgstr "Ingen dato" + +msgid "Has date" +msgstr "Har dato" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Vennligst oppgi gyldig %(username)s og passord til en " +"administrasjonsbrukerkonto. Merk at det er forskjell på små og store " +"bokstaver." + +msgid "Action:" +msgstr "Handling:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Legg til ny %(verbose_name)s" + +msgid "Remove" +msgstr "Fjern" + +msgid "Addition" +msgstr "Tillegg" + +msgid "Change" +msgstr "Endre" + +msgid "Deletion" +msgstr "Sletting" + +msgid "action time" +msgstr "tid for handling" + +msgid "user" +msgstr "bruker" + +msgid "content type" +msgstr "innholdstype" + +msgid "object id" +msgstr "objekt-ID" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "objekt-repr" + +msgid "action flag" +msgstr "handlingsflagg" + +msgid "change message" +msgstr "endre melding" + +msgid "log entry" +msgstr "logginnlegg" + +msgid "log entries" +msgstr "logginnlegg" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "La til «%(object)s»." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Endret «%(object)s» - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Slettet «%(object)s»." + +msgid "LogEntry Object" +msgstr "LogEntry-objekt" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "La til {name} \"{object}\"." + +msgid "Added." +msgstr "Lagt til." + +msgid "and" +msgstr "og" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Endret {fields} for {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Endret {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Slettet {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Ingen felt endret." + +msgid "None" +msgstr "Ingen" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Hold nede «Control», eller «Command» på en Mac, for å velge mer enn en." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" ble lagt til." + +msgid "You may edit it again below." +msgstr "Du kan endre det igjen nedenfor." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" ble lagt til. Du kan legge til en ny {name} nedenfor." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" ble endret. Du kan redigere videre nedenfor." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" ble lagt til. Du kan redigere videre nedenfor." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" ble endret. Du kan legge til en ny {name} nedenfor." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" ble lagt til." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Du må velge objekter for å utføre handlinger på dem. Ingen objekter har " +"blitt endret." + +msgid "No action selected." +msgstr "Ingen handling valgt." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s «%(obj)s» ble slettet." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s med ID \"%(key)s\" eksisterer ikke. Kanskje det ble slettet?" + +#, python-format +msgid "Add %s" +msgstr "Legg til ny %s" + +#, python-format +msgid "Change %s" +msgstr "Endre %s" + +#, python-format +msgid "View %s" +msgstr "Se %s" + +msgid "Database error" +msgstr "Databasefeil" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s ble endret." +msgstr[1] "%(count)s %(name)s ble endret." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s valgt" +msgstr[1] "Alle %(total_count)s valgt" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 av %(cnt)s valgt" + +#, python-format +msgid "Change history: %s" +msgstr "Endringshistorikk: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Sletting av %(class_name)s «%(instance)s» krever sletting av følgende " +"beskyttede relaterte objekter: %(related_objects)s" + +msgid "Django site admin" +msgstr "Django administrasjonsside" + +msgid "Django administration" +msgstr "Django-administrasjon" + +msgid "Site administration" +msgstr "Nettstedsadministrasjon" + +msgid "Log in" +msgstr "Logg inn" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s-administrasjon" + +msgid "Page not found" +msgstr "Fant ikke siden" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Beklager, men siden du spør etter finnes ikke." + +msgid "Home" +msgstr "Hjem" + +msgid "Server error" +msgstr "Tjenerfeil" + +msgid "Server error (500)" +msgstr "Tjenerfeil (500)" + +msgid "Server Error (500)" +msgstr "Tjenerfeil (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-" +"post, og vil bli fikset snart. Takk for din tålmodighet." + +msgid "Run the selected action" +msgstr "Utfør den valgte handlingen" + +msgid "Go" +msgstr "Gå" + +msgid "Click here to select the objects across all pages" +msgstr "Trykk her for å velge samtlige objekter fra alle sider" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Velg alle %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Nullstill valg" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Skriv først inn brukernavn og passord. Deretter vil du få mulighet til å " +"endre flere brukerinnstillinger." + +msgid "Enter a username and password." +msgstr "Skriv inn brukernavn og passord." + +msgid "Change password" +msgstr "Endre passord" + +msgid "Please correct the error below." +msgstr "Vennligst korriger feilen under." + +msgid "Please correct the errors below." +msgstr "Vennligst korriger feilene under." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Skriv inn et nytt passord for brukeren %(username)s." + +msgid "Welcome," +msgstr "Velkommen," + +msgid "View site" +msgstr "Vis nettsted" + +msgid "Documentation" +msgstr "Dokumentasjon" + +msgid "Log out" +msgstr "Logg ut" + +#, python-format +msgid "Add %(name)s" +msgstr "Legg til ny %(name)s" + +msgid "History" +msgstr "Historikk" + +msgid "View on site" +msgstr "Vis på nettsted" + +msgid "Filter" +msgstr "Filtrering" + +msgid "Remove from sorting" +msgstr "Fjern fra sortering" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sorteringsprioritet: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Slå av og på sortering" + +msgid "Delete" +msgstr "Slett" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Om du sletter %(object_name)s «%(escaped_object)s», vil også relaterte " +"objekter slettes, men du har ikke tillatelse til å slette følgende " +"objekttyper:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Sletting av %(object_name)s «%(escaped_object)s» krever sletting av følgende " +"beskyttede relaterte objekter:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Er du sikker på at du vil slette %(object_name)s «%(escaped_object)s»? Alle " +"de følgende relaterte objektene vil bli slettet:" + +msgid "Objects" +msgstr "Objekter" + +msgid "Yes, I'm sure" +msgstr "Ja, jeg er sikker" + +msgid "No, take me back" +msgstr "Nei, ta meg tilbake" + +msgid "Delete multiple objects" +msgstr "Slett flere objekter" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Sletting av det valgte %(objects_name)s ville resultere i sletting av " +"relaterte objekter, men kontoen din har ikke tillatelse til å slette " +"følgende objekttyper:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Sletting av det valgte %(objects_name)s ville kreve sletting av følgende " +"beskyttede relaterte objekter:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Er du sikker på vil slette det valgte %(objects_name)s? De følgende " +"objektene og deres relaterte objekter vil bli slettet:" + +msgid "View" +msgstr "Se" + +msgid "Delete?" +msgstr "Slette?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Etter %(filter_title)s " + +msgid "Summary" +msgstr "Oppsummering" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i %(name)s-applikasjonen" + +msgid "Add" +msgstr "Legg til" + +msgid "You don't have permission to view or edit anything." +msgstr "Du har ikke tillatelse til å vise eller endre noe." + +msgid "Recent actions" +msgstr "Siste handlinger" + +msgid "My actions" +msgstr "Mine handlinger" + +msgid "None available" +msgstr "Ingen tilgjengelige" + +msgid "Unknown content" +msgstr "Ukjent innhold" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Noe er galt med databaseinstallasjonen din. Sørg for at databasetabellene er " +"opprettet og at brukeren har de nødvendige rettighetene." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Du er logget inn som %(username)s, men er ikke autorisert til å få tilgang " +"til denne siden. Ønsker du å logge inn med en annen konto?" + +msgid "Forgotten your password or username?" +msgstr "Glemt brukernavnet eller passordet ditt?" + +msgid "Date/time" +msgstr "Dato/tid" + +msgid "User" +msgstr "Bruker" + +msgid "Action" +msgstr "Handling" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Dette objektet har ingen endringshistorikk. Det ble sannsynligvis ikke lagt " +"til på denne administrasjonssiden." + +msgid "Show all" +msgstr "Vis alle" + +msgid "Save" +msgstr "Lagre" + +msgid "Popup closing…" +msgstr "Lukker popup..." + +msgid "Search" +msgstr "Søk" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s resultat" +msgstr[1] "%(counter)s resultater" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s totalt" + +msgid "Save as new" +msgstr "Lagre som ny" + +msgid "Save and add another" +msgstr "Lagre og legg til ny" + +msgid "Save and continue editing" +msgstr "Lagre og fortsett å redigere" + +msgid "Save and view" +msgstr "Lagre og se" + +msgid "Close" +msgstr "Lukk" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Endre valgt %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Legg til ny %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Slett valgte %(model)s" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Takk for i dag." + +msgid "Log in again" +msgstr "Logg inn igjen" + +msgid "Password change" +msgstr "Endre passord" + +msgid "Your password was changed." +msgstr "Ditt passord ble endret." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Av sikkerhetsgrunner må du oppgi ditt gamle passord. Deretter oppgir du det " +"nye passordet ditt to ganger, slik at vi kan kontrollere at det er korrekt." + +msgid "Change my password" +msgstr "Endre passord" + +msgid "Password reset" +msgstr "Nullstill passord" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Passordet ditt er satt. Du kan nå logge inn." + +msgid "Password reset confirmation" +msgstr "Bekreftelse på nullstilt passord" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Oppgi det nye passordet to ganger, for å sikre at det er skrevet korrekt." + +msgid "New password:" +msgstr "Nytt passord:" + +msgid "Confirm password:" +msgstr "Gjenta nytt passord:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Nullstillingslenken er ugyldig, kanskje fordi den allerede har vært brukt. " +"Vennligst nullstill passordet ditt på nytt." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Vi har sendt deg en e-post med instruksjoner for nullstilling av passord, " +"hvis en konto finnes på den e-postadressen du oppga. Du bør motta den om " +"kort tid." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Hvis du ikke mottar en epost, sjekk igjen at du har oppgitt den adressen du " +"er registrert med og sjekk ditt spam filter." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Du mottar denne e-posten fordi du har bedt om nullstilling av passordet ditt " +"på %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Vennligst gå til følgende side og velg et nytt passord:" + +msgid "Your username, in case you've forgotten:" +msgstr "Brukernavnet ditt, i tilfelle du har glemt det:" + +msgid "Thanks for using our site!" +msgstr "Takk for at du bruker siden vår!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Hilsen %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Glemt passordet ditt? Oppgi e-postadressen din under, så sender vi deg en e-" +"post med instruksjoner for nullstilling av passord." + +msgid "Email address:" +msgstr "E-postadresse:" + +msgid "Reset my password" +msgstr "Nullstill mitt passord" + +msgid "All dates" +msgstr "Alle datoer" + +#, python-format +msgid "Select %s" +msgstr "Velg %s" + +#, python-format +msgid "Select %s to change" +msgstr "Velg %s du ønsker å endre" + +#, python-format +msgid "Select %s to view" +msgstr "Velg %s å se" + +msgid "Date:" +msgstr "Dato:" + +msgid "Time:" +msgstr "Tid:" + +msgid "Lookup" +msgstr "Oppslag" + +msgid "Currently:" +msgstr "Nåværende:" + +msgid "Change:" +msgstr "Endre:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..5f34eb3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..7588b48 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Eirik Krogstad , 2014 +# Jannis Leidel , 2011 +# Jon , 2015-2016 +# Jon , 2014 +# Jon , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jon \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Tilgjengelige %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Dette er listen over tilgjengelige %s. Du kan velge noen ved å markere de i " +"boksen under og så klikke på \"Velg\"-pilen mellom de to boksene." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Skriv i dette feltet for å filtrere ned listen av tilgjengelige %s." + +msgid "Filter" +msgstr "Filter" + +msgid "Choose all" +msgstr "Velg alle" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikk for å velge alle %s samtidig" + +msgid "Choose" +msgstr "Velg" + +msgid "Remove" +msgstr "Slett" + +#, javascript-format +msgid "Chosen %s" +msgstr "Valgte %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Dette er listen over valgte %s. Du kan fjerne noen ved å markere de i boksen " +"under og så klikke på \"Fjern\"-pilen mellom de to boksene." + +msgid "Remove all" +msgstr "Fjern alle" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikk for å fjerne alle valgte %s samtidig" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s av %(cnt)s valgt" +msgstr[1] "%(sel)s av %(cnt)s valgt" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Du har ulagrede endringer i individuelle felter. Hvis du utfører en " +"handling, vil dine ulagrede endringer gå tapt." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Du har valgt en handling, men du har ikke lagret dine endringer i " +"individuelle felter enda. Vennligst trykk OK for å lagre. Du må utføre " +"handlingen på nytt." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Du har valgt en handling, og har ikke gjort noen endringer i individuelle " +"felter. Du ser mest sannsynlig etter Gå-knappen, ikke Lagre-knappen." + +msgid "Now" +msgstr "Nå" + +msgid "Midnight" +msgstr "Midnatt" + +msgid "6 a.m." +msgstr "06:00" + +msgid "Noon" +msgstr "12:00" + +msgid "6 p.m." +msgstr "18:00" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Merk: Du er %s time foran server-tid." +msgstr[1] "Merk: Du er %s timer foran server-tid." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Merk: Du er %s time bak server-tid." +msgstr[1] "Merk: Du er %s timer bak server-tid." + +msgid "Choose a Time" +msgstr "Velg et klokkeslett" + +msgid "Choose a time" +msgstr "Velg et klokkeslett" + +msgid "Cancel" +msgstr "Avbryt" + +msgid "Today" +msgstr "I dag" + +msgid "Choose a Date" +msgstr "Velg en dato" + +msgid "Yesterday" +msgstr "I går" + +msgid "Tomorrow" +msgstr "I morgen" + +msgid "January" +msgstr "Januar" + +msgid "February" +msgstr "Februar" + +msgid "March" +msgstr "Mars" + +msgid "April" +msgstr "April" + +msgid "May" +msgstr "Mai" + +msgid "June" +msgstr "Juni" + +msgid "July" +msgstr "Juli" + +msgid "August" +msgstr "August" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "Oktober" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "Desember" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "S" + +msgctxt "one letter Monday" +msgid "M" +msgstr "M" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "T" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "O" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "T" + +msgctxt "one letter Friday" +msgid "F" +msgstr "F" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "L" + +msgid "Show" +msgstr "Vis" + +msgid "Hide" +msgstr "Skjul" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..c7e4294 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,645 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Sagar Chalise , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-10-07 02:46+0000\n" +"Last-Translator: Sagar Chalise \n" +"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "सफलतापूर्वक मेटियो %(count)d %(items)s ।" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s मेट्न सकिएन " + +msgid "Are you sure?" +msgstr "के तपाई पक्का हुनुहुन्छ ?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस" + +msgid "Administration" +msgstr "प्रशासन " + +msgid "All" +msgstr "सबै" + +msgid "Yes" +msgstr "हो" + +msgid "No" +msgstr "होइन" + +msgid "Unknown" +msgstr "अज्ञात" + +msgid "Any date" +msgstr "कुनै मिति" + +msgid "Today" +msgstr "आज" + +msgid "Past 7 days" +msgstr "पूर्व ७ दिन" + +msgid "This month" +msgstr "यो महिना" + +msgid "This year" +msgstr "यो साल" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"कृपया स्टाफ खाताको लागि सही %(username)s र पासवर्ड राख्नु होस । दुवै खाली ठाउँ केस " +"सेन्सिटिव हुन सक्छन् ।" + +msgid "Action:" +msgstr "कार्य:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "अर्को %(verbose_name)s थप्नुहोस ।" + +msgid "Remove" +msgstr "हटाउनुहोस" + +msgid "action time" +msgstr "कार्य समय" + +msgid "user" +msgstr "प्रयोग कर्ता" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "वस्तु परिचय" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "" + +msgid "action flag" +msgstr "एक्सन फ्ल्याग" + +msgid "change message" +msgstr "सन्देश परिवर्तन गर्नुहोस" + +msgid "log entry" +msgstr "लग" + +msgid "log entries" +msgstr "लगहरु" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr " \"%(object)s\" थपिएको छ ।" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" - %(changes)s फेरियो ।" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" मेटिएको छ ।" + +msgid "LogEntry Object" +msgstr "लग ईन्ट्री वस्तु" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "थपिएको छ ।" + +msgid "and" +msgstr "र" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "कुनै फाँट फेरिएन ।" + +msgid "None" +msgstr "शुन्य" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "कार्य गर्नका निम्ति वस्तु छान्नु पर्दछ । कुनैपनि छस्तु छानिएको छैन । " + +msgid "No action selected." +msgstr "कार्य छानिएको छैन ।" + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" सफलतापूर्वक मेटियो । " + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "%s थप्नुहोस" + +#, python-format +msgid "Change %s" +msgstr "%s परिवर्तित ।" + +msgid "Database error" +msgstr "डाटाबेस त्रुटि" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s सफलतापूर्वक परिवर्तन भयो ।" +msgstr[1] "%(count)s %(name)sहरु सफलतापूर्वक परिवर्तन भयो ।" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s चयन भयो" +msgstr[1] "सबै %(total_count)s चयन भयो" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s को ० चयन गरियो" + +#, python-format +msgid "Change history: %s" +msgstr "इतिहास फेर्नुहोस : %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "ज्याङ्गो साइट प्रशासन" + +msgid "Django administration" +msgstr "ज्याङ्गो प्रशासन" + +msgid "Site administration" +msgstr "साइट प्रशासन" + +msgid "Log in" +msgstr "लगिन" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "पृष्ठ भेटिएन" + +msgid "We're sorry, but the requested page could not be found." +msgstr "क्षमापार्थी छौं तर अनुरोध गरिएको पृष्ठ भेटिएन ।" + +msgid "Home" +msgstr "गृह" + +msgid "Server error" +msgstr "सर्भर त्रुटि" + +msgid "Server error (500)" +msgstr "सर्भर त्रुटि (५००)" + +msgid "Server Error (500)" +msgstr "सर्भर त्रुटि (५००)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"त्रुटी भयो । साइट प्रशासकलाई ई-मेलबाट खबर गरिएको छ र चाँडै समाधान हुनेछ । धैर्यताको " +"लागि धन्यवाद ।" + +msgid "Run the selected action" +msgstr "छानिएको कार्य गर्नुहोस ।" + +msgid "Go" +msgstr "बढ्नुहोस" + +msgid "Click here to select the objects across all pages" +msgstr "सबै पृष्ठभरमा वस्तु छान्न यहाँ थिच्नुहोस ।" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "%(total_count)s %(module_name)s सबै छान्नुहोस " + +msgid "Clear selection" +msgstr "चुनेको कुरा हटाउनुहोस ।" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"सर्वप्रथम प्रयोगकर्ता नाम र पासवर्ड हाल्नुहोस । अनिपछि तपाइ प्रयोगकर्ताका विकल्पहरु " +"संपादन गर्न सक्नुहुनेछ ।" + +msgid "Enter a username and password." +msgstr "प्रयोगकर्ता नाम र पासवर्ड राख्नुहोस।" + +msgid "Change password" +msgstr "पासवर्ड फेर्नुहोस " + +msgid "Please correct the error below." +msgstr "कृपया तलका त्रुटिहरु सच्याउनुहोस ।" + +msgid "Please correct the errors below." +msgstr "कृपया तलका त्रुटी सुधार्नु होस ।" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "प्रयोगकर्ता %(username)s को लागि नयाँ पासवर्ड राख्नुहोस ।" + +msgid "Welcome," +msgstr "स्वागतम्" + +msgid "View site" +msgstr "साइट हेर्नु होस ।" + +msgid "Documentation" +msgstr "विस्तृत विवरण" + +msgid "Log out" +msgstr "लग आउट" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s थप्नुहोस" + +msgid "History" +msgstr "इतिहास" + +msgid "View on site" +msgstr "साइटमा हेर्नुहोस" + +msgid "Filter" +msgstr "छान्नुहोस" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "" + +msgid "Delete" +msgstr "मेट्नुहोस" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "हुन्छ, म पक्का छु ।" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "वहु वस्तुहरु मेट्नुहोस ।" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "%(objects_name)s " + +msgid "Change" +msgstr "फेर्नुहोस" + +msgid "Delete?" +msgstr "मेट्नुहुन्छ ?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s द्वारा" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु" + +msgid "Add" +msgstr "थप्नुहोस " + +msgid "You don't have permission to edit anything." +msgstr "तपाइलाई केही पनि संपादन गर्ने अनुमति छैन ।" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "कुनै पनि उपलब्ध छैन ।" + +msgid "Unknown content" +msgstr "अज्ञात सामग्री" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"डाटाबेस स्थापनामा केही त्रुटी छ । सम्वद्ध टेबल बनाएको र प्रयोगकर्तालाई डाटाबेसमा अनुमति " +"भएको छ छैन जाच्नुहोस ।" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "पासवर्ड अथवा प्रयोगकर्ता नाम भुल्नुभयो ।" + +msgid "Date/time" +msgstr "मिति/समय" + +msgid "User" +msgstr "प्रयोगकर्ता" + +msgid "Action" +msgstr "कार्य:" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "यो अब्जेक्टको पुर्व परिवर्तन छैन । यो यस " + +msgid "Show all" +msgstr "सबै देखाउनुहोस" + +msgid "Save" +msgstr "बचत गर्नुहोस" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "खोज्नुहोस" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s नतिजा" +msgstr[1] "%(counter)s नतिजाहरु" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "जम्मा %(full_result_count)s" + +msgid "Save as new" +msgstr "नयाँ रुपमा बचत गर्नुहोस" + +msgid "Save and add another" +msgstr "बचत गरेर अर्को थप्नुहोस" + +msgid "Save and continue editing" +msgstr "बचत गरेर संशोधन जारी राख्नुहोस" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "वेब साइटमा समय बिताउनु भएकोमा धन्यवाद ।" + +msgid "Log in again" +msgstr "पुन: लगिन गर्नुहोस" + +msgid "Password change" +msgstr "पासवर्ड फेरबदल" + +msgid "Your password was changed." +msgstr "तपाइको पासवर्ड फेरिएको छ ।" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"सुरक्षाको निम्ति आफ्नो पुरानो पासवर्ड राख्नुहोस र कृपया दोहर्याएर आफ्नो नयाँ पासवर्ड " +"राख्नुहोस ताकी प्रमाणीकरण होस । " + +msgid "Change my password" +msgstr "मेरो पासवर्ड फेर्नुहोस " + +msgid "Password reset" +msgstr "पासवर्डपून: राख्नुहोस । " + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "तपाइको पासवर्ड राखियो । कृपया लगिन गर्नुहोस ।" + +msgid "Password reset confirmation" +msgstr "पासवर्ड पुनर्स्थापना पुष्टि" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "ठीक तरिकाले राखिएको पुष्टि गर्न कृपया नयाँ पासवर्ड दोहोर्याएर राख्नुहोस ।" + +msgid "New password:" +msgstr "नयाँ पासवर्ड :" + +msgid "Confirm password:" +msgstr "पासवर्ड पुष्टि:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "पासवर्ड पुनर्स्थापना प्रयोग भइसकेको छ । कृपया नयाँ पासवर्ड रिसेट माग्नुहोस ।" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"ई-मेल नपाइए मा कृपया ई-मेल ठेगाना सही राखेको नराखेको जाँच गर्नु होला र साथै आफ्नो ई-" +"मेलको स्प्याम पनि जाँच गर्नु होला ।" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +" %(site_name)s को लागि तपाइले पासवर्ड पुन: राख्न आग्रह गरेको हुनाले ई-मेल पाउनुहुदैंछ । " + +msgid "Please go to the following page and choose a new password:" +msgstr "कृपया उक्त पृष्ठमा जानुहोस र नयाँ पासवर्ड राख्नुहोस :" + +msgid "Your username, in case you've forgotten:" +msgstr "तपाइको प्रयोगकर्ता नाम, बिर्सनुभएको भए :" + +msgid "Thanks for using our site!" +msgstr "हाम्रो साइट प्रयोग गरेकोमा धन्यवाद" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s टोली" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"पासवर्ड बिर्सनु भयो ? तल ई-मेल दिनु होस र हामी नयाँ पासवर्ड हाल्ने प्रकृया पठाइ दिनेछौँ ।" + +msgid "Email address:" +msgstr "ई-मेल ठेगाना :" + +msgid "Reset my password" +msgstr "मेरो पासवर्ड पुन: राख्नुहोस ।" + +msgid "All dates" +msgstr "सबै मिति" + +#, python-format +msgid "Select %s" +msgstr "%s छान्नुहोस" + +#, python-format +msgid "Select %s to change" +msgstr "%s परिवर्तन गर्न छान्नुहोस ।" + +msgid "Date:" +msgstr "मिति:" + +msgid "Time:" +msgstr "समय:" + +msgid "Lookup" +msgstr "खोज तलास" + +msgid "Currently:" +msgstr "अहिले :" + +msgid "Change:" +msgstr "फेर्नु होस :" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..8208857 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ne/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..348bbbc Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..f89838c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po @@ -0,0 +1,226 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bouke Haarsma , 2013 +# Evelijn Saaltink , 2016 +# Harro van der Klauw , 2012 +# Ilja Maas , 2015 +# Jannis Leidel , 2011 +# Jeffrey Gelens , 2011-2012 +# Sander Steffann , 2015 +# Tonnes , 2019 +# wunki , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2019-02-24 20:42+0000\n" +"Last-Translator: Tonnes \n" +"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Beschikbare %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Dit is de lijst met beschikbare %s. U kunt er een aantal kiezen door ze in " +"het vak hieronder te selecteren en daarna op de pijl 'Kiezen' tussen de twee " +"vakken te klikken." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Typ in dit vak om de lijst met beschikbare %s te filteren." + +msgid "Filter" +msgstr "Filter" + +msgid "Choose all" +msgstr "Alle kiezen" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klik om alle %s te kiezen." + +msgid "Choose" +msgstr "Kiezen" + +msgid "Remove" +msgstr "Verwijderen" + +#, javascript-format +msgid "Chosen %s" +msgstr "Gekozen %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Dit is de lijst met gekozen %s. U kunt er een aantal verwijderen door ze in " +"het vak hieronder te selecteren en daarna op de pijl 'Verwijderen' tussen de " +"twee vakken te klikken." + +msgid "Remove all" +msgstr "Verwijder alles" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik om alle gekozen %s tegelijk te verwijderen." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s van de %(cnt)s geselecteerd" +msgstr[1] "%(sel)s van de %(cnt)s geselecteerd" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"U hebt niet-opgeslagen wijzigingen op afzonderlijke bewerkbare velden. Als u " +"een actie uitvoert, gaan uw wijzigingen verloren." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"U hebt een actie geselecteerd, maar uw wijzigingen in afzonderlijke velden " +"nog niet opgeslagen. Klik op OK om op te slaan. U dient de actie opnieuw uit " +"te voeren." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"U hebt een actie geselecteerd, en geen wijzigingen in afzonderlijke velden " +"aangebracht. Waarschijnlijk zoekt u de knop Gaan in plaats van de knop " +"Opslaan." + +msgid "Now" +msgstr "Nu" + +msgid "Midnight" +msgstr "Middernacht" + +msgid "6 a.m." +msgstr "6 uur 's ochtends" + +msgid "Noon" +msgstr "12 uur 's middags" + +msgid "6 p.m." +msgstr "6 uur 's avonds" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Let op: u ligt %s uur voor ten opzichte van de servertijd." +msgstr[1] "Let op: u ligt %s uur voor ten opzichte van de servertijd." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Let op: u ligt %s uur achter ten opzichte van de servertijd." +msgstr[1] "Let op: u ligt %s uur achter ten opzichte van de servertijd." + +msgid "Choose a Time" +msgstr "Kies een tijdstip" + +msgid "Choose a time" +msgstr "Kies een tijd" + +msgid "Cancel" +msgstr "Annuleren" + +msgid "Today" +msgstr "Vandaag" + +msgid "Choose a Date" +msgstr "Kies een datum" + +msgid "Yesterday" +msgstr "Gisteren" + +msgid "Tomorrow" +msgstr "Morgen" + +msgid "January" +msgstr "januari" + +msgid "February" +msgstr "februari" + +msgid "March" +msgstr "maart" + +msgid "April" +msgstr "april" + +msgid "May" +msgstr "mei" + +msgid "June" +msgstr "juni" + +msgid "July" +msgstr "juli" + +msgid "August" +msgstr "augustus" + +msgid "September" +msgstr "september" + +msgid "October" +msgstr "oktober" + +msgid "November" +msgstr "november" + +msgid "December" +msgstr "december" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "S" + +msgctxt "one letter Monday" +msgid "M" +msgstr "M" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "T" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "W" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "T" + +msgctxt "one letter Friday" +msgid "F" +msgstr "F" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Tonen" + +msgid "Hide" +msgstr "Verbergen" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dbf509f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..aae9d9c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,665 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s хафт ӕрцыдысты." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Нӕ уайы схафын %(name)s" + +msgid "Are you sure?" +msgstr "Ӕцӕг дӕ фӕнды?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Схафын ӕвзӕрст %(verbose_name_plural)s" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Иууылдӕр" + +msgid "Yes" +msgstr "О" + +msgid "No" +msgstr "Нӕ" + +msgid "Unknown" +msgstr "Ӕнӕбӕрӕг" + +msgid "Any date" +msgstr "Цыфӕнды бон" + +msgid "Today" +msgstr "Абон" + +msgid "Past 7 days" +msgstr "Фӕстаг 7 бон" + +msgid "This month" +msgstr "Ацы мӕй" + +msgid "This year" +msgstr "Ацы аз" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Дӕ хорзӕхӕй, раст кусӕджы аккаунты %(username)s ӕмӕ пароль бафысс. Дӕ сӕры " +"дар уый, ӕмӕ дыууӕ дӕр гӕнӕн ис стыр ӕмӕ гыццыл дамгъӕ ӕвзарой." + +msgid "Action:" +msgstr "Ми:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Бафтауын ӕндӕр %(verbose_name)s" + +msgid "Remove" +msgstr "Схафын" + +msgid "action time" +msgstr "мийы рӕстӕг" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "объекты бӕрӕггӕнӕн" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "объекты хуыз" + +msgid "action flag" +msgstr "мийы флаг" + +msgid "change message" +msgstr "фыстӕг фӕивын" + +msgid "log entry" +msgstr "логы иуӕг" + +msgid "log entries" +msgstr "логы иуӕгтӕ" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Ӕфтыд ӕрцыд \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Ивд ӕрцыд \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Хафт ӕрцыд \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "ЛогыИуӕг Объект" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "ӕмӕ" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Ивд бынат нӕй." + +msgid "None" +msgstr "Никӕцы" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Иуӕгтӕ хъуамӕ ӕвзӕрст уой, цӕмӕй цын исты ми бакӕнай. Ницы иуӕг ӕрцыд ивд." + +msgid "No action selected." +msgstr "Ницы ми у ӕвзӕрст." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" хафт ӕрцыд." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Бафтауын %s" + +#, python-format +msgid "Change %s" +msgstr "Фӕивын %s" + +msgid "Database error" +msgstr "Бӕрӕгдоны рӕдыд" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s ивд ӕрцыд." +msgstr[1] "%(count)s %(name)s ивд ӕрцыдысты." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s у ӕвзӕрст" +msgstr[1] "%(total_count)s дӕр иууылдӕр сты ӕвзӕрст" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s-ӕй 0 у ӕвзӕрст" + +#, python-format +msgid "Change history: %s" +msgstr "Ивынты истори: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django сайты админ" + +msgid "Django administration" +msgstr "Django администраци" + +msgid "Site administration" +msgstr "Сайты администраци" + +msgid "Log in" +msgstr "Бахизын" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Фарс нӕ зыны" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Хатыр, фӕлӕ домд фарс нӕ зыны." + +msgid "Home" +msgstr "Хӕдзар" + +msgid "Server error" +msgstr "Серверы рӕдыд" + +msgid "Server error (500)" +msgstr "Серверы рӕдыд (500)" + +msgid "Server Error (500)" +msgstr "Серверы Рӕдыд (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Рӕдыд разынд. Уый тыххӕй сайты администратормӕ электрон фыстӕг ӕрвыст ӕрцыд " +"ӕмӕ йӕ тагъд сраст кӕндзысты. Бузныг кӕй лӕууыс." + +msgid "Run the selected action" +msgstr "Бакӕнын ӕвзӕрст ми" + +msgid "Go" +msgstr "Бацӕуын" + +msgid "Click here to select the objects across all pages" +msgstr "Ам ныххӕц цӕмӕй алы фарсы объекттӕ равзарын" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Равзарын %(total_count)s %(module_name)s иууылдӕр" + +msgid "Clear selection" +msgstr "Ӕвзӕрст асыгъдӕг кӕнын" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Фыццаг бафысс фӕсномыг ӕмӕ пароль. Стӕй дӕ бон уыдзӕн фылдӕр архайӕджы " +"фадӕттӕ ивын." + +msgid "Enter a username and password." +msgstr "Бафысс фӕсномыг ӕмӕ пароль." + +msgid "Change password" +msgstr "Пароль фӕивын" + +msgid "Please correct the error below." +msgstr "Дӕ хорзӕхӕй, бындӕр цы рӕдыдтытӕ ис, уыдон сраст кӕн." + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Бафысс ног пароль архайӕг %(username)s-ӕн." + +msgid "Welcome," +msgstr "Ӕгас цу," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Документаци" + +msgid "Log out" +msgstr "Рахизын" + +#, python-format +msgid "Add %(name)s" +msgstr "Бафтауын %(name)s" + +msgid "History" +msgstr "Истори" + +msgid "View on site" +msgstr "Сайты фенын" + +msgid "Filter" +msgstr "Фӕрсудзӕн" + +msgid "Remove from sorting" +msgstr "Радӕй айсын" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Рады приоритет: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Рад аивын" + +msgid "Delete" +msgstr "Схафын" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' хафыны тыххӕй баст объекттӕ дӕр хафт " +"ӕрцӕудзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' хафын домы ацы хъахъхъӕд баст объекттӕ " +"хафын дӕр:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Ӕцӕг дӕ фӕнды %(object_name)s \"%(escaped_object)s\" схафын? Ацы баст иуӕгтӕ " +"иууылдӕр хафт ӕрцӕудзысты:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "О, ӕцӕг мӕ фӕнды" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Цалдӕр объекты схафын" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Ӕвзӕрст %(objects_name)s хафыны тыххӕй йемӕ баст объекттӕ дӕр схафт " +"уыдзысты, фӕлӕ дӕ аккаунтӕн нӕй бар ацы объекты хуызтӕ хафын:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Ӕвзӕрст %(objects_name)s хафын домы ацы хъахъхъӕд баст объекттӕ хафын дӕр:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Ӕцӕг дӕ фӕнды ӕвзӕрст %(objects_name)s схафын? ацы объекттӕ иууылдӕр, ӕмӕ " +"семӕ баст иуӕгтӕ хафт ӕрцӕудзысты:" + +msgid "Change" +msgstr "Фӕивын" + +msgid "Delete?" +msgstr "Хъӕуы схафын?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s-мӕ гӕсгӕ" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Моделтӕ %(name)s ӕфтуаны" + +msgid "Add" +msgstr "Бафтауын" + +msgid "You don't have permission to edit anything." +msgstr "Нӕй дын бар исты ивын." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Ницы ис" + +msgid "Unknown content" +msgstr "Ӕнӕбӕрӕг мидис" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Дӕ бӕрӕгдоны цыдӕр раст ӕвӕрд нӕу. Сбӕрӕг кӕн, хъӕугӕ бӕрӕгдоны таблицӕтӕ " +"конд кӕй сты ӕмӕ амынд архайӕгӕн бӕрӕгдон фӕрсыны бар кӕй ис, уый." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Дӕ пароль кӕнӕ дӕ фӕсномыг ферох кодтай?" + +msgid "Date/time" +msgstr "Бон/рӕстӕг" + +msgid "User" +msgstr "Архайӕг" + +msgid "Action" +msgstr "Ми" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "Ацы объектӕн ивдтыты истори нӕй. Уӕццӕгӕн ацы админӕй ӕфтыд нӕ уыд." + +msgid "Show all" +msgstr "Иууылдӕр равдисын" + +msgid "Save" +msgstr "Нывӕрын" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Агурын" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s фӕстиуӕг" +msgstr[1] "%(counter)s фӕстиуӕджы" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s иумӕ" + +msgid "Save as new" +msgstr "Нывӕрын куыд ног" + +msgid "Save and add another" +msgstr "Нывӕрын ӕмӕ ног бафтауын" + +msgid "Save and continue editing" +msgstr "Нывӕрын ӕмӕ дарддӕр ивын" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Бузныг дӕ рӕстӕг абон ацы веб сайтимӕ кӕй арвыстай." + +msgid "Log in again" +msgstr "Ногӕй бахизын" + +msgid "Password change" +msgstr "Пароль ивын" + +msgid "Your password was changed." +msgstr "Дӕ пароль ивд ӕрцыд." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Дӕ хорзӕхӕй, ӕдасдзинады тыххӕй, бафысс дӕ зӕронд пароль ӕмӕ стӕй та дыууӕ " +"хатт дӕ нӕуӕг пароль, цӕмӕй мах сбӕлвырд кӕнӕм раст ӕй кӕй ныффыстай, уый." + +msgid "Change my password" +msgstr "Мӕ пароль фӕивын" + +msgid "Password reset" +msgstr "Пароль рацаразын" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Дӕ пароль ӕвӕрд ӕрцыд. Дӕ бон у дарддӕр ацӕуын ӕмӕ бахизын." + +msgid "Password reset confirmation" +msgstr "Пароль ӕвӕрыны бӕлвырдгӕнӕн" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Дӕ хорзӕхӕй, дӕ ног пароль дыууӕ хатт бафысс, цӕмӕй мах сбӕрӕг кӕнӕм раст ӕй " +"кӕй ныффыстай, уый." + +msgid "New password:" +msgstr "Ног пароль:" + +msgid "Confirm password:" +msgstr "Бӕлвырд пароль:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Парол ӕвӕрыны ӕрвитӕн раст нӕ уыд. Уӕццӕгӕн уый тыххӕй, ӕмӕ нырид пайдагонд " +"ӕрцыд. Дӕ хорзӕхӕй, ӕрдом ног пароль ӕвӕрын." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Кӕд ницы фыстӕг райстай, уӕд, дӕ хорзӕхӕй, сбӕрӕг кӕн цы электрон постимӕ " +"срегистраци кодтай, уый бацамыдтай, ӕви нӕ, ӕмӕ абӕрӕг кӕн дӕ спамтӕ." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Ды райстай ацы фыстӕг, уымӕн ӕмӕ %(site_name)s-ы дӕ архайӕджы аккаунтӕн " +"пароль сӕвӕрын ӕрдомдтай." + +msgid "Please go to the following page and choose a new password:" +msgstr "Дӕ хорзӕхӕй, ацу ацы фарсмӕ ӕмӕ равзар дӕ ног пароль:" + +msgid "Your username, in case you've forgotten:" +msgstr "Дӕ фӕсномыг, кӕд дӕ ферох ис:" + +msgid "Thanks for using our site!" +msgstr "Бузныг нӕ сайтӕй нын кӕй пайда кӕныс!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s-ы бал" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Ферох дӕ ис дӕ пароль? Дӕ пароль бындӕр бафысс, ӕмӕ дӕм мах email-ӕй ног " +"пароль сывӕрыны амынд арвитдзыстӕм." + +msgid "Email address:" +msgstr "Email адрис:" + +msgid "Reset my password" +msgstr "Мӕ пароль ногӕй сӕвӕрын" + +msgid "All dates" +msgstr "Бонтӕ иууылдӕр" + +#, python-format +msgid "Select %s" +msgstr "Равзарын %s" + +#, python-format +msgid "Select %s to change" +msgstr "Равзарын %s ивынӕн" + +msgid "Date:" +msgstr "Бон:" + +msgid "Time:" +msgstr "Рӕстӕг:" + +msgid "Lookup" +msgstr "Акӕсын" + +msgid "Currently:" +msgstr "Нырыккон:" + +msgid "Change:" +msgstr "Ивд:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7af0f79 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ec6c9c4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/os/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Уӕвӕг %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Уӕвӕг %s-ты номхыгъд. Дӕ бон у искӕцытӕ дзы рауӕлдай кӕнай, куы сӕ равзарай " +"бындӕр къӕртты ӕмӕ дыууӕ къӕртты ӕхсӕн \"Равзарын\"-ы ӕгънӕгыл куы ныххӕцай, " +"уӕд." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Бафысс ацы къӕртты, уӕвӕг %s-ты номхыгъд фӕрсудзынӕн." + +msgid "Filter" +msgstr "Фӕрсудзӕн" + +msgid "Choose all" +msgstr "Равзарын алкӕцыдӕр" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Ныххӕц, алы %s равзарынӕн." + +msgid "Choose" +msgstr "Равзарын" + +msgid "Remove" +msgstr "Схафын" + +#, javascript-format +msgid "Chosen %s" +msgstr "Ӕвзӕрст %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Ай у ӕвзӕрст %s-ты номхыгъд. Сӕ хафынӕн сӕ дӕ бон у бындӕр къӕртты равзарын " +"ӕмӕ дыууӕ ӕгънӕджы ӕхсӕн \"Схфын\"-ыл ныххӕцын." + +msgid "Remove all" +msgstr "Схафын алкӕцыдӕр" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Ныххӕц, алы ӕвзӕрст %s схафынӕн." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" +msgstr[1] "%(cnt)s-ӕй %(sel)s ӕвзӕрст" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Ӕнӕвӕрд ивдтытӕ баззадысты ивыны бынӕтты. Кӕд исты ми саразай, уӕд дӕ " +"ӕнӕвӕрд ивдтытӕ фесӕфдзысты." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Ды равзӕрстай цыдӕр ми, фӕлӕ ивӕн бынӕтты цы фӕивтай, уыдон нӕ бавӕрдтай. Дӕ " +"хорзӕхӕй, ныххӕц Хорзыл цӕмӕй бавӕрд уой. Стӕй дын хъӕудзӕн ацы ми ногӕй " +"бакӕнын." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Ды равзӕртай цыдӕр ми, фӕлӕ ивӕн бынӕтты ницы баивтай. Уӕццӕгӕн дӕ Ацӕуыны " +"ӕгънӕг хъӕуы, Бавӕрыны нӕ фӕлӕ." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "Ныр" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Рӕстӕг равзарын" + +msgid "Midnight" +msgstr "Ӕмбисӕхсӕв" + +msgid "6 a.m." +msgstr "6 ӕ.р." + +msgid "Noon" +msgstr "Ӕмбисбон" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Раздӕхын" + +msgid "Today" +msgstr "Абон" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Знон" + +msgid "Tomorrow" +msgstr "Сом" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Равдисын" + +msgid "Hide" +msgstr "Айсын" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..2a36046 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po @@ -0,0 +1,205 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" +"language/pa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pa\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "ਉਪਲੱਬਧ %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "ਫਿਲਟਰ" + +msgid "Choose all" +msgstr "ਸਭ ਚੁਣੋ" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +msgid "Choose" +msgstr "" + +msgid "Remove" +msgstr "ਹਟਾਓ" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s ਚੁਣੋ" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +msgid "Now" +msgstr "ਹੁਣੇ" + +msgid "Midnight" +msgstr "ਅੱਧੀ-ਰਾਤ" + +msgid "6 a.m." +msgstr "6 ਸਵੇਰ" + +msgid "Noon" +msgstr "ਦੁਪਹਿਰ" + +msgid "6 p.m." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "ਸਮਾਂ ਚੁਣੋ" + +msgid "Cancel" +msgstr "ਰੱਦ ਕਰੋ" + +msgid "Today" +msgstr "ਅੱਜ" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "ਕੱਲ੍ਹ" + +msgid "Tomorrow" +msgstr "ਭਲਕੇ" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "ਵੇਖੋ" + +msgid "Hide" +msgstr "ਓਹਲੇ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c27a1cb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1737994 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Nuno Mariz , 2011-2012,2015,2017 +# Paulo Köch , 2011 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-11-30 23:49+0000\n" +"Last-Translator: Nuno Mariz \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Disponível %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Esta é a lista de %s disponíveis. Poderá escolher alguns, selecionando-os na " +"caixa abaixo e clicando na seta \"Escolher\" entre as duas caixas." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Digite nesta caixa para filtrar a lista de %s disponíveis." + +msgid "Filter" +msgstr "Filtrar" + +msgid "Choose all" +msgstr "Escolher todos" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Clique para escolher todos os %s de uma vez." + +msgid "Choose" +msgstr "Escolher" + +msgid "Remove" +msgstr "Remover" + +#, javascript-format +msgid "Chosen %s" +msgstr "Escolhido %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Esta é a lista de %s escolhidos. Poderá remover alguns, selecionando-os na " +"caixa abaixo e clicando na seta \"Remover\" entre as duas caixas." + +msgid "Remove all" +msgstr "Remover todos" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Clique para remover todos os %s escolhidos de uma vez." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s de %(cnt)s selecionado" +msgstr[1] "%(sel)s de %(cnt)s selecionados" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Tem mudanças por guardar nos campos individuais. Se usar uma ação, as suas " +"mudanças por guardar serão perdidas." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Selecionou uma ação mas ainda não guardou as mudanças dos campos " +"individuais. Carregue em OK para gravar. Precisará de correr de novo a ação." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Selecionou uma ação mas ainda não guardou as mudanças dos campos " +"individuais. Provavelmente quererá o botão Ir ao invés do botão Guardar." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +"Nota: O seu fuso horário está %s hora adiantado em relação ao servidor." +msgstr[1] "" +"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +"Nota: O use fuso horário está %s hora atrasado em relação ao servidor." +msgstr[1] "" +"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." + +msgid "Now" +msgstr "Agora" + +msgid "Choose a Time" +msgstr "Escolha a Hora" + +msgid "Choose a time" +msgstr "Escolha a hora" + +msgid "Midnight" +msgstr "Meia-noite" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Meio-dia" + +msgid "6 p.m." +msgstr "6 p.m." + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Today" +msgstr "Hoje" + +msgid "Choose a Date" +msgstr "Escolha a Data" + +msgid "Yesterday" +msgstr "Ontem" + +msgid "Tomorrow" +msgstr "Amanhã" + +msgid "January" +msgstr "Janeiro" + +msgid "February" +msgstr "Fevereiro" + +msgid "March" +msgstr "Março" + +msgid "April" +msgstr "Abril" + +msgid "May" +msgstr "Maio" + +msgid "June" +msgstr "Junho" + +msgid "July" +msgstr "Julho" + +msgid "August" +msgstr "Agosto" + +msgid "September" +msgstr "Setembro" + +msgid "October" +msgstr "Outubro" + +msgid "November" +msgstr "Novembro" + +msgid "December" +msgstr "Dezembro" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "D" + +msgctxt "one letter Monday" +msgid "M" +msgstr "S" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "T" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Q" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "Q" + +msgctxt "one letter Friday" +msgid "F" +msgstr "S" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Mostrar" + +msgid "Hide" +msgstr "Ocultar" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d2644ce Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..f499f4f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..de836e7 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..73da126 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1ac469b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po @@ -0,0 +1,228 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bogdan Mateescu, 2018 +# Daniel Ursache-Dogariu, 2011 +# Denis Darii , 2011 +# Ionel Cristian Mărieș , 2012 +# Jannis Leidel , 2011 +# Răzvan Ionescu , 2015 +# Razvan Stefanescu , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2018-02-27 12:32+0000\n" +"Last-Translator: Bogdan Mateescu\n" +"Language-Team: Romanian (http://www.transifex.com/django/django/language/" +"ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s disponibil" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Aceasta este o listă cu %s disponibile. Le puteți alege selectând mai multe " +"in chenarul de mai jos și apăsând pe săgeata \"Alege\" dintre cele două " +"chenare." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Scrie în acest chenar pentru a filtra lista de %s disponibile." + +msgid "Filter" +msgstr "Filtru" + +msgid "Choose all" +msgstr "Alege toate" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Click pentru a alege toate %s." + +msgid "Choose" +msgstr "Alege" + +msgid "Remove" +msgstr "Elimină" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s alese" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Aceasta este lista de %s alese. Puteți elimina din ele selectându-le in " +"chenarul de mai jos și apasand pe săgeata \"Elimină\" dintre cele două " +"chenare." + +msgid "Remove all" +msgstr "Elimină toate" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Click pentru a elimina toate %s alese." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s din %(cnt)s selectate" +msgstr[1] "%(sel)s din %(cnt)s selectate" +msgstr[2] "de %(sel)s din %(cnt)s selectate" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Aveţi modificări nesalvate în cîmpuri individuale editabile. Dacă executaţi " +"o acțiune, modificările nesalvate vor fi pierdute." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Aţi selectat o acţiune, dar nu aţi salvat încă modificările la câmpuri " +"individuale. Faceţi clic pe OK pentru a salva. Va trebui să executați " +"acțiunea din nou." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Ați selectat o acţiune și nu ațţi făcut modificări în cîmpuri individuale. " +"Probabil căutați butonul Go, în loc de Salvează." + +msgid "Now" +msgstr "Acum" + +msgid "Midnight" +msgstr "Miezul nopții" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Amiază" + +msgid "6 p.m." +msgstr "6 p.m." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Notă: Sunteți cu %s oră înaintea orei serverului." +msgstr[1] "Notă: Sunteți cu %s ore înaintea orei serverului." +msgstr[2] "Notă: Sunteți cu %s de ore înaintea orei serverului." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Notă: Sunteți cu %s oră în urma orei serverului." +msgstr[1] "Notă: Sunteți cu %s ore în urma orei serverului." +msgstr[2] "Notă: Sunteți cu %s de ore în urma orei serverului." + +msgid "Choose a Time" +msgstr "Alege o oră" + +msgid "Choose a time" +msgstr "Alege o oră" + +msgid "Cancel" +msgstr "Anulează" + +msgid "Today" +msgstr "Astăzi" + +msgid "Choose a Date" +msgstr "Alege a dată" + +msgid "Yesterday" +msgstr "Ieri" + +msgid "Tomorrow" +msgstr "Mâine" + +msgid "January" +msgstr "Ianuarie" + +msgid "February" +msgstr "Februarie" + +msgid "March" +msgstr "Martie" + +msgid "April" +msgstr "Aprilie" + +msgid "May" +msgstr "Mai" + +msgid "June" +msgstr "Iunie" + +msgid "July" +msgstr "Iulie" + +msgid "August" +msgstr "August" + +msgid "September" +msgstr "Septembrie" + +msgid "October" +msgstr "Octombrie" + +msgid "November" +msgstr "Noiembrie" + +msgid "December" +msgstr "Decembrie" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "D" + +msgctxt "one letter Monday" +msgid "M" +msgstr "L" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "M" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "M" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "J" + +msgctxt "one letter Friday" +msgid "F" +msgstr "V" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Arată" + +msgid "Hide" +msgstr "Ascunde" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..e27b05c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,729 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ivan Ivaschenko , 2013 +# Denis Darii , 2011 +# Dimmus , 2011 +# Eugene , 2016-2017 +# Sergey , 2016 +# Jannis Leidel , 2011 +# Алексей Борискин , 2012-2015 +# Дмитрий , 2019 +# Дмитрий Шатера , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-14 12:41+0000\n" +"Last-Translator: Дмитрий \n" +"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Успешно удалены %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Не удается удалить %(name)s" + +msgid "Are you sure?" +msgstr "Вы уверены?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Удалить выбранные %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Администрирование" + +msgid "All" +msgstr "Все" + +msgid "Yes" +msgstr "Да" + +msgid "No" +msgstr "Нет" + +msgid "Unknown" +msgstr "Неизвестно" + +msgid "Any date" +msgstr "Любая дата" + +msgid "Today" +msgstr "Сегодня" + +msgid "Past 7 days" +msgstr "Последние 7 дней" + +msgid "This month" +msgstr "Этот месяц" + +msgid "This year" +msgstr "Этот год" + +msgid "No date" +msgstr "Дата не указана" + +msgid "Has date" +msgstr "Дата указана" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Пожалуйста, введите корректные %(username)s и пароль учётной записи. Оба " +"поля могут быть чувствительны к регистру." + +msgid "Action:" +msgstr "Действие:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Добавить еще один %(verbose_name)s" + +msgid "Remove" +msgstr "Удалить" + +msgid "Addition" +msgstr "Добавление" + +msgid "Change" +msgstr "Изменить" + +msgid "Deletion" +msgstr "Удаление" + +msgid "action time" +msgstr "время действия" + +msgid "user" +msgstr "пользователь" + +msgid "content type" +msgstr "тип содержимого" + +msgid "object id" +msgstr "идентификатор объекта" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "представление объекта" + +msgid "action flag" +msgstr "тип действия" + +msgid "change message" +msgstr "сообщение об изменении" + +msgid "log entry" +msgstr "запись в журнале" + +msgid "log entries" +msgstr "записи в журнале" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Добавлено \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Изменено \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Удалено \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Запись в журнале" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Добавлен {name} \"{object}\"." + +msgid "Added." +msgstr "Добавлено." + +msgid "and" +msgstr "и" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Изменено {fields} у {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Изменено {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Удален {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Ни одно поле не изменено." + +msgid "None" +msgstr "Нет" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Удерживайте \"Control\" (или \"Command\" на Mac), чтобы выбрать несколько " +"значений." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" было успешно добавлено." + +msgid "You may edit it again below." +msgstr "Вы можете снова изменить этот объект ниже." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" был успешно добавлен. Вы можете добавить еще один {name} " +"ниже." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" был изменен успешно. Вы можете отредактировать его снова " +"ниже." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" был успешно добавлен. Вы можете отредактировать его еще раз " +"ниже." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" был изменен. Вы можете добавить еще один {name} ниже." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" был изменен." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Чтобы произвести действия над объектами, необходимо их выбрать. Объекты не " +"были изменены." + +msgid "No action selected." +msgstr "Действие не выбрано." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" был успешно удален." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s с ID \"%(key)s\" не существует. Возможно оно было удалено?" + +#, python-format +msgid "Add %s" +msgstr "Добавить %s" + +#, python-format +msgid "Change %s" +msgstr "Изменить %s" + +#, python-format +msgid "View %s" +msgstr "Просмотреть %s" + +msgid "Database error" +msgstr "Ошибка базы данных" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s был успешно изменен." +msgstr[1] "%(count)s %(name)s были успешно изменены." +msgstr[2] "%(count)s %(name)s были успешно изменены." +msgstr[3] "%(count)s %(name)s были успешно изменены." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Выбран %(total_count)s" +msgstr[1] "Выбраны все %(total_count)s" +msgstr[2] "Выбраны все %(total_count)s" +msgstr[3] "Выбраны все %(total_count)s" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Выбрано 0 объектов из %(cnt)s " + +#, python-format +msgid "Change history: %s" +msgstr "История изменений: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Удаление объекта %(instance)s типа %(class_name)s будет требовать удаления " +"следующих связанных объектов: %(related_objects)s" + +msgid "Django site admin" +msgstr "Административный сайт Django" + +msgid "Django administration" +msgstr "Администрирование Django" + +msgid "Site administration" +msgstr "Администрирование сайта" + +msgid "Log in" +msgstr "Войти" + +#, python-format +msgid "%(app)s administration" +msgstr "Администрирование приложения «%(app)s»" + +msgid "Page not found" +msgstr "Страница не найдена" + +msgid "We're sorry, but the requested page could not be found." +msgstr "К сожалению, запрашиваемая вами страница не найдена." + +msgid "Home" +msgstr "Начало" + +msgid "Server error" +msgstr "Ошибка сервера" + +msgid "Server error (500)" +msgstr "Ошибка сервера (500)" + +msgid "Server Error (500)" +msgstr "Ошибка сервера (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Произошла ошибка. О ней сообщено администраторам сайта по электронной почте, " +"ошибка должна быть вскоре исправлена. Благодарим вас за терпение." + +msgid "Run the selected action" +msgstr "Выполнить выбранное действие" + +msgid "Go" +msgstr "Выполнить" + +msgid "Click here to select the objects across all pages" +msgstr "Нажмите здесь, чтобы выбрать объекты на всех страницах" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Выбрать все %(module_name)s (%(total_count)s)" + +msgid "Clear selection" +msgstr "Снять выделение" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Сначала введите имя пользователя и пароль. Затем вы сможете ввести больше " +"информации о пользователе." + +msgid "Enter a username and password." +msgstr "Введите имя пользователя и пароль." + +msgid "Change password" +msgstr "Изменить пароль" + +msgid "Please correct the error below." +msgstr "Пожалуйста, исправьте ошибку ниже." + +msgid "Please correct the errors below." +msgstr "Пожалуйста, исправьте ошибки ниже." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Введите новый пароль для пользователя %(username)s." + +msgid "Welcome," +msgstr "Добро пожаловать," + +msgid "View site" +msgstr "Открыть сайт" + +msgid "Documentation" +msgstr "Документация" + +msgid "Log out" +msgstr "Выйти" + +#, python-format +msgid "Add %(name)s" +msgstr "Добавить %(name)s" + +msgid "History" +msgstr "История" + +msgid "View on site" +msgstr "Смотреть на сайте" + +msgid "Filter" +msgstr "Фильтр" + +msgid "Remove from sorting" +msgstr "Удалить из сортировки" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Приоритет сортировки: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Сортировать в другом направлении" + +msgid "Delete" +msgstr "Удалить" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Удаление %(object_name)s '%(escaped_object)s' приведет к удалению связанных " +"объектов, но ваша учетная запись не имеет прав для удаления следующих типов " +"объектов:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Удаление %(object_name)s '%(escaped_object)s' потребует удаления следующих " +"связанных защищенных объектов:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Вы уверены, что хотите удалить %(object_name)s \"%(escaped_object)s\"? Все " +"следующие связанные объекты также будут удалены:" + +msgid "Objects" +msgstr "Объекты" + +msgid "Yes, I'm sure" +msgstr "Да, я уверен" + +msgid "No, take me back" +msgstr "Нет, отменить и вернуться к выбору" + +msgid "Delete multiple objects" +msgstr "Удалить несколько объектов" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Удаление выбранной %(objects_name)s приведет к удалению связанных объектов, " +"но ваша учетная запись не имеет прав на удаление следующих типов объектов:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Удаление %(objects_name)s потребует удаления следующих связанных защищенных " +"объектов:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Вы уверены, что хотите удалить %(objects_name)s? Все следующие объекты и " +"связанные с ними элементы будут удалены:" + +msgid "View" +msgstr "Просмотреть" + +msgid "Delete?" +msgstr "Удалить?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s" + +msgid "Summary" +msgstr "Краткая статистика" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Модели в приложении %(name)s" + +msgid "Add" +msgstr "Добавить" + +msgid "You don't have permission to view or edit anything." +msgstr "У вас недостаточно полномочий для просмотра или изменения чего либо." + +msgid "Recent actions" +msgstr "Последние действия" + +msgid "My actions" +msgstr "Мои действия" + +msgid "None available" +msgstr "Недоступно" + +msgid "Unknown content" +msgstr "Неизвестный тип" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Ваша база данных неправильно настроена. Убедитесь, что соответствующие " +"таблицы были созданы, и что соответствующему пользователю разрешен к ним " +"доступ." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Вы вошли в систему как %(username)s, однако у вас недостаточно прав для " +"просмотра данной страницы. Возможно, вы хотели бы войти в систему, используя " +"другую учётную запись?" + +msgid "Forgotten your password or username?" +msgstr "Забыли свой пароль или имя пользователя?" + +msgid "Date/time" +msgstr "Дата и время" + +msgid "User" +msgstr "Пользователь" + +msgid "Action" +msgstr "Действие" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Данный объект не имеет истории изменений. Возможно, он был добавлен не через " +"данный административный сайт." + +msgid "Show all" +msgstr "Показать все" + +msgid "Save" +msgstr "Сохранить" + +msgid "Popup closing…" +msgstr "Всплывающее окно закрывается..." + +msgid "Search" +msgstr "Найти" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s результат" +msgstr[1] "%(counter)s результата" +msgstr[2] "%(counter)s результатов" +msgstr[3] "%(counter)s результатов" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s всего" + +msgid "Save as new" +msgstr "Сохранить как новый объект" + +msgid "Save and add another" +msgstr "Сохранить и добавить другой объект" + +msgid "Save and continue editing" +msgstr "Сохранить и продолжить редактирование" + +msgid "Save and view" +msgstr "Сохранить и просмотреть" + +msgid "Close" +msgstr "Закрыть" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Изменить выбранный объект типа \"%(model)s\"" + +#, python-format +msgid "Add another %(model)s" +msgstr "Добавить ещё один объект типа \"%(model)s\"" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Удалить выбранный объект типа \"%(model)s\"" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Благодарим вас за время, проведенное на этом сайте." + +msgid "Log in again" +msgstr "Войти снова" + +msgid "Password change" +msgstr "Изменение пароля" + +msgid "Your password was changed." +msgstr "Ваш пароль был изменен." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"В целях безопасности, пожалуйста, введите свой старый пароль, затем введите " +"новый пароль дважды, чтобы мы могли убедиться в правильности написания." + +msgid "Change my password" +msgstr "Изменить мой пароль" + +msgid "Password reset" +msgstr "Восстановление пароля" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Ваш пароль был сохранен. Теперь вы можете войти." + +msgid "Password reset confirmation" +msgstr "Подтверждение восстановления пароля" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Пожалуйста, введите новый пароль дважды, чтобы мы могли убедиться в " +"правильности написания." + +msgid "New password:" +msgstr "Новый пароль:" + +msgid "Confirm password:" +msgstr "Подтвердите пароль:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Неверная ссылка для восстановления пароля. Возможно, ей уже воспользовались. " +"Пожалуйста, попробуйте восстановить пароль еще раз." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Мы отправили вам инструкцию по установке нового пароля на указанный адрес " +"электронной почты (если в нашей базе данных есть такой адрес). Вы должны " +"получить ее в ближайшее время." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Если вы не получили письмо, пожалуйста, убедитесь, что вы ввели адрес с " +"которым Вы зарегистрировались, и проверьте папку со спамом." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Вы получили это письмо, потому что вы (или кто-то другой) запросили " +"восстановление пароля от учётной записи на сайте %(site_name)s, которая " +"связана с этим адресом электронной почты." + +msgid "Please go to the following page and choose a new password:" +msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:" + +msgid "Your username, in case you've forgotten:" +msgstr "Ваше имя пользователя (на случай, если вы его забыли):" + +msgid "Thanks for using our site!" +msgstr "Спасибо, что используете наш сайт!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Команда сайта %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Забыли пароль? Введите свой адрес электронной почты ниже, и мы вышлем вам " +"инструкцию, как установить новый пароль." + +msgid "Email address:" +msgstr "Адрес электронной почты:" + +msgid "Reset my password" +msgstr "Восстановить мой пароль" + +msgid "All dates" +msgstr "Все даты" + +#, python-format +msgid "Select %s" +msgstr "Выберите %s" + +#, python-format +msgid "Select %s to change" +msgstr "Выберите %s для изменения" + +#, python-format +msgid "Select %s to view" +msgstr "Выберите %s для просмотра" + +msgid "Date:" +msgstr "Дата:" + +msgid "Time:" +msgstr "Время:" + +msgid "Lookup" +msgstr "Поиск" + +msgid "Currently:" +msgstr "Сейчас:" + +msgid "Change:" +msgstr "Изменить:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d7a5ba3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..46d3678 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,715 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011,2015 +# Besnik , 2015,2018-2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 11:06+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "U fshinë me sukses %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "S’mund të fshijë %(name)s" + +msgid "Are you sure?" +msgstr "Jeni i sigurt?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" + +msgid "Administration" +msgstr "Administrim" + +msgid "All" +msgstr "Krejt" + +msgid "Yes" +msgstr "Po" + +msgid "No" +msgstr "Jo" + +msgid "Unknown" +msgstr "E panjohur" + +msgid "Any date" +msgstr "Çfarëdo date" + +msgid "Today" +msgstr "Sot" + +msgid "Past 7 days" +msgstr "7 ditët e shkuara" + +msgid "This month" +msgstr "Këtë muaj" + +msgid "This year" +msgstr "Këtë vit" + +msgid "No date" +msgstr "Pa datë" + +msgid "Has date" +msgstr "Ka datë" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Ju lutemi, jepni %(username)s dhe fjalëkalimin e saktë për një llogari " +"ekipi. Kini parasysh se që të dy fushat mund të jenë të ndjeshme ndaj " +"shkrimit me shkronja të mëdha ose të vogla." + +msgid "Action:" +msgstr "Veprim:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Shtoni një tjetër %(verbose_name)s" + +msgid "Remove" +msgstr "Hiqe" + +msgid "Addition" +msgstr "Shtim" + +msgid "Change" +msgstr "Ndryshoje" + +msgid "Deletion" +msgstr "Fshirje" + +msgid "action time" +msgstr "kohë veprimi" + +msgid "user" +msgstr "përdorues" + +msgid "content type" +msgstr "lloj lënde" + +msgid "object id" +msgstr "id objekti" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "paraqitje objekti" + +msgid "action flag" +msgstr "shenjë veprimi" + +msgid "change message" +msgstr "mesazh ndryshimi" + +msgid "log entry" +msgstr "zë regjistrimi" + +msgid "log entries" +msgstr "zëra regjistrimi" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "U shtua \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "U ndryshua \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "U fshi \"%(object)s.\"" + +msgid "LogEntry Object" +msgstr "Objekt LogEntry" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "U shtua {name} \"{object}\"." + +msgid "Added." +msgstr "U shtua." + +msgid "and" +msgstr "dhe " + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "U ndryshua {fields} për {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "U ndryshuan {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "U fshi {name} \"{object}\"." + +msgid "No fields changed." +msgstr "S’u ndryshua ndonjë fushë." + +msgid "None" +msgstr "Asnjë" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Për të përzgjedhur më shumë se një, në Mac mbani të shtypur \"Control\", ose " +"\"Command\"." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" u shtua me sukses." + +msgid "You may edit it again below." +msgstr "Mund ta ripërpunoni më poshtë." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" u ndryshua me sukses. Mund të shtoni një tjetër {name} më " +"poshtë." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" u ndryshua me sukses. Mund të ripërpunoni më poshtë." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" u ndryshua me sukses. Mund ta ripërpunoni më poshtë." + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} \"{obj}\" u ndryshua me sukses. Mund të shtoni një tjetër {name} më " +"poshtë." + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" u ndryshua me sukses." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Duhen përzgjedhur objekte që të kryhen veprime mbi ta. S’u ndryshua ndonjë " +"objekt." + +msgid "No action selected." +msgstr "S’u përzgjodh ndonjë veprim." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" u fshi me sukses." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "%(name)s me ID \"%(key)s\" s’ekziston. Mos qe fshirë?" + +#, python-format +msgid "Add %s" +msgstr "Shtoni %s" + +#, python-format +msgid "Change %s" +msgstr "Ndrysho %s" + +#, python-format +msgid "View %s" +msgstr "Shiheni %s" + +msgid "Database error" +msgstr "Gabim baze të dhënash" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s u ndryshua me sukses." +msgstr[1] "%(count)s %(name)s u ndryshuan me sukses." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s i përzgjedhur" +msgstr[1] "Krejt %(total_count)s të përzgjedhurat" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 nga %(cnt)s të përzgjedhur" + +#, python-format +msgid "Change history: %s" +msgstr "Ndryshoni historikun: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Fshirja e %(class_name)s %(instance)s do të lypte fshirjen e objekteve " +"vijuese të mbrojtura që kanë lidhje me ta: %(related_objects)s" + +msgid "Django site admin" +msgstr "Përgjegjës sajti Django" + +msgid "Django administration" +msgstr "Administrim i Django-s" + +msgid "Site administration" +msgstr "Administrim sajti" + +msgid "Log in" +msgstr "Hyni" + +#, python-format +msgid "%(app)s administration" +msgstr "Administrim %(app)s" + +msgid "Page not found" +msgstr "S’u gjet faqe" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Na ndjeni, por faqja e kërkuar s’gjendet dot." + +msgid "Home" +msgstr "Hyrje" + +msgid "Server error" +msgstr "Gabim shërbyesi" + +msgid "Server error (500)" +msgstr "Gabim shërbyesi (500)" + +msgid "Server Error (500)" +msgstr "Gabim Shërbyesi (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Pati një gabim. Iu është njoftuar përgjegjësve të sajtit përmes email-i dhe " +"do të duhej të ndreqej shpejt. Faleminderit për durimin." + +msgid "Run the selected action" +msgstr "Xhiro veprimin e përzgjedhur" + +msgid "Go" +msgstr "Shko tek" + +msgid "Click here to select the objects across all pages" +msgstr "Klikoni këtu që të përzgjidhni objektet nëpër krejt faqet" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Përzgjidhni krejt %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Pastroje përzgjedhjen" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Së pari, jepni një emër përdoruesi dhe fjalëkalim. Mandej, do të jeni në " +"gjendje të përpunoni më tepër mundësi përdoruesi." + +msgid "Enter a username and password." +msgstr "Jepni emër përdoruesi dhe fjalëkalim." + +msgid "Change password" +msgstr "Ndryshoni fjalëkalimin" + +msgid "Please correct the error below." +msgstr "Ju lutemi, ndreqni gabimin më poshtë." + +msgid "Please correct the errors below." +msgstr "Ju lutemi, ndreqni gabimet më poshtë." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" +"Jepni një fjalëkalim të ri për përdoruesin %(username)s." + +msgid "Welcome," +msgstr "Mirë se vini," + +msgid "View site" +msgstr "Shihni sajtin" + +msgid "Documentation" +msgstr "Dokumentim" + +msgid "Log out" +msgstr "Dilni" + +#, python-format +msgid "Add %(name)s" +msgstr "Shto %(name)s" + +msgid "History" +msgstr "Historik" + +msgid "View on site" +msgstr "Shiheni në sajt" + +msgid "Filter" +msgstr "Filtër" + +msgid "Remove from sorting" +msgstr "Hiqe prej renditjeje" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Përparësi renditjesh: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Shfaq/fshih renditjen" + +msgid "Delete" +msgstr "Fshije" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Fshirja e %(object_name)s '%(escaped_object)s' do të shpinte në fshirjen e " +"objekteve të lidhur me të, por llogaria juaj nuk ka leje për fshirje të " +"objekteve të llojeve të mëposhtëm:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Fshirja e %(object_name)s '%(escaped_object)s' do të kërkonte fshirjen e " +"objekteve të mbrojtur vijues, të lidhur me të:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Jeni i sigurt se doni të fshihet %(object_name)s \"%(escaped_object)s\"? " +"Krejt objektet vijues të lidhur me të do të fshihen:" + +msgid "Objects" +msgstr "Objekte" + +msgid "Yes, I'm sure" +msgstr "Po, jam i sigurt" + +msgid "No, take me back" +msgstr "Jo, kthemëni mbrapsht" + +msgid "Delete multiple objects" +msgstr "Fshini disa objekte njëherësh" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Fshirja e %(objects_name)s të përzgjedhur do të shpjerë në fshirjen e " +"objekteve të lidhur me të, por llogaria juaj nuk ka leje të fshijë llojet " +"vijuese të objekteve:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Fshirja e %(objects_name)s të përzgjedhur do të kërkonte fshirjen e " +"objekteve të mbrojtur vijues, të lidhur me të:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Jeni i sigurt se doni të fshihen %(objects_name)s e përzgjedhur? Krejt " +"objektet vijues dhe gjëra të lidhura me ta do të fshihen:" + +msgid "View" +msgstr "Shiheni" + +msgid "Delete?" +msgstr "Të fshihet?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Nga %(filter_title)s " + +msgid "Summary" +msgstr "Përmbledhje" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele te aplikacioni %(name)s" + +msgid "Add" +msgstr "Shtoni" + +msgid "You don't have permission to view or edit anything." +msgstr "S’keni leje të shihni apo përpunoni gjë." + +msgid "Recent actions" +msgstr "Veprime së fundi" + +msgid "My actions" +msgstr "Veprimet e mia" + +msgid "None available" +msgstr "Asnjë i passhëm" + +msgid "Unknown content" +msgstr "Lëndë e panjohur" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Ka diçka që s’shkon me instalimin e bazës suaj të të dhënave. Sigurohuni që " +"janë krijuar tabelat e duhura të bazës së të dhënave, dhe që baza e të " +"dhënave është e lexueshme nga përdoruesi i duhur." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Jeni mirëfilltësuar si %(username)s, por s’jeni i autorizuar të hyni në këtë " +"faqe. Do të donit të hyni në një llogari tjetër?" + +msgid "Forgotten your password or username?" +msgstr "Harruat fjalëkalimin ose emrin tuaj të përdoruesit?" + +msgid "Date/time" +msgstr "Datë/kohë" + +msgid "User" +msgstr "Përdorues" + +msgid "Action" +msgstr "Veprim" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ky objekt s’ka historik ndryshimesh. Ndoshta s’qe shtuar përmes këtij sajti " +"administrimi." + +msgid "Show all" +msgstr "Shfaqi krejt" + +msgid "Save" +msgstr "Ruaje" + +msgid "Popup closing…" +msgstr "Mbyllje flluske…" + +msgid "Search" +msgstr "Kërko" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s përfundim" +msgstr[1] "%(counter)s përfundime" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s gjithsej" + +msgid "Save as new" +msgstr "Ruaje si të ri" + +msgid "Save and add another" +msgstr "Ruajeni dhe shtoni një tjetër" + +msgid "Save and continue editing" +msgstr "Ruajeni dhe vazhdoni përpunimin" + +msgid "Save and view" +msgstr "Ruajeni dhe shiheni" + +msgid "Close" +msgstr "Mbylle" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Ndryshoni %(model)s e përzgjedhur" + +#, python-format +msgid "Add another %(model)s" +msgstr "Shtoni një %(model)s tjetër" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Fshije %(model)s e përzgjedhur" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Faleminderit që shpenzoni sot pak kohë të çmuar me sajtin Web." + +msgid "Log in again" +msgstr "Hyni sërish" + +msgid "Password change" +msgstr "Ndryshim fjalëkalimi" + +msgid "Your password was changed." +msgstr "Fjalëkalimi juaj u ndryshua." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Ju lutemi, jepni fjalëkalimin tuaj të vjetër, për hir të sigurisë, dhe " +"mandej jepni dy herë fjalëkalimin tuaj të ri, që kështu të mund të " +"verifikojmë se e shtypët saktë." + +msgid "Change my password" +msgstr "Ndrysho fjalëkalimin tim" + +msgid "Password reset" +msgstr "Ricaktim fjalëkalimi" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"Fjalëkalimi juaj u caktua. Mund të vazhdoni më tej dhe të bëni hyrjen tani." + +msgid "Password reset confirmation" +msgstr "Ripohim ricaktimi fjalëkalimi" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Ju lutemi, jepeni fjalëkalimin tuaj dy herë, që kështu të mund të " +"verifikojmë që e shtypët saktë." + +msgid "New password:" +msgstr "Fjalëkalim i ri:" + +msgid "Confirm password:" +msgstr "Ripohoni fjalëkalimin:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Lidhja për ricaktimin e fjalëkalimit qe e pavlefshme, ndoshta ngaqë është " +"përdorur tashmë një herë. Ju lutemi, kërkoni një ricaktim të ri fjalëkalimi." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Ju kemi dërguar me email udhëzime për caktimin e fjalëkalimit tuaj, nëse ka " +"një llogari me email-in që dhatë. Do të duhej t’ju vinin pas pak." + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Nëse nuk merrni një email, ju lutemi, sigurohuni që keni dhënë adresën e " +"saktë me të cilën u regjistruat, dhe kontrolloni dosjen tuaj të mesazheve të " +"padëshiruara." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Këtë email po e merrni ngaqë kërkuat ricaktim fjalëkalimi për llogarinë tuaj " +"si përdorues te %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Ju lutemi, shkoni te faqja vijuese dhe zgjidhni një fjalëkalim të ri:" + +msgid "Your username, in case you've forgotten:" +msgstr "Emri juaj i përdoruesit, në rast se e keni harruar:" + +msgid "Thanks for using our site!" +msgstr "Faleminderit që përdorni sajtin tonë!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Ekipi i %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Harruat fjalëkalimin tuaj? Jepni më poshtë adresën tuaj email, dhe do t’ju " +"dërgojmë udhëzimet për të caktuar një të ri." + +msgid "Email address:" +msgstr "Adresë email:" + +msgid "Reset my password" +msgstr "Ricakto fjalëkalimin tim" + +msgid "All dates" +msgstr "Krejt datat" + +#, python-format +msgid "Select %s" +msgstr "Përzgjidhni %s" + +#, python-format +msgid "Select %s to change" +msgstr "Përzgjidhni %s për ta ndryshuar" + +#, python-format +msgid "Select %s to view" +msgstr "Përzgjidhni %s për parje" + +msgid "Date:" +msgstr "Datë:" + +msgid "Time:" +msgstr "Kohë:" + +msgid "Lookup" +msgstr "Kërkim" + +msgid "Currently:" +msgstr "Tani:" + +msgid "Change:" +msgstr "Ndryshim:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..7b4668b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..163c241 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011-2012,2015 +# Besnik , 2015,2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-11-29 22:17+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s i gatshëm" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Kjo është lista e %s të gatshëm. Mund të zgjidhni disa duke i përzgjedhur te " +"kutiza më poshtë dhe mandej duke klikuar mbi shigjetën \"Zgjidhe\" mes dy " +"kutizave." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Shkruani brenda kutizës që të filtrohet lista e %s të passhme." + +msgid "Filter" +msgstr "Filtro" + +msgid "Choose all" +msgstr "Zgjidheni krejt" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klikoni që të zgjidhen krejt %s njëherësh." + +msgid "Choose" +msgstr "Zgjidhni" + +msgid "Remove" +msgstr "Hiqe" + +#, javascript-format +msgid "Chosen %s" +msgstr "U zgjodh %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Kjo është lista e %s të gatshme. Mund të hiqni disa duke i përzgjedhur te " +"kutiza më poshtë e mandej duke klikuar mbi shigjetën \"Hiqe\" mes dy " +"kutizave." + +msgid "Remove all" +msgstr "Hiqi krejt" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klikoni që të hiqen krejt %s e zgjedhura njëherësh." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "U përzgjodh %(sel)s nga %(cnt)s" +msgstr[1] "U përzgjodhën %(sel)s nga %(cnt)s" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Keni ndryshime të paruajtura te fusha individuale të ndryshueshme. Nëse " +"kryeni një veprim, ndryshimet e paruajtura do të humbin." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Keni përzgjedhur një veprim, por nuk keni ruajtur ende ndryshimet që bëtë te " +"fusha individuale. Ju lutemi, klikoni OK që të bëhet ruajtja. Do t’ju duhet " +"ta ribëni veprimin." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Keni përzgjedhur një veprim, dhe nuk keni bërë ndonjë ndryshim te fusha " +"individuale. Ndoshta po kërkonit për butonin Shko, në vend se për butonin " +"Ruaje." + +msgid "Now" +msgstr "Tani" + +msgid "Midnight" +msgstr "Mesnatë" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Mesditë" + +msgid "6 p.m." +msgstr "6 p.m." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Shënim: Jeni %s orë para kohës së shërbyesit." +msgstr[1] "Shënim: Jeni %s orë para kohës së shërbyesit." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Shënim: Jeni %s orë pas kohës së shërbyesit." +msgstr[1] "Shënim: Jeni %s orë pas kohës së shërbyesit." + +msgid "Choose a Time" +msgstr "Zgjidhni një Kohë" + +msgid "Choose a time" +msgstr "Zgjidhni një kohë" + +msgid "Cancel" +msgstr "Anuloje" + +msgid "Today" +msgstr "Sot" + +msgid "Choose a Date" +msgstr "Zgjidhni një Datë" + +msgid "Yesterday" +msgstr "Dje" + +msgid "Tomorrow" +msgstr "Nesër" + +msgid "January" +msgstr "Janar" + +msgid "February" +msgstr "Shkurt" + +msgid "March" +msgstr "Mars" + +msgid "April" +msgstr "Prill" + +msgid "May" +msgstr "Maj" + +msgid "June" +msgstr "Qershor" + +msgid "July" +msgstr "Korrik" + +msgid "August" +msgstr "Gusht" + +msgid "September" +msgstr "Shtator" + +msgid "October" +msgstr "Tetor" + +msgid "November" +msgstr "Nëntor" + +msgid "December" +msgstr "Dhjetor" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "D" + +msgctxt "one letter Monday" +msgid "M" +msgstr "H" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "M" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "M" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "E" + +msgctxt "one letter Friday" +msgid "F" +msgstr "P" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "Shfaqe" + +msgid "Hide" +msgstr "Fshihe" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..16d4e9d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3c6ee7f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..65c851b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..4c3d304 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,694 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Igor Jerosimić, 2019 +# Jannis Leidel , 2011 +# Janos Guljas , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-06-27 12:37+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" +"language/sr@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Uspešno obrisano: %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Nesuspelo brisanje %(name)s" + +msgid "Are you sure?" +msgstr "Da li ste sigurni?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Briši označene objekte klase %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Administracija" + +msgid "All" +msgstr "Svi" + +msgid "Yes" +msgstr "Da" + +msgid "No" +msgstr "Ne" + +msgid "Unknown" +msgstr "Nepoznato" + +msgid "Any date" +msgstr "Svi datumi" + +msgid "Today" +msgstr "Danas" + +msgid "Past 7 days" +msgstr "Poslednjih 7 dana" + +msgid "This month" +msgstr "Ovaj mesec" + +msgid "This year" +msgstr "Ova godina" + +msgid "No date" +msgstr "Nema datuma" + +msgid "Has date" +msgstr "Ima datum" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Molim vas unesite ispravno %(username)s i lozinku. Obratite pažnju da mala i " +"velika slova predstavljaju različite karaktere." + +msgid "Action:" +msgstr "Radnja:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Dodaj još jedan objekat klase %(verbose_name)s." + +msgid "Remove" +msgstr "Obriši" + +msgid "Addition" +msgstr "Dodavanja" + +msgid "Change" +msgstr "Izmeni" + +msgid "Deletion" +msgstr "Brisanja" + +msgid "action time" +msgstr "vreme radnje" + +msgid "user" +msgstr "korisnik" + +msgid "content type" +msgstr "tip sadržaja" + +msgid "object id" +msgstr "id objekta" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "opis objekta" + +msgid "action flag" +msgstr "oznaka radnje" + +msgid "change message" +msgstr "opis izmene" + +msgid "log entry" +msgstr "zapis u logovima" + +msgid "log entries" +msgstr "zapisi u logovima" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Dodat objekat klase „%(object)s“." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Promenjen objekat klase „%(object)s“ - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Uklonjen objekat klase „%(object)s“." + +msgid "LogEntry Object" +msgstr "Objekat unosa loga" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Dodat objekat {name} \"{object}\"." + +msgid "Added." +msgstr "Dodato." + +msgid "and" +msgstr "i" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Izmenjena polja {fields} za {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Izmenjena polja {fields}." + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Obrisan objekat {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Bez izmena u poljima." + +msgid "None" +msgstr "Ništa" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Potrebno je izabrati objekte da bi se izvršila akcija nad njima. Nijedan " +"objekat nije promenjen." + +msgid "No action selected." +msgstr "Nije izabrana nijedna akcija." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Objekat „%(obj)s“ klase %(name)s uspešno je obrisan." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Dodaj objekat klase %s" + +#, python-format +msgid "Change %s" +msgstr "Izmeni objekat klase %s" + +#, python-format +msgid "View %s" +msgstr "Pregled %s" + +msgid "Database error" +msgstr "Greška u bazi podataka" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "Uspešno promenjen %(count)s %(name)s." +msgstr[1] "Uspešno promenjena %(count)s %(name)s." +msgstr[2] "Uspešno promenjenih %(count)s %(name)s." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s izabran" +msgstr[1] "Sva %(total_count)s izabrana" +msgstr[2] "Svih %(total_count)s izabranih" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 od %(cnt)s izabrano" + +#, python-format +msgid "Change history: %s" +msgstr "Istorijat izmena: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django administracija sajta" + +msgid "Django administration" +msgstr "Django administracija" + +msgid "Site administration" +msgstr "Administracija sistema" + +msgid "Log in" +msgstr "Prijava" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Stranica nije pronađena" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Žao nam je, tražena stranica nije pronađena." + +msgid "Home" +msgstr "Početna" + +msgid "Server error" +msgstr "Greška na serveru" + +msgid "Server error (500)" +msgstr "Greška na serveru (500)" + +msgid "Server Error (500)" +msgstr "Greška na serveru (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Pokreni odabranu radnju" + +msgid "Go" +msgstr "Počni" + +msgid "Click here to select the objects across all pages" +msgstr "Izaberi sve objekte na ovoj stranici." + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Izaberi sve %(module_name)s od %(total_count)s ukupno." + +msgid "Clear selection" +msgstr "Poništi izbor" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Prvo unesite korisničko ime i lozinku. Potom ćete moći da menjate još " +"korisničkih podešavanja." + +msgid "Enter a username and password." +msgstr "Unesite korisničko ime i lozinku" + +msgid "Change password" +msgstr "Promena lozinke" + +msgid "Please correct the error below." +msgstr "" + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Unesite novu lozinku za korisnika %(username)s." + +msgid "Welcome," +msgstr "Dobrodošli," + +msgid "View site" +msgstr "Pogledaj sajt" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Log out" +msgstr "Odjava" + +#, python-format +msgid "Add %(name)s" +msgstr "Dodaj objekat klase %(name)s" + +msgid "History" +msgstr "Istorijat" + +msgid "View on site" +msgstr "Pregled na sajtu" + +msgid "Filter" +msgstr "Filter" + +msgid "Remove from sorting" +msgstr "Izbaci iz sortiranja" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Prioritet sortiranja: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Uključi/isključi sortiranje" + +msgid "Delete" +msgstr "Obriši" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Uklanjanje %(object_name)s „%(escaped_object)s“ povlači uklanjanje svih " +"objekata koji su povezani sa ovim objektom, ali vaš nalog nema dozvole za " +"brisanje sledećih tipova objekata:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Da bi izbrisali izabran %(object_name)s „%(escaped_object)s“ potrebno je " +"brisati i sledeće zaštićene povezane objekte:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Da sigurni da želite da obrišete %(object_name)s „%(escaped_object)s“? " +"Sledeći objekti koji su u vezi sa ovim objektom će takođe biti obrisani:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Da, siguran sam" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Brisanje više objekata" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i zaštićene " +"povezane objekte, međutim vaš nalog nema dozvole za brisanje sledećih tipova " +"objekata:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Da bi izbrisali izabrane %(objects_name)s potrebno je brisati i sledeće " +"zaštićene povezane objekte:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Da li ste sigurni da želite da izbrišete izabrane %(objects_name)s? Svi " +"sledeći objekti i objekti sa njima povezani će biti izbrisani:" + +msgid "View" +msgstr "Pregled" + +msgid "Delete?" +msgstr "Brisanje?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Dodaj" + +msgid "You don't have permission to view or edit anything." +msgstr "Nemate dozvolu da pogledate ili izmenite bilo šta." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Nema podataka" + +msgid "Unknown content" +msgstr "Nepoznat sadržaj" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Nešto nije uredu sa vašom bazom podataka. Proverite da li postoje " +"odgovarajuće tabele i da li odgovarajući korisnik ima pristup bazi." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Zaboravili ste lozinku ili korisničko ime?" + +msgid "Date/time" +msgstr "Datum/vreme" + +msgid "User" +msgstr "Korisnik" + +msgid "Action" +msgstr "Radnja" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Ovaj objekat nema zabeležen istorijat izmena. Verovatno nije dodat kroz ovaj " +"sajt za administraciju." + +msgid "Show all" +msgstr "Prikaži sve" + +msgid "Save" +msgstr "Sačuvaj" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Pretraga" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s rezultat" +msgstr[1] "%(counter)s rezultata" +msgstr[2] "%(counter)s rezultata" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "ukupno %(full_result_count)s" + +msgid "Save as new" +msgstr "Sačuvaj kao novi" + +msgid "Save and add another" +msgstr "Sačuvaj i dodaj sledeći" + +msgid "Save and continue editing" +msgstr "Sačuvaj i nastavi sa izmenama" + +msgid "Save and view" +msgstr "Snimi i pogledaj" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Hvala što ste danas proveli vreme na ovom sajtu." + +msgid "Log in again" +msgstr "Ponovna prijava" + +msgid "Password change" +msgstr "Izmena lozinke" + +msgid "Your password was changed." +msgstr "Vaša lozinka je izmenjena." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Iz bezbednosnih razloga prvo unesite svoju staru lozinku, a novu zatim " +"unesite dva puta da bismo mogli da proverimo da li ste je pravilno uneli." + +msgid "Change my password" +msgstr "Izmeni moju lozinku" + +msgid "Password reset" +msgstr "Resetovanje lozinke" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Vaša lozinka je postavljena. Možete se prijaviti." + +msgid "Password reset confirmation" +msgstr "Potvrda resetovanja lozinke" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Unesite novu lozinku dva puta kako bismo mogli da proverimo da li ste je " +"pravilno uneli." + +msgid "New password:" +msgstr "Nova lozinka:" + +msgid "Confirm password:" +msgstr "Potvrda lozinke:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Link za resetovanje lozinke nije važeći, verovatno zato što je već " +"iskorišćen. Ponovo zatražite resetovanje lozinke." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "Idite na sledeću stranicu i postavite novu lozinku." + +msgid "Your username, in case you've forgotten:" +msgstr "Ukoliko ste zaboravili, vaše korisničko ime:" + +msgid "Thanks for using our site!" +msgstr "Hvala što koristite naš sajt!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Ekipa sajta %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "Resetuj moju lozinku" + +msgid "All dates" +msgstr "Svi datumi" + +#, python-format +msgid "Select %s" +msgstr "Odaberi objekat klase %s" + +#, python-format +msgid "Select %s to change" +msgstr "Odaberi objekat klase %s za izmenu" + +#, python-format +msgid "Select %s to view" +msgstr "Odaberi %sza pregled" + +msgid "Date:" +msgstr "Datum:" + +msgid "Time:" +msgstr "Vreme:" + +msgid "Lookup" +msgstr "Pretraži" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3ca037e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..1271dff --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,676 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Machaku , 2013-2014 +# Machaku , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Umefanikiwa kufuta %(items)s %(count)d." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Huwezi kufuta %(name)s" + +msgid "Are you sure?" +msgstr "Una uhakika?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Futa %(verbose_name_plural)s teule" + +msgid "Administration" +msgstr "Utawala" + +msgid "All" +msgstr "yote" + +msgid "Yes" +msgstr "Ndiyo" + +msgid "No" +msgstr "Hapana" + +msgid "Unknown" +msgstr "Haijulikani" + +msgid "Any date" +msgstr "Tarehe yoyote" + +msgid "Today" +msgstr "Leo" + +msgid "Past 7 days" +msgstr "Siku 7 zilizopita" + +msgid "This month" +msgstr "mwezi huu" + +msgid "This year" +msgstr "Mwaka huu" + +msgid "No date" +msgstr "Hakuna tarehe" + +msgid "Has date" +msgstr "Kuna tarehe" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Tafadhali ingiza %(username)s na nywila sahihi kwa akaunti ya msimamizi. " +"Kumbuka kuzingatia herufi kubwa na ndogo." + +msgid "Action:" +msgstr "Tendo" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Ongeza %(verbose_name)s" + +msgid "Remove" +msgstr "Ondoa" + +msgid "action time" +msgstr "muda wa tendo" + +msgid "user" +msgstr "mtumiaji" + +msgid "content type" +msgstr "aina ya maudhui" + +msgid "object id" +msgstr "Kitambulisho cha kitu" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "`repr` ya kitu" + +msgid "action flag" +msgstr "bendera ya tendo" + +msgid "change message" +msgstr "badilisha ujumbe" + +msgid "log entry" +msgstr "ingizo kwenye kumbukumbu" + +msgid "log entries" +msgstr "maingizo kwenye kumbukumbu" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Kuongezwa kwa \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Kubadilishwa kwa \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Kufutwa kwa \"%(object)s\"." + +msgid "LogEntry Object" +msgstr "Kitu cha Ingizo la Kumbukumbu" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "Kumeongezeka {name} \"{object}\"." + +msgid "Added." +msgstr "Imeongezwa" + +msgid "and" +msgstr "na" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "Mabadiliko ya {fields} yamefanyika katika {name} \"{object}\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Mabadiliko yamefanyika katika {fields} " + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "Futa {name} \"{object}\"." + +msgid "No fields changed." +msgstr "Hakuna uga uliobadilishwa." + +msgid "None" +msgstr "Hakuna" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" +"Ingizo la {name} \"{obj}\" limefanyika kwa mafanikio. Unaweza kuhariri tena" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Nilazima kuchagua vitu ili kufanyia kitu fulani. Hakuna kitu " +"kilichochaguliwa." + +msgid "No action selected." +msgstr "Hakuna tendo lililochaguliwa" + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "Ufutaji wa \"%(obj)s\" %(name)s umefanikiwa." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Ongeza %s" + +#, python-format +msgid "Change %s" +msgstr "Badilisha %s" + +msgid "Database error" +msgstr "Hitilafu katika hifadhidata" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "mabadiliko ya %(name)s %(count)s yamefanikiwa." +msgstr[1] "mabadiliko ya %(name)s %(count)s yamefanikiwa." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s kuchaguliwa" +msgstr[1] "%(total_count)s (kila kitu) kuchaguliwa" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Vilivyo chaguliwa ni 0 kati ya %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "Badilisha historia: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(instance)s %(class_name)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Kufutwa kwa ingizo la %(instance)s %(class_name)s kutahitaji kufutwa kwa " +"vitu vifuatavyo vyenye mahusiano vilivyokingwa: %(related_objects)s" + +msgid "Django site admin" +msgstr "Utawala wa tovuti ya django" + +msgid "Django administration" +msgstr "Utawala wa Django" + +msgid "Site administration" +msgstr "Utawala wa tovuti" + +msgid "Log in" +msgstr "Ingia" + +#, python-format +msgid "%(app)s administration" +msgstr "Utawala wa %(app)s" + +msgid "Page not found" +msgstr "Ukurasa haujapatikana" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Samahani, ukurasa uliohitajika haukupatikana." + +msgid "Home" +msgstr "Sebule" + +msgid "Server error" +msgstr "Hitilafu ya seva" + +msgid "Server error (500)" +msgstr "Hitilafu ya seva (500)" + +msgid "Server Error (500)" +msgstr "Hitilafu ya seva (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Kumekuwa na hitilafu. Imeripotiwa kwa watawala kupitia barua pepe na " +"inatakiwa kurekebishwa mapema." + +msgid "Run the selected action" +msgstr "Fanya tendo lililochaguliwa." + +msgid "Go" +msgstr "Nenda" + +msgid "Click here to select the objects across all pages" +msgstr "Bofya hapa kuchagua viumbile katika kurasa zote" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Chagua kila %(module_name)s, (%(total_count)s). " + +msgid "Clear selection" +msgstr "Safisha chaguo" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Kwanza, ingiza jina lamtumiaji na nywila. Kisha, utaweza kuhariri zaidi " +"machaguo ya mtumiaji." + +msgid "Enter a username and password." +msgstr "Ingiza jina la mtumiaji na nywila." + +msgid "Change password" +msgstr "Badilisha nywila" + +msgid "Please correct the error below." +msgstr "Tafadhali sahihisha makosa yafuatayo " + +msgid "Please correct the errors below." +msgstr "Tafadhali sahihisha makosa yafuatayo." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "ingiza nywila ya mtumiaji %(username)s." + +msgid "Welcome," +msgstr "Karibu" + +msgid "View site" +msgstr "Tazama tovuti" + +msgid "Documentation" +msgstr "Nyaraka" + +msgid "Log out" +msgstr "Toka" + +#, python-format +msgid "Add %(name)s" +msgstr "Ongeza %(name)s" + +msgid "History" +msgstr "Historia" + +msgid "View on site" +msgstr "Ona kwenye tovuti" + +msgid "Filter" +msgstr "Chuja" + +msgid "Remove from sorting" +msgstr "Ondoa katika upangaji" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Kipaumbele katika mpangilio: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Geuza mpangilio" + +msgid "Delete" +msgstr "Futa" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Kufutwa kwa '%(escaped_object)s' %(object_name)s kutasababisha kufutwa kwa " +"vitu vinavyohuisana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " +"aina zifuatazo:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Kufuta '%(escaped_object)s' %(object_name)s kutahitaji kufuta vitu " +"vifuatavyo ambavyo vinavyohuisana na vimelindwa:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Una uhakika kuwa unataka kufuta \"%(escaped_object)s\" %(object_name)s ? " +"Vitu vyote vinavyohuisana kati ya vifuatavyo vitafutwa:" + +msgid "Objects" +msgstr "Viumbile" + +msgid "Yes, I'm sure" +msgstr "Ndiyo, Nina uhakika" + +msgid "No, take me back" +msgstr "Hapana, nirudishe" + +msgid "Delete multiple objects" +msgstr "Futa viumbile mbalimbali" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Kufutwa kwa %(objects_name)s chaguliwa kutasababisha kufutwa kwa " +"vituvinavyohusiana, lakini akaunti yako haina ruhusa ya kufuta vitu vya " +"vifuatavyo:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Kufutwa kwa %(objects_name)s kutahitaji kufutwa kwa vitu vifuatavyo vyenye " +"uhusiano na vilivyolindwa:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Una uhakika kuwa unataka kufuta %(objects_name)s chaguliwa ? Vitu vyote kati " +"ya vifuatavyo vinavyohusiana vitafutwa:" + +msgid "Change" +msgstr "Badilisha" + +msgid "Delete?" +msgstr "Futa?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " Kwa %(filter_title)s" + +msgid "Summary" +msgstr "Muhtasari" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models katika application %(name)s" + +msgid "Add" +msgstr "Ongeza" + +msgid "You don't have permission to edit anything." +msgstr "Huna ruhusa ya kuhariri chochote" + +msgid "Recent actions" +msgstr "Matendo ya karibuni" + +msgid "My actions" +msgstr "Matendo yangu" + +msgid "None available" +msgstr "Hakuna kilichopatikana" + +msgid "Unknown content" +msgstr "Maudhui hayajulikani" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Kuna tatizo limetokea katika usanikishaji wako wa hifadhidata. Hakikisha " +"kuwa majedwali sahihi ya hifadhidata yameundwa, na hakikisha hifadhidata " +"inaweza kusomwana mtumiaji sahihi." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "Umesahau jina na nenosiri lako?" + +msgid "Date/time" +msgstr "Tarehe/saa" + +msgid "User" +msgstr "Mtumiaji" + +msgid "Action" +msgstr "Tendo" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Kiumbile hiki hakina historia ya kubadilika. Inawezekana hakikuwekwa kupitia " +"hii tovuti ya utawala." + +msgid "Show all" +msgstr "Onesha yotee" + +msgid "Save" +msgstr "Hifadhi" + +msgid "Popup closing..." +msgstr "Udukizi unafunga" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Badili %(model)s husika" + +#, python-format +msgid "Add another %(model)s" +msgstr "Ongeza %(model)s tena" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Futa %(model)s husika" + +msgid "Search" +msgstr "Tafuta" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "tokeo %(counter)s" +msgstr[1] "matokeo %(counter)s" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "jumla %(full_result_count)s" + +msgid "Save as new" +msgstr "Hifadhi kama mpya" + +msgid "Save and add another" +msgstr "Hifadhi na ongeza" + +msgid "Save and continue editing" +msgstr "Hifadhi na endelea kuhariri" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Ahsante kwa kutumia muda wako katika Tovuti yetu leo. " + +msgid "Log in again" +msgstr "ingia tena" + +msgid "Password change" +msgstr "Badilisha nywila" + +msgid "Your password was changed." +msgstr "Nywila yako imebadilishwa" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Tafadhali ingiza nywila yako ya zamani, kwa ajili ya usalama, kisha ingiza " +"nywila mpya mara mbili ili tuweze kuthibitisha kuwa umelichapisha kwa " +"usahihi." + +msgid "Change my password" +msgstr "Badilisha nywila yangu" + +msgid "Password reset" +msgstr "Kuseti nywila upya" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Nywila yako imesetiwa. Unaweza kuendelea na kuingia sasa." + +msgid "Password reset confirmation" +msgstr "Uthibitisho wa kuseti nywila upya" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Tafadhali ingiza nywila mpya mara mbili ili tuweze kuthibitisha kuwa " +"umelichapisha kwa usahihi." + +msgid "New password:" +msgstr "Nywila mpya:" + +msgid "Confirm password:" +msgstr "Thibitisha nywila" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Kiungo cha kuseti nywila upya ni batili, inawezekana ni kwa sababu kiungo " +"hicho tayari kimetumika. tafadhali omba upya kuseti nywila." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Ikiwa hujapata barua pepe, tafadhali hakikisha umeingiza anuani ya barua " +"pepe uliyoitumia kujisajili na angalia katika folda la spam" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Umepata barua pepe hii kwa sababu ulihitaji ku seti upya nywila ya akaunti " +"yako ya %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Tafadhali nenda ukurasa ufuatao na uchague nywila mpya:" + +msgid "Your username, in case you've forgotten:" +msgstr "Jina lako la mtumiaji, ikiwa umesahau:" + +msgid "Thanks for using our site!" +msgstr "Ahsante kwa kutumia tovui yetu!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "timu ya %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Umesahau nywila yako? Ingiza anuani yako ya barua pepe hapo chini, nasi " +"tutakutumia maelekezo ya kuseti nenosiri jipya. " + +msgid "Email address:" +msgstr "Anuani ya barua pepe:" + +msgid "Reset my password" +msgstr "Seti nywila yangu upya" + +msgid "All dates" +msgstr "Tarehe zote" + +#, python-format +msgid "Select %s" +msgstr "Chagua %s" + +#, python-format +msgid "Select %s to change" +msgstr "Chaguo %s kwa mabadilisho" + +msgid "Date:" +msgstr "Tarehe" + +msgid "Time:" +msgstr "Saa" + +msgid "Lookup" +msgstr "`Lookup`" + +msgid "Currently:" +msgstr "Kwa sasa:" + +msgid "Change:" +msgstr "Badilisha:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..5806dd9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/sw/LC_MESSAGES/djangojs.po @@ -0,0 +1,217 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Machaku , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Yaliyomo: %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Hii ni orodha ya %s uliyochagua. Unaweza kuchagua baadhi vitu kwa kuvichagua " +"katika kisanduku hapo chini kisha kubofya mshale wa \"Chagua\" kati ya " +"visanduku viwili." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Chapisha katika kisanduku hiki ili kuchuja orodha ya %s iliyopo." + +msgid "Filter" +msgstr "Chuja" + +msgid "Choose all" +msgstr "Chagua vyote" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Bofya kuchagua %s kwa pamoja." + +msgid "Choose" +msgstr "Chagua" + +msgid "Remove" +msgstr "Ondoa" + +#, javascript-format +msgid "Chosen %s" +msgstr "Chaguo la %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Hii ni orodha ya %s uliyochagua. Unaweza kuondoa baadhi vitu kwa kuvichagua " +"katika kisanduku hapo chini kisha kubofya mshale wa \"Ondoa\" kati ya " +"visanduku viwili." + +msgid "Remove all" +msgstr "Ondoa vyote" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Bofya ili kuondoa %s chaguliwa kwa pamoja." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "umechagua %(sel)s kati ya %(cnt)s" +msgstr[1] "umechagua %(sel)s kati ya %(cnt)s" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Umeacha kuhifadhi mabadiliko katika uga zinazoharirika. Ikiwa utafanya tendo " +"lingine, mabadiliko ambayo hayajahifadhiwa yatapotea." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " +"Tafadali bofya Sawa ukitaka kuhifadhi. Utahitajika kufanya upya kitendo " + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Umechagua tendo, lakini bado hujahifadhi mabadiliko yako katika uga husika. " +"Inawezekana unatafuta kitufe cha Nenda badala ya Hifadhi" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Kumbuka: Uko saa %s mbele ukilinganisha na majira ya seva" +msgstr[1] "Kumbuka: Uko masaa %s mbele ukilinganisha na majira ya seva" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Kumbuka: Uko saa %s nyuma ukilinganisha na majira ya seva" +msgstr[1] "Kumbuka: Uko masaa %s nyuma ukilinganisha na majira ya seva" + +msgid "Now" +msgstr "Sasa" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Chagua wakati" + +msgid "Midnight" +msgstr "Usiku wa manane" + +msgid "6 a.m." +msgstr "Saa 12 alfajiri" + +msgid "Noon" +msgstr "Adhuhuri" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Ghairi" + +msgid "Today" +msgstr "Leo" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Jana" + +msgid "Tomorrow" +msgstr "Kesho" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Onesha" + +msgid "Hide" +msgstr "Ficha" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..3393111 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0a7bfcc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ta/LC_MESSAGES/djangojs.po @@ -0,0 +1,204 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s இருக்கிறதா " + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" + +msgid "Filter" +msgstr "வடிகட்டி" + +msgid "Choose all" +msgstr "எல்லாவற்றையும் தேர்ந்த்தெடுக்க" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "" + +msgid "Choose" +msgstr "" + +msgid "Remove" +msgstr "அழிக்க" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s தேர்ந்த்தெடுக்கப்பட்ட" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" + +msgid "Remove all" +msgstr "" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Now" +msgstr "இப்பொழுது " + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "ஒரு நேரத்தை தேர்ந்த்தெடுக்க " + +msgid "Midnight" +msgstr "நடு இரவு " + +msgid "6 a.m." +msgstr "காலை 6 மணி " + +msgid "Noon" +msgstr "மதியம் " + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "வேண்டாம் " + +msgid "Today" +msgstr "இன்று " + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "நேற்று " + +msgid "Tomorrow" +msgstr "நாளை" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "" + +msgid "Hide" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..92b65f1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/te/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..71eff63 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/th/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..52d2c99 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po @@ -0,0 +1,221 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BouRock, 2015-2016 +# BouRock, 2014 +# Jannis Leidel , 2011 +# Metin Amiroff , 2011 +# Murat Çorlu , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Mevcut %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Bu mevcut %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve ondan " +"sonra iki kutu arasındaki \"Seçin\" okuna tıklayarak seçebilirsiniz." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Mevcut %s listesini süzmek için bu kutu içine yazın." + +msgid "Filter" +msgstr "Süzgeç" + +msgid "Choose all" +msgstr "Tümünü seçin" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Bir kerede tüm %s seçilmesi için tıklayın." + +msgid "Choose" +msgstr "Seçin" + +msgid "Remove" +msgstr "Kaldır" + +#, javascript-format +msgid "Chosen %s" +msgstr "Seçilen %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Bu seçilen %s listesidir. Aşağıdaki kutudan bazılarını işaretleyerek ve " +"ondan sonra iki kutu arasındaki \"Kaldır\" okuna tıklayarak " +"kaldırabilirsiniz." + +msgid "Remove all" +msgstr "Tümünü kaldır" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Bir kerede tüm seçilen %s kaldırılması için tıklayın." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s / %(cnt)s seçildi" +msgstr[1] "%(sel)s / %(cnt)s seçildi" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Bireysel düzenlenebilir alanlarda kaydedilmemiş değişiklikleriniz var. Eğer " +"bir eylem çalıştırırsanız, kaydedilmemiş değişiklikleriniz kaybolacaktır." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Bir eylem seçtiniz, fakat henüz bireysel alanlara değişikliklerinizi " +"kaydetmediniz. Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi " +"yeniden çalıştırmanız gerekecek." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Bir eylem seçtiniz, fakat bireysel alanlar üzerinde hiçbir değişiklik " +"yapmadınız. Muhtemelen Kaydet düğmesi yerine Git düğmesini arıyorsunuz." + +msgid "Now" +msgstr "Şimdi" + +msgid "Midnight" +msgstr "Geceyarısı" + +msgid "6 a.m." +msgstr "Sabah 6" + +msgid "Noon" +msgstr "Öğle" + +msgid "6 p.m." +msgstr "6 ö.s." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Not: Sunucu saatinin %s saat ilerisindesiniz." +msgstr[1] "Not: Sunucu saatinin %s saat ilerisindesiniz." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Not: Sunucu saatinin %s saat gerisindesiniz." +msgstr[1] "Not: Sunucu saatinin %s saat gerisindesiniz." + +msgid "Choose a Time" +msgstr "Bir Saat Seçin" + +msgid "Choose a time" +msgstr "Bir saat seçin" + +msgid "Cancel" +msgstr "İptal" + +msgid "Today" +msgstr "Bugün" + +msgid "Choose a Date" +msgstr "Bir Tarih Seçin" + +msgid "Yesterday" +msgstr "Dün" + +msgid "Tomorrow" +msgstr "Yarın" + +msgid "January" +msgstr "Ocak" + +msgid "February" +msgstr "Şubat" + +msgid "March" +msgstr "Mart" + +msgid "April" +msgstr "Nisan" + +msgid "May" +msgstr "Mayıs" + +msgid "June" +msgstr "Haziran" + +msgid "July" +msgstr "Temmuz" + +msgid "August" +msgstr "Ağustos" + +msgid "September" +msgstr "Eylül" + +msgid "October" +msgstr "Ekim" + +msgid "November" +msgstr "Kasım" + +msgid "December" +msgstr "Aralık" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "P" + +msgctxt "one letter Monday" +msgid "M" +msgstr "P" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "S" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Ç" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "P" + +msgctxt "one letter Friday" +msgid "F" +msgstr "C" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "C" + +msgid "Show" +msgstr "Göster" + +msgid "Hide" +msgstr "Gizle" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6bfde60 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..9d0260b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,655 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Azat Khasanshin , 2011 +# v_ildar , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s уңышлы рәвештә бетерелгән." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s бетереп булмады" + +msgid "Are you sure?" +msgstr "Сез инанып карар кылдыгызмы?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Сайланган %(verbose_name_plural)s бетерергә" + +msgid "Administration" +msgstr "" + +msgid "All" +msgstr "Барысы" + +msgid "Yes" +msgstr "Әйе" + +msgid "No" +msgstr "Юк" + +msgid "Unknown" +msgstr "Билгесез" + +msgid "Any date" +msgstr "Теләсә нинди көн һәм вакыт" + +msgid "Today" +msgstr "Бүген" + +msgid "Past 7 days" +msgstr "Соңгы 7 көн" + +msgid "This month" +msgstr "Бу ай" + +msgid "This year" +msgstr "Бу ел" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" + +msgid "Action:" +msgstr "Гамәл:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Тагын бер %(verbose_name)s өстәргә" + +msgid "Remove" +msgstr "Бетерергә" + +msgid "action time" +msgstr "гамәл вакыты" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "object id" +msgstr "объект идентификаторы" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "объект фаразы" + +msgid "action flag" +msgstr "гамәл тибы" + +msgid "change message" +msgstr "үзгәрү белдерүе" + +msgid "log entry" +msgstr "журнал язмасы" + +msgid "log entries" +msgstr "журнал язмалары" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "" + +msgid "LogEntry Object" +msgstr "" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "" + +msgid "Added." +msgstr "" + +msgid "and" +msgstr "һәм" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Үзгәртелгән кырлар юк." + +msgid "None" +msgstr "Юк" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Элементар өстеннән гамәл кылу өчен алар сайланган булырга тиеш. Элементлар " +"үзгәртелмәгән." + +msgid "No action selected." +msgstr "Гамәл сайланмаган." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" уңышлы рәвештә бетерелгән." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "%s өстәргә" + +#, python-format +msgid "Change %s" +msgstr "%s үзгәртергә" + +msgid "Database error" +msgstr "Бирелмәләр базасы хатасы" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s уңышлы рәвештә үзгәртелгән." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s сайланган" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Барлык %(cnt)s объектан 0 сайланган" + +#, python-format +msgid "Change history: %s" +msgstr "Үзгәртү тарихы: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "Django сайты идарәсе" + +msgid "Django administration" +msgstr "Django идарәсе" + +msgid "Site administration" +msgstr "Сайт идарәсе" + +msgid "Log in" +msgstr "Керергә" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "Сәхифә табылмаган" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Кызганычка каршы, соралган сәхифә табылмады." + +msgid "Home" +msgstr "Башбит" + +msgid "Server error" +msgstr "Сервер хатасы" + +msgid "Server error (500)" +msgstr "Сервер хатасы (500)" + +msgid "Server Error (500)" +msgstr "Сервер хатасы (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Сайланган гамәлне башкарырга" + +msgid "Go" +msgstr "Башкарырга" + +msgid "Click here to select the objects across all pages" +msgstr "Барлык сәхифәләрдә булган объектларны сайлау өчен монда чирттерегез" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Бөтен %(total_count)s %(module_name)s сайларга" + +msgid "Clear selection" +msgstr "Сайланганлыкны алырга" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Баштан логин һәм серсүзне кертегез. Аннан соң сез кулланучы турында күбрәк " +"мәгълүматне төзәтә алырсыз." + +msgid "Enter a username and password." +msgstr "Логин һәм серсүзне кертегез." + +msgid "Change password" +msgstr "Серсүзне үзгәртергә" + +msgid "Please correct the error below." +msgstr "Зинһар, биредәге хаталарны төзәтегез." + +msgid "Please correct the errors below." +msgstr "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s кулланучы өчен яңа серсүзне кертегез." + +msgid "Welcome," +msgstr "Рәхим итегез," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Документация" + +msgid "Log out" +msgstr "Чыгарга" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s өстәргә" + +msgid "History" +msgstr "Тарих" + +msgid "View on site" +msgstr "Сайтта карарга" + +msgid "Filter" +msgstr "Филтер" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "" + +msgid "Delete" +msgstr "Бетерергә" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' бетереүе аның белән бәйләнгән " +"объектларның бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе " +"объект тибларын бетерү өчен хокуклары җитми:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s' бетерүе киләсе сакланган объектларның " +"бетерелүен таләп итә:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Сез инанып %(object_name)s \"%(escaped_object)s\" бетерергә телисезме? " +"Барлык киләсе бәйләнгән объектлар да бетерелер:" + +msgid "Objects" +msgstr "" + +msgid "Yes, I'm sure" +msgstr "Әйе, мин инандым" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Берничә объектны бетерергә" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Сайланган %(objects_name)s бетерүе аның белән бәйләнгән объектларның " +"бетерелүенә китерә ала, әмма сезнең хисап язмагызның киләсе объект тибларын " +"бетерү өчен хокуклары җитми:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"%(objects_name)s бетерүе киләсе аның белән бәйләнгән сакланган объектларның " +"бетерелүен таләп итә:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Сез инанып %(objects_name)s бетерергә телисезме? Барлык киләсе объектлар һәм " +"алар белән бәйләнгән элементлар да бетерелер:" + +msgid "Change" +msgstr "Үзгәртергә" + +msgid "Delete?" +msgstr "Бетерергә?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s буенча" + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Өстәргә" + +msgid "You don't have permission to edit anything." +msgstr "Төзәтү өчен хокукларыгыз җитми." + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Тарих юк" + +msgid "Unknown content" +msgstr "Билгесез тип" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Сезнең бирелмәләр базасы дөрес итем көйләнмәгән. Тиешле җәдвәлләр төзелгәнен " +"һәм тиешле кулланучының хокуклары җитәрлек булуын тикшерегез." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "" + +msgid "Date/time" +msgstr "Көн һәм вакыт" + +msgid "User" +msgstr "Кулланучы" + +msgid "Action" +msgstr "Гамәл" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Әлеге объектның үзгәртү тарихы юк. Бу идарә итү сайты буенча өстәлмәгән " +"булуы ихтимал." + +msgid "Show all" +msgstr "Бөтенесен күрсәтергә" + +msgid "Save" +msgstr "Сакларга" + +msgid "Popup closing..." +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +msgid "Search" +msgstr "Эзләргә" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s нәтиҗә" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "барлыгы %(full_result_count)s" + +msgid "Save as new" +msgstr "Яңа объект итеп сакларга" + +msgid "Save and add another" +msgstr "Сакларга һәм бүтән объектны өстәргә" + +msgid "Save and continue editing" +msgstr "Сакларга һәм төзәтүне дәвам итәргә" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Сайтыбызда үткәргән вакыт өчен рәхмәт." + +msgid "Log in again" +msgstr "Тагын керергә" + +msgid "Password change" +msgstr "Серсүзне үзгәртү" + +msgid "Your password was changed." +msgstr "Серсүзегез үзгәртелгән." + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Хәвефсезлек сәбәпле, зинһар, үзегезнең иске серсүзне кертегез, аннан яңа " +"серсүзне ике тапкыр кертегез (дөрес язылышын тикшерү өчен)." + +msgid "Change my password" +msgstr "Серсүземне үзгәртергә" + +msgid "Password reset" +msgstr "Серсүзне торгызу" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Серсүзегез үзгәртелгән. Сез хәзер керә аласыз." + +msgid "Password reset confirmation" +msgstr "Серсүзне торгызу раслау" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "Зинһар, тикшерү өчен яңа серсүзегезне ике тапкыр кертегез." + +msgid "New password:" +msgstr "Яңа серсуз:" + +msgid "Confirm password:" +msgstr "Серсүзне раслагыз:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Серсүзне торгызу өчен сылтама хаталы. Бәлки аның белән инде кулланганнар. " +"Зинһар, серсүзне тагын бер тапкыр торгызып карагыз." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "Зинһар, бу сәхифәгә юнәлегез һәм яңа серсүзне кертегез:" + +msgid "Your username, in case you've forgotten:" +msgstr "Сезнең кулланучы исемегез (оныткан булсагыз):" + +msgid "Thanks for using our site!" +msgstr "Безнең сайтны куллану өчен рәхмәт!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s сайтының төркеме" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "Эл. почта адресы:" + +msgid "Reset my password" +msgstr "Серсүземне торгызырга" + +msgid "All dates" +msgstr "Бөтен көннәр" + +#, python-format +msgid "Select %s" +msgstr "%s сайлагыз" + +#, python-format +msgid "Select %s to change" +msgstr "Үзгәртү өчен %s сайлагыз" + +msgid "Date:" +msgstr "Көн:" + +msgid "Time:" +msgstr "Вакыт:" + +msgid "Lookup" +msgstr "Эзләү" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..16af5a0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/tt/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..502c548 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po @@ -0,0 +1,230 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Oleksandr Chernihov , 2014 +# Boryslav Larin , 2011 +# Денис Подлесный , 2016 +# Jannis Leidel , 2011 +# panasoft , 2016 +# Sergey Lysach , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2017-09-19 16:41+0000\n" +"Last-Translator: Денис Подлесный \n" +"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" +"uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " +"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " +"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " +"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#, javascript-format +msgid "Available %s" +msgstr "В наявності %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Це список всіх доступних %s. Ви можете обрати деякі з них, виділивши їх у " +"полі нижче і натиснувшт кнопку \"Обрати\"." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" +"Почніть вводити текст в цьому полі щоб відфільтрувати список доступних %s." + +msgid "Filter" +msgstr "Фільтр" + +msgid "Choose all" +msgstr "Обрати всі" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Натисніть щоб обрати всі %s відразу." + +msgid "Choose" +msgstr "Обрати" + +msgid "Remove" +msgstr "Видалити" + +#, javascript-format +msgid "Chosen %s" +msgstr "Обрано %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Це список обраних %s. Ви можете видалити деякі з них, виділивши їх у полі " +"нижче і натиснувши кнопку \"Видалити\"." + +msgid "Remove all" +msgstr "Видалити все" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Натисніть щоб видалити всі обрані %s відразу." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "Обрано %(sel)s з %(cnt)s" +msgstr[1] "Обрано %(sel)s з %(cnt)s" +msgstr[2] "Обрано %(sel)s з %(cnt)s" +msgstr[3] "Обрано %(sel)s з %(cnt)s" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Ви зробили якісь зміни у деяких полях. Якщо Ви виконаєте цю дію, всі " +"незбережені зміни буде втрачено." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Ви обрали дію, але не зберегли зміни в окремих полях. Будь ласка, натисніть " +"ОК, щоб зберегти. Вам доведеться повторно запустити дію." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Ви обрали дію і не зробили жодних змін у полях. Ви, напевно, шукаєте кнопку " +"\"Виконати\", а не \"Зберегти\"." + +msgid "Now" +msgstr "Зараз" + +msgid "Midnight" +msgstr "Північ" + +msgid "6 a.m." +msgstr "6" + +msgid "Noon" +msgstr "Полудень" + +msgid "6 p.m." +msgstr "18:00" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Примітка: Ви на %s годину попереду серверного часу." +msgstr[1] "Примітка: Ви на %s години попереду серверного часу." +msgstr[2] "Примітка: Ви на %s годин попереду серверного часу." +msgstr[3] "Примітка: Ви на %s годин попереду серверного часу." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Примітка: Ви на %s годину позаду серверного часу." +msgstr[1] "Примітка: Ви на %s години позаду серверного часу." +msgstr[2] "Примітка: Ви на %s годин позаду серверного часу." +msgstr[3] "Примітка: Ви на %s годин позаду серверного часу." + +msgid "Choose a Time" +msgstr "Оберіть час" + +msgid "Choose a time" +msgstr "Оберіть час" + +msgid "Cancel" +msgstr "Відмінити" + +msgid "Today" +msgstr "Сьогодні" + +msgid "Choose a Date" +msgstr "Оберіть дату" + +msgid "Yesterday" +msgstr "Вчора" + +msgid "Tomorrow" +msgstr "Завтра" + +msgid "January" +msgstr "січня" + +msgid "February" +msgstr "лютого" + +msgid "March" +msgstr "березня" + +msgid "April" +msgstr "квітня" + +msgid "May" +msgstr "травня" + +msgid "June" +msgstr "червня" + +msgid "July" +msgstr "липня" + +msgid "August" +msgstr "серпня" + +msgid "September" +msgstr "вересня" + +msgid "October" +msgstr "жовтня" + +msgid "November" +msgstr "листопада" + +msgid "December" +msgstr "грудня" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Н" + +msgctxt "one letter Monday" +msgid "M" +msgstr "П" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "В" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "С" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "Ч" + +msgctxt "one letter Friday" +msgid "F" +msgstr "П" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "С" + +msgid "Show" +msgstr "Показати" + +msgid "Hide" +msgstr "Сховати" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..65de198 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/ur/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..68fd78c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,702 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Dimitris Glezos , 2012 +# Jannis Leidel , 2011 +# Thanh Le Viet , 2013 +# Tran , 2011 +# Tran Van , 2011-2013,2016,2018 +# Vuong Nguyen , 2011 +# xgenvn , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 00:36+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" +"vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Đã xóa thành công %(count)d %(items)s ." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Không thể xóa %(name)s" + +msgid "Are you sure?" +msgstr "Bạn có chắc chắn không?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Xóa các %(verbose_name_plural)s đã chọn" + +msgid "Administration" +msgstr "Quản trị website" + +msgid "All" +msgstr "Tất cả" + +msgid "Yes" +msgstr "Có" + +msgid "No" +msgstr "Không" + +msgid "Unknown" +msgstr "Chưa xác định" + +msgid "Any date" +msgstr "Bất kì ngày nào" + +msgid "Today" +msgstr "Hôm nay" + +msgid "Past 7 days" +msgstr "7 ngày trước" + +msgid "This month" +msgstr "Tháng này" + +msgid "This year" +msgstr "Năm nay" + +msgid "No date" +msgstr "" + +msgid "Has date" +msgstr "" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Bạn hãy nhập đúng %(username)s và mật khẩu. (Có phân biệt chữ hoa, thường)" + +msgid "Action:" +msgstr "Hoạt động:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Thêm một %(verbose_name)s " + +msgid "Remove" +msgstr "Gỡ bỏ" + +msgid "Addition" +msgstr "" + +msgid "Change" +msgstr "Thay đổi" + +msgid "Deletion" +msgstr "" + +msgid "action time" +msgstr "Thời gian tác động" + +msgid "user" +msgstr "" + +msgid "content type" +msgstr "kiểu nội dung" + +msgid "object id" +msgstr "Mã đối tượng" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "đối tượng repr" + +msgid "action flag" +msgstr "hiệu hành động" + +msgid "change message" +msgstr "thay đổi tin nhắn" + +msgid "log entry" +msgstr "đăng nhập" + +msgid "log entries" +msgstr "mục đăng nhập" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "Thêm \"%(object)s\"." + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "Đã thay đổi \"%(object)s\" - %(changes)s" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "Đối tượng \"%(object)s.\" đã được xoá." + +msgid "LogEntry Object" +msgstr "LogEntry Object" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" đã được thêm vào." + +msgid "Added." +msgstr "Được thêm." + +msgid "and" +msgstr "và" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "" + +msgid "No fields changed." +msgstr "Không có trường nào thay đổi" + +msgid "None" +msgstr "Không" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "" +"Giữ phím \"Control\", hoặc \"Command\" trên Mac, để chọn nhiều hơn một." + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Mục tiêu phải được chọn mới có thể thực hiện hành động trên chúng. Không có " +"mục tiêu nào đã được thay đổi." + +msgid "No action selected." +msgstr "Không có hoạt động nào được lựa chọn." + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" đã được xóa thành công." + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Thêm %s" + +#, python-format +msgid "Change %s" +msgstr "Thay đổi %s" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "Cơ sở dữ liệu bị lỗi" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] " %(count)s %(name)s đã được thay đổi thành công." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Tất cả %(total_count)s đã được chọn" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 của %(cnt)s được chọn" + +#, python-format +msgid "Change history: %s" +msgstr "Lịch sử thay đổi: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Xóa %(class_name)s %(instance)s sẽ tự động xóa các đối tượng liên quan sau: " +"%(related_objects)s" + +msgid "Django site admin" +msgstr "Trang web admin Django" + +msgid "Django administration" +msgstr "Trang quản trị cho Django" + +msgid "Site administration" +msgstr "Site quản trị hệ thống." + +msgid "Log in" +msgstr "Đăng nhập" + +#, python-format +msgid "%(app)s administration" +msgstr "Quản lý %(app)s" + +msgid "Page not found" +msgstr "Không tìm thấy trang nào" + +msgid "We're sorry, but the requested page could not be found." +msgstr "Xin lỗi bạn! Trang mà bạn yêu cầu không tìm thấy." + +msgid "Home" +msgstr "Trang chủ" + +msgid "Server error" +msgstr "Lỗi máy chủ" + +msgid "Server error (500)" +msgstr "Lỗi máy chủ (500)" + +msgid "Server Error (500)" +msgstr "Lỗi máy chủ (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Có lỗi xảy ra. Lỗi sẽ được gửi đến quản trị website qua email và sẽ được " +"khắc phục sớm. Cám ơn bạn." + +msgid "Run the selected action" +msgstr "Bắt đầu hành động lựa chọn" + +msgid "Go" +msgstr "Đi đến" + +msgid "Click here to select the objects across all pages" +msgstr "Click vào đây để lựa chọn các đối tượng trên tất cả các trang" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Hãy chọn tất cả %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "Xóa lựa chọn" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "" +"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó bạn mới có thể chỉnh sửa " +"nhiều hơn lựa chọn của người dùng." + +msgid "Enter a username and password." +msgstr "Điền tên đăng nhập và mật khẩu." + +msgid "Change password" +msgstr "Đổi mật khẩu" + +msgid "Please correct the error below." +msgstr "Hãy sửa lỗi sai dưới đây" + +msgid "Please correct the errors below." +msgstr "Hãy chỉnh sửa lại các lỗi sau." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Hãy nhập mật khẩu mới cho người sử dụng %(username)s." + +msgid "Welcome," +msgstr "Chào mừng bạn," + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "Tài liệu" + +msgid "Log out" +msgstr "Thoát" + +#, python-format +msgid "Add %(name)s" +msgstr "Thêm vào %(name)s" + +msgid "History" +msgstr "Bản ghi nhớ" + +msgid "View on site" +msgstr "Xem trên trang web" + +msgid "Filter" +msgstr "Bộ lọc" + +msgid "Remove from sorting" +msgstr "Bỏ khỏi sắp xếp" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Sắp xếp theo:%(priority_number)s" + +msgid "Toggle sorting" +msgstr "Hoán đổi sắp xếp" + +msgid "Delete" +msgstr "Xóa" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Xóa %(object_name)s '%(escaped_object)s' sẽ làm mất những dữ liệu có liên " +"quan. Tài khoản của bạn không được cấp quyển xóa những dữ liệu đi kèm theo." + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Xóa các %(object_name)s ' %(escaped_object)s ' sẽ bắt buộc xóa các đối " +"tượng được bảo vệ sau đây:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Bạn có chắc là muốn xóa %(object_name)s \"%(escaped_object)s\"?Tất cả những " +"dữ liệu đi kèm dưới đây cũng sẽ bị mất:" + +msgid "Objects" +msgstr "Đối tượng" + +msgid "Yes, I'm sure" +msgstr "Có, tôi chắc chắn." + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "Xóa nhiều đối tượng" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng liên quan, nhưng tài " +"khoản của bạn không có quyền xóa các loại đối tượng sau đây:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Xóa các %(objects_name)s sẽ bắt buộc xóa các đối tượng đã được bảo vệ sau " +"đây:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Bạn chắc chắn muốn xóa những lựa chọn %(objects_name)s? Tất cả những đối " +"tượng sau và những đối tượng liên quan sẽ được xóa:" + +msgid "View" +msgstr "" + +msgid "Delete?" +msgstr "Bạn muốn xóa?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Bởi %(filter_title)s " + +msgid "Summary" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Các mô models trong %(name)s" + +msgid "Add" +msgstr "Thêm vào" + +msgid "You don't have permission to view or edit anything." +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "Không có sẵn" + +msgid "Unknown content" +msgstr "Không biết nội dung" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Một vài lỗi với cơ sở dữ liệu cài đặt của bạn. Hãy chắc chắn bảng biểu dữ " +"liệu được tạo phù hợp và dữ liệu có thể được đọc bởi những người sử dụng phù " +"hợp." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Bạn đã xác thực bằng tài khoản %(username)s, nhưng không đủ quyền để truy " +"cập trang này. Bạn có muốn đăng nhập bằng một tài khoản khác?" + +msgid "Forgotten your password or username?" +msgstr "Bạn quên mật khẩu hoặc tài khoản?" + +msgid "Date/time" +msgstr "Ngày/giờ" + +msgid "User" +msgstr "Người dùng" + +msgid "Action" +msgstr "Hành động" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Đối tượng này không có một lịch sử thay đổi. Nó có lẽ đã không được thêm vào " +"qua trang web admin." + +msgid "Show all" +msgstr "Hiện tất cả" + +msgid "Save" +msgstr "Lưu lại" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "Tìm kiếm" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s kết quả" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "tổng số %(full_result_count)s" + +msgid "Save as new" +msgstr "Lưu mới" + +msgid "Save and add another" +msgstr "Lưu và thêm mới" + +msgid "Save and continue editing" +msgstr "Lưu và tiếp tục chỉnh sửa" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "Thêm %(model)s khác" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Xóa %(model)s đã chọn" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Cảm ơn bạn đã dành thời gian với website này" + +msgid "Log in again" +msgstr "Đăng nhập lại" + +msgid "Password change" +msgstr "Thay đổi mật khẩu" + +msgid "Your password was changed." +msgstr "Mật khẩu của bạn đã được thay đổi" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Hãy nhập lại mật khẩu cũ và sau đó nhập mật khẩu mới hai lần để chúng tôi có " +"thể kiểm tra lại xem bạn đã gõ chính xác hay chưa." + +msgid "Change my password" +msgstr "Thay đổi mật khẩu" + +msgid "Password reset" +msgstr "Lập lại mật khẩu" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Mật khẩu của bạn đã được lập lại. Bạn hãy thử đăng nhập." + +msgid "Password reset confirmation" +msgstr "Xác nhận việc lập lại mật khẩu" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Hãy nhập mật khẩu mới hai lần để chúng tôi có thể kiểm tra xem bạn đã gõ " +"chính xác chưa" + +msgid "New password:" +msgstr "Mật khẩu mới" + +msgid "Confirm password:" +msgstr "Nhập lại mật khẩu:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Liên kết đặt lại mật khẩu không hợp lệ, có thể vì nó đã được sử dụng. Xin " +"vui lòng yêu cầu đặt lại mật khẩu mới." + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Nếu bạn không nhận được email, hãy kiểm tra lại địa chỉ email mà bạn dùng để " +"đăng kí hoặc kiểm tra trong thư mục spam/rác" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Bạn nhận được email này vì bạn đã yêu cầu làm mới lại mật khẩu cho tài khoản " +"của bạn tại %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "Hãy vào đường link dưới đây và chọn một mật khẩu mới" + +msgid "Your username, in case you've forgotten:" +msgstr "Tên đăng nhập của bạn, trường hợp bạn quên nó:" + +msgid "Thanks for using our site!" +msgstr "Cảm ơn bạn đã sử dụng website của chúng tôi!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Đội của %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"Quên mật khẩu? Nhập địa chỉ email vào ô dưới đây. Chúng tôi sẽ email cho bạn " +"hướng dẫn cách thiết lập mật khẩu mới." + +msgid "Email address:" +msgstr "Địa chỉ Email:" + +msgid "Reset my password" +msgstr "Làm lại mật khẩu" + +msgid "All dates" +msgstr "Tất cả các ngày" + +#, python-format +msgid "Select %s" +msgstr "Chọn %s" + +#, python-format +msgid "Select %s to change" +msgstr "Chọn %s để thay đổi" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "Ngày:" + +msgid "Time:" +msgstr "Giờ:" + +msgid "Lookup" +msgstr "Tìm" + +msgid "Currently:" +msgstr "Hiện nay:" + +msgid "Change:" +msgstr "Thay đổi:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..d2155ca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Tran , 2011 +# Tran Van , 2013 +# Vuong Nguyen , 2011 +# xgenvn , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-17 23:12+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" +"vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "Có sẵn %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Danh sách các lựa chọn đang có %s. Bạn có thể chọn bằng bách click vào mũi " +"tên \"Chọn\" nằm giữa hai hộp." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Bạn hãy nhập vào ô này để lọc các danh sách sau %s." + +msgid "Filter" +msgstr "Lọc" + +msgid "Choose all" +msgstr "Chọn tất cả" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Click để chọn tất cả %s ." + +msgid "Choose" +msgstr "Chọn" + +msgid "Remove" +msgstr "Xóa" + +#, javascript-format +msgid "Chosen %s" +msgstr "Chọn %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Danh sách bạn đã chọn %s. Bạn có thể bỏ chọn bằng cách click vào mũi tên " +"\"Xoá\" nằm giữa hai ô." + +msgid "Remove all" +msgstr "Xoá tất cả" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Click để bỏ chọn tất cả %s" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] " %(sel)s của %(cnt)s được chọn" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Bạn chưa lưu những trường đã chỉnh sửa. Nếu bạn chọn hành động này, những " +"chỉnh sửa chưa được lưu sẽ bị mất." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"Bạn đã lựa chọn một hành động, nhưng bạn không lưu thay đổi của bạn đến các " +"lĩnh vực cá nhân được nêu ra. Xin vui lòng click OK để lưu lại. Bạn sẽ cần " +"phải chạy lại các hành động." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Bạn đã lựa chọn một hành động, và bạn đã không thực hiện bất kỳ thay đổi nào " +"trên các trường. Có lẽ bạn đang tìm kiếm nút bấm Go thay vì nút bấm Save." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +"Lưu ý: Hiện tại bạn đang thấy thời gian trước %s giờ so với thời gian máy " +"chủ." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +"Lưu ý: Hiện tại bạn đang thấy thời gian sau %s giờ so với thời gian máy chủ." + +msgid "Now" +msgstr "Bây giờ" + +msgid "Choose a Time" +msgstr "" + +msgid "Choose a time" +msgstr "Chọn giờ" + +msgid "Midnight" +msgstr "Nửa đêm" + +msgid "6 a.m." +msgstr "6 giờ sáng" + +msgid "Noon" +msgstr "Buổi trưa" + +msgid "6 p.m." +msgstr "" + +msgid "Cancel" +msgstr "Hủy bỏ" + +msgid "Today" +msgstr "Hôm nay" + +msgid "Choose a Date" +msgstr "" + +msgid "Yesterday" +msgstr "Hôm qua" + +msgid "Tomorrow" +msgstr "Ngày mai" + +msgid "January" +msgstr "" + +msgid "February" +msgstr "" + +msgid "March" +msgstr "" + +msgid "April" +msgstr "" + +msgid "May" +msgstr "" + +msgid "June" +msgstr "" + +msgid "July" +msgstr "" + +msgid "August" +msgstr "" + +msgid "September" +msgstr "" + +msgid "October" +msgstr "" + +msgid "November" +msgstr "" + +msgid "December" +msgstr "" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "" + +msgctxt "one letter Monday" +msgid "M" +msgstr "" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "" + +msgctxt "one letter Friday" +msgid "F" +msgstr "" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "" + +msgid "Show" +msgstr "Hiện ra" + +msgid "Hide" +msgstr "Dấu đi" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..2df6930 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..b37c864 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po @@ -0,0 +1,220 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bai HuanCheng (Bestony) , 2018 +# Jannis Leidel , 2011 +# Kewei Ma , 2016 +# Lele Long , 2011,2015 +# Liping Wang , 2016 +# mozillazg , 2016 +# slene , 2011 +# spaceoi , 2016 +# Ziang Song , 2012 +# Kevin Sze , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:50+0200\n" +"PO-Revision-Date: 2018-01-14 07:41+0000\n" +"Last-Translator: Bai HuanCheng (Bestony) \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "可用 %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"这是可用的%s列表。你可以在选择框下面进行选择,然后点击两选框之间的“选择”箭" +"头。" + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "在此框中键入以过滤可用的%s列表" + +msgid "Filter" +msgstr "过滤" + +msgid "Choose all" +msgstr "全选" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "点击选择全部%s。" + +msgid "Choose" +msgstr "选择" + +msgid "Remove" +msgstr "删除" + +#, javascript-format +msgid "Chosen %s" +msgstr "选中的 %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"这是选中的 %s 的列表。你可以在选择框下面进行选择,然后点击两选框之间的“删" +"除”箭头进行删除。" + +msgid "Remove all" +msgstr "删除全部" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "删除所有已选择的%s。" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失." + +msgid "" +"You have selected an action, but you haven't saved your changes to " +"individual fields yet. Please click OK to save. You'll need to re-run the " +"action." +msgstr "" +"你已选则执行一个动作, 但有一个可编辑栏位的变更尚未保存. 请点选确定进行保存. " +"再重新执行该动作." + +msgid "" +"You have selected an action, and you haven't made any changes on individual " +"fields. You're probably looking for the Go button rather than the Save " +"button." +msgstr "" +"你已选则执行一个动作, 但可编辑栏位沒有任何改变. 你应该尝试 '去' 按钮, 而不是 " +"'保存' 按钮." + +msgid "Now" +msgstr "现在" + +msgid "Midnight" +msgstr "午夜" + +msgid "6 a.m." +msgstr "上午6点" + +msgid "Noon" +msgstr "正午" + +msgid "6 p.m." +msgstr "下午6点" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "注意:你比服务器时间超前 %s 个小时。" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "注意:你比服务器时间滞后 %s 个小时。" + +msgid "Choose a Time" +msgstr "选择一个时间" + +msgid "Choose a time" +msgstr "选择一个时间" + +msgid "Cancel" +msgstr "取消" + +msgid "Today" +msgstr "今天" + +msgid "Choose a Date" +msgstr "选择一个日期" + +msgid "Yesterday" +msgstr "昨天" + +msgid "Tomorrow" +msgstr "明天" + +msgid "January" +msgstr "一月" + +msgid "February" +msgstr "二月" + +msgid "March" +msgstr "三月" + +msgid "April" +msgstr "四月" + +msgid "May" +msgstr "五月" + +msgid "June" +msgstr "六月" + +msgid "July" +msgstr "七月" + +msgid "August" +msgstr "八月" + +msgid "September" +msgstr "九月" + +msgid "October" +msgstr "十月" + +msgid "November" +msgstr "十一月" + +msgid "December" +msgstr "十二月" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "S" + +msgctxt "one letter Monday" +msgid "M" +msgstr "M" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "T" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "W" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "T" + +msgctxt "one letter Friday" +msgid "F" +msgstr "F" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "显示" + +msgid "Hide" +msgstr "隐藏" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..a2a1d9a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,660 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chen Chun-Chia , 2015 +# ilay , 2012 +# Jannis Leidel , 2011 +# mail6543210 , 2013-2014 +# ming hsien tzang , 2011 +# tcc , 2011 +# Tzu-ping Chung , 2016-2017 +# Yeh-Yung , 2013 +# Yeh-Yung , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Tzu-ping Chung \n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/" +"language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "成功的刪除了 %(count)d 個 %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "無法刪除 %(name)s" + +msgid "Are you sure?" +msgstr "你確定嗎?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "刪除所選的 %(verbose_name_plural)s" + +msgid "Administration" +msgstr "管理" + +msgid "All" +msgstr "全部" + +msgid "Yes" +msgstr "是" + +msgid "No" +msgstr "否" + +msgid "Unknown" +msgstr "未知" + +msgid "Any date" +msgstr "任何日期" + +msgid "Today" +msgstr "今天" + +msgid "Past 7 days" +msgstr "過去 7 天" + +msgid "This month" +msgstr "本月" + +msgid "This year" +msgstr "今年" + +msgid "No date" +msgstr "沒有日期" + +msgid "Has date" +msgstr "有日期" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "請輸入正確的工作人員%(username)s及密碼。請注意兩者皆區分大小寫。" + +msgid "Action:" +msgstr "動作:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "新增其它 %(verbose_name)s" + +msgid "Remove" +msgstr "移除" + +msgid "action time" +msgstr "動作時間" + +msgid "user" +msgstr "使用者" + +msgid "content type" +msgstr "內容類型" + +msgid "object id" +msgstr "物件 id" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/3/library/functions.html#repr) +msgid "object repr" +msgstr "物件 repr" + +msgid "action flag" +msgstr "動作旗標" + +msgid "change message" +msgstr "變更訊息" + +msgid "log entry" +msgstr "紀錄項目" + +msgid "log entries" +msgstr "紀錄項目" + +#, python-format +msgid "Added \"%(object)s\"." +msgstr "\"%(object)s\" 已新增。" + +#, python-format +msgid "Changed \"%(object)s\" - %(changes)s" +msgstr "\"%(object)s\" - %(changes)s 已變更。" + +#, python-format +msgid "Deleted \"%(object)s.\"" +msgstr "\"%(object)s\" 已刪除。" + +msgid "LogEntry Object" +msgstr "紀錄項目" + +#, python-brace-format +msgid "Added {name} \"{object}\"." +msgstr "{name} \"{object}\" 已新增。" + +msgid "Added." +msgstr "已新增。" + +msgid "and" +msgstr "和" + +#, python-brace-format +msgid "Changed {fields} for {name} \"{object}\"." +msgstr "{name} \"{object}\" 的 {fields} 已變更。" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} 已變更。" + +#, python-brace-format +msgid "Deleted {name} \"{object}\"." +msgstr "{name} \"{object}\" 已刪除。" + +msgid "No fields changed." +msgstr "沒有欄位被變更。" + +msgid "None" +msgstr "無" + +msgid "" +"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "按住 \"Control\" 或 \"Command\" (Mac),可選取多個值" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" 新增成功。你可以在下面再次編輯它。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was added successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" 新增成功。你可以在下方加入其他 {name}。" + +#, python-brace-format +msgid "The {name} \"{obj}\" was added successfully." +msgstr "{name} \"{obj}\" 已成功新增。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" 變更成功。你可以在下方再次編輯。" + +#, python-brace-format +msgid "" +"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" 變更成功。你可以在下方加入其他 {name}。" + +#, python-brace-format +msgid "The {name} \"{obj}\" was changed successfully." +msgstr "{name} \"{obj}\" 已成功變更。" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "必須要有項目被選到才能對它們進行動作。沒有項目變更。" + +msgid "No action selected." +msgstr "沒有動作被選。" + +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" 已成功刪除。" + +#, python-format +msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgstr "不存在 ID 為「%(key)s」的 %(name)s。或許它已被刪除?" + +#, python-format +msgid "Add %s" +msgstr "新增 %s" + +#, python-format +msgid "Change %s" +msgstr "變更 %s" + +msgid "Database error" +msgstr "資料庫錯誤" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "共 %(count)s %(name)s 已變更成功。" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "全部 %(total_count)s 個被選" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s 中 0 個被選" + +#, python-format +msgid "Change history: %s" +msgstr "變更歷史: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"刪除 %(class_name)s %(instance)s 將會同時刪除下面受保護的相關物件:" +"%(related_objects)s" + +msgid "Django site admin" +msgstr "Django 網站管理" + +msgid "Django administration" +msgstr "Django 管理" + +msgid "Site administration" +msgstr "網站管理" + +msgid "Log in" +msgstr "登入" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s 管理" + +msgid "Page not found" +msgstr "頁面沒有找到" + +msgid "We're sorry, but the requested page could not be found." +msgstr "很抱歉,請求頁面無法找到。" + +msgid "Home" +msgstr "首頁" + +msgid "Server error" +msgstr "伺服器錯誤" + +msgid "Server error (500)" +msgstr "伺服器錯誤 (500)" + +msgid "Server Error (500)" +msgstr "伺服器錯誤 (500)" + +msgid "" +"There's been an error. It's been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝你" +"的關心。" + +msgid "Run the selected action" +msgstr "執行選擇的動作" + +msgid "Go" +msgstr "去" + +msgid "Click here to select the objects across all pages" +msgstr "點選這裡可選取全部頁面的物件" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "選擇全部 %(total_count)s %(module_name)s" + +msgid "Clear selection" +msgstr "清除選擇" + +msgid "" +"First, enter a username and password. Then, you'll be able to edit more user " +"options." +msgstr "首先,輸入一個使用者名稱和密碼。然後你可以編輯更多使用者選項。" + +msgid "Enter a username and password." +msgstr "輸入一個使用者名稱和密碼。" + +msgid "Change password" +msgstr "變更密碼" + +msgid "Please correct the error below." +msgstr "請更正下面的錯誤。" + +msgid "Please correct the errors below." +msgstr "請修正以下錯誤" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "為使用者%(username)s輸入一個新的密碼。" + +msgid "Welcome," +msgstr "歡迎," + +msgid "View site" +msgstr "檢視網站" + +msgid "Documentation" +msgstr "文件" + +msgid "Log out" +msgstr "登出" + +#, python-format +msgid "Add %(name)s" +msgstr "新增 %(name)s" + +msgid "History" +msgstr "歷史" + +msgid "View on site" +msgstr "在網站上檢視" + +msgid "Filter" +msgstr "過濾器" + +msgid "Remove from sorting" +msgstr "從排序中移除" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "優先排序:%(priority_number)s" + +msgid "Toggle sorting" +msgstr "切換排序" + +msgid "Delete" +msgstr "刪除" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號" +"並沒有刪除以下型態物件的權限:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"要刪除 %(object_name)s '%(escaped_object)s', 將要求刪除下面受保護的相關物件:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會" +"被刪除:" + +msgid "Objects" +msgstr "物件" + +msgid "Yes, I'm sure" +msgstr "是的,我確定" + +msgid "No, take me back" +msgstr "不,請帶我回去" + +msgid "Delete multiple objects" +msgstr "刪除多個物件" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"要刪除所選的 %(objects_name)s, 結果會刪除相關物件, 但你的帳號無權刪除下面物件" +"型態:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "要刪除所選的 %(objects_name)s, 將要求刪除下面受保護的相關物件:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:" + +msgid "Change" +msgstr "變更" + +msgid "Delete?" +msgstr "刪除?" + +#, python-format +msgid " By %(filter_title)s " +msgstr " 以 %(filter_title)s" + +msgid "Summary" +msgstr "總結" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s 應用程式中的Model" + +msgid "Add" +msgstr "新增" + +msgid "You don't have permission to edit anything." +msgstr "你沒有編輯任何東西的權限。" + +msgid "Recent actions" +msgstr "最近的動作" + +msgid "My actions" +msgstr "我的動作" + +msgid "None available" +msgstr "無可用的" + +msgid "Unknown content" +msgstr "未知內容" + +msgid "" +"Something's wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀" +"取。" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"您已認證為 %(username)s,但並沒有瀏覽此頁面的權限。您是否希望以其他帳號登入?" + +msgid "Forgotten your password or username?" +msgstr "忘了你的密碼或是使用者名稱?" + +msgid "Date/time" +msgstr "日期/時間" + +msgid "User" +msgstr "使用者" + +msgid "Action" +msgstr "動作" + +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。" + +msgid "Show all" +msgstr "顯示全部" + +msgid "Save" +msgstr "儲存" + +msgid "Popup closing..." +msgstr "關閉彈出視窗中⋯⋯" + +#, python-format +msgid "Change selected %(model)s" +msgstr "變更所選的 %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "新增其它 %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "刪除所選的 %(model)s" + +msgid "Search" +msgstr "搜尋" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s 結果" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "總共 %(full_result_count)s" + +msgid "Save as new" +msgstr "儲存為新的" + +msgid "Save and add another" +msgstr "儲存並新增另一個" + +msgid "Save and continue editing" +msgstr "儲存並繼續編輯" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "感謝你今天花了重要的時間停留在本網站。" + +msgid "Log in again" +msgstr "重新登入" + +msgid "Password change" +msgstr "密碼變更" + +msgid "Your password was changed." +msgstr "你的密碼已變更。" + +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"為了安全上的考量,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸" +"入。" + +msgid "Change my password" +msgstr "變更我的密碼" + +msgid "Password reset" +msgstr "密碼重設" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "你的密碼已設置,現在可以繼續登入。" + +msgid "Password reset confirmation" +msgstr "密碼重設確認" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "請輸入你的新密碼兩次, 這樣我們才能檢查你的輸入是否正確。" + +msgid "New password:" +msgstr "新密碼:" + +msgid "Confirm password:" +msgstr "確認密碼:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "密碼重設連結無效,可能因為他已使用。請重新請求密碼重設。" + +msgid "" +"We've emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"若您提交的電子郵件地址存在對應帳號,我們已寄出重設密碼的相關指示。您應該很快" +"就會收到。" + +msgid "" +"If you don't receive an email, please make sure you've entered the address " +"you registered with, and check your spam folder." +msgstr "" +"如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查" +"您的垃圾郵件匣。" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "這封電子郵件來自 %(site_name)s,因為你要求為帳號重新設定密碼。" + +msgid "Please go to the following page and choose a new password:" +msgstr "請到該頁面選擇一個新的密碼:" + +msgid "Your username, in case you've forgotten:" +msgstr "你的使用者名稱,萬一你已經忘記的話:" + +msgid "Thanks for using our site!" +msgstr "感謝使用本網站!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s 團隊" + +msgid "" +"Forgotten your password? Enter your email address below, and we'll email " +"instructions for setting a new one." +msgstr "" +"忘記你的密碼? 請在下面輸入你的電子郵件位址, 然後我們會寄出設定新密碼的操作指" +"示。" + +msgid "Email address:" +msgstr "電子信箱:" + +msgid "Reset my password" +msgstr "重設我的密碼" + +msgid "All dates" +msgstr "所有日期" + +#, python-format +msgid "Select %s" +msgstr "選擇 %s" + +#, python-format +msgid "Select %s to change" +msgstr "選擇 %s 來變更" + +msgid "Date:" +msgstr "日期" + +msgid "Time:" +msgstr "時間" + +msgid "Lookup" +msgstr "查詢" + +msgid "Currently:" +msgstr "目前:" + +msgid "Change:" +msgstr "變動:" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo new file mode 100644 index 0000000..9368f69 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/autocomplete.css b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/autocomplete.css new file mode 100644 index 0000000..3ef95d1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/autocomplete.css @@ -0,0 +1,260 @@ +select.admin-autocomplete { + width: 20em; +} + +.select2-container--admin-autocomplete.select2-container { + min-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single, +.select2-container--admin-autocomplete .select2-selection--multiple { + min-height: 30px; + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection, +.select2-container--admin-autocomplete.select2-container--open .select2-selection { + border-color: #999; + min-height: 30px; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-selection--single { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple { + background-color: white; + border: 1px solid #ccc; + border-radius: 4px; + cursor: text; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin: 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #ccc; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { + border: solid #999 1px; + outline: 0; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { + border: 1px solid #ccc; +} + +.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--admin-autocomplete .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--admin-autocomplete .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { + background-color: #79aec8; + color: white; +} + +.select2-container--admin-autocomplete .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/dashboard.css b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/dashboard.css new file mode 100644 index 0000000..1560c7b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/dashboard.css @@ -0,0 +1,27 @@ +/* DASHBOARD */ + +.dashboard .module table th { + width: 100%; +} + +.dashboard .module table td { + white-space: nowrap; +} + +.dashboard .module table td a { + display: block; + padding-right: .6em; +} + +/* RECENT ACTIONS MODULE */ + +.module ul.actionlist { + margin-left: 0; +} + +ul.actionlist li { + list-style-type: none; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; +} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css new file mode 100644 index 0000000..f999cb1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/responsive_rtl.css @@ -0,0 +1,84 @@ +/* TABLETS */ + +@media (max-width: 1024px) { + [dir="rtl"] .colMS { + margin-right: 0; + } + + [dir="rtl"] #user-tools { + text-align: right; + } + + [dir="rtl"] #changelist .actions label { + padding-left: 10px; + padding-right: 0; + } + + [dir="rtl"] #changelist .actions select { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions { + margin-right: 0; + margin-left: 230px; + } + + [dir="rtl"] .inline-group ul.tools a.add, + [dir="rtl"] .inline-group div.add-row a, + [dir="rtl"] .inline-group .tabular tr.add-row td a { + padding: 8px 26px 8px 10px; + background-position: calc(100% - 8px) 9px; + } + + [dir="rtl"] .related-widget-wrapper-link + .selector { + margin-right: 0; + margin-left: 15px; + } + + [dir="rtl"] .selector .selector-filter label { + margin-right: 0; + margin-left: 8px; + } + + [dir="rtl"] .object-tools li { + float: right; + } + + [dir="rtl"] .object-tools li + li { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .dashboard .module table td a { + padding-left: 0; + padding-right: 16px; + } +} + +/* MOBILE */ + +@media (max-width: 767px) { + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions { + margin-left: 0; + } + + [dir="rtl"] .aligned .add-another, + [dir="rtl"] .aligned .related-lookup, + [dir="rtl"] .aligned .datetimeshortcuts { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .aligned ul { + margin-right: 0; + } +} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..447b2b8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/css/vendor/select2/select2.css @@ -0,0 +1,484 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/README.txt b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/README.txt new file mode 100644 index 0000000..b247bef --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/README.txt @@ -0,0 +1,3 @@ +Roboto webfont source: https://www.google.com/fonts/specimen/Roboto +WOFF files extracted using https://github.com/majodev/google-webfonts-helper +Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff new file mode 100644 index 0000000..6e0f562 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..228854f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..96b87fd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg new file mode 100644 index 0000000..e004fb1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-addlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg new file mode 100644 index 0000000..97910a9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg new file mode 100644 index 0000000..bbb137a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-changelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..4059b15 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-deletelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..1c6b99f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-unknown-alt.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg new file mode 100644 index 0000000..a1ca1d3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/icon-viewlink.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg new file mode 100644 index 0000000..17d1ad6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/inline-delete.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/search.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/search.svg new file mode 100644 index 0000000..c8c69b2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg new file mode 100644 index 0000000..1ca64ae --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/img/tooltag-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/SelectBox.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/SelectBox.js new file mode 100644 index 0000000..2073f03 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/SelectBox.js @@ -0,0 +1,144 @@ +(function($) { + 'use strict'; + var SelectBox = { + cache: {}, + init: function(id) { + var box = document.getElementById(id); + var node; + SelectBox.cache[id] = []; + var cache = SelectBox.cache[id]; + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + node = boxOptions[i]; + cache.push({value: node.value, text: node.text, displayed: 1}); + } + }, + redisplay: function(id) { + // Repopulate HTML select box from cache + var box = document.getElementById(id); + var node; + $(box).empty(); // clear all options + var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.displayed) { + var new_option = new Option(node.text, node.value, false, false); + // Shows a tooltip when hovering over the option + new_option.setAttribute("title", node.text); + new_options += new_option.outerHTML; + } + } + new_options += ''; + box.outerHTML = new_options; + }, + filter: function(id, text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + var tokens = text.toLowerCase().split(/\s+/); + var node, token; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + node.displayed = 1; + var node_text = node.text.toLowerCase(); + var numTokens = tokens.length; + for (var k = 0; k < numTokens; k++) { + token = tokens[k]; + if (node_text.indexOf(token) === -1) { + node.displayed = 0; + break; // Once the first token isn't found we're done + } + } + } + SelectBox.redisplay(id); + }, + delete_from_cache: function(id, value) { + var node, delete_index = null; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.value === value) { + delete_index = i; + break; + } + } + cache.splice(delete_index, 1); + }, + add_to_cache: function(id, option) { + SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); + }, + cache_contains: function(id, value) { + // Check if an item is contained in the cache + var node; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.value === value) { + return true; + } + } + return false; + }, + move: function(from, to) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var option_value = option.value; + if (option.selected && SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + move_all: function(from, to) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var option_value = option.value; + if (SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + sort: function(id) { + SelectBox.cache[id].sort(function(a, b) { + a = a.text.toLowerCase(); + b = b.text.toLowerCase(); + try { + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + } + catch (e) { + // silently fail on IE 'unknown' exception + } + return 0; + } ); + }, + select_all: function(id) { + var box = document.getElementById(id); + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0; i < boxOptionsLength; i++) { + boxOptions[i].selected = 'selected'; + } + } + }; + window.SelectBox = SelectBox; +})(django.jQuery); diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/actions.min.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/actions.min.js new file mode 100644 index 0000000..31e83c1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/actions.min.js @@ -0,0 +1,7 @@ +(function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); +a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){if(c===g.length){var a=!0;l()}else a=!1,p();return a})};a(b.counterContainer).show(); +a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().on("click",function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).on("click",function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).on("click",function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).on("click",function(c){c||(c=window.event);var d=c.target?c.target: +c.srcElement;if(f&&a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").on("change","td:gt(0) :input",function(){k=!0}); +a('form#changelist-form button[name="index"]').on("click",function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});a('form#changelist-form input[name="_save"]').on("click",function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")): +confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e= +a("tr input.action-select");0'+a.addText+""),l=d.find("tr:last a")):(c.filter(":last").after('"),l=c.filter(":last").next().find("a")));l.on("click",function(d){d.preventDefault();d=b("#"+a.prefix+"-empty"); +var c=d.clone(!0);c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+h);c.is("tr")?c.children(":last").append('"):c.is("ul")||c.is("ol")?c.append('
  • '+a.deleteText+"
  • "):c.children(":first").append(''+a.deleteText+"");c.find("*").each(function(){f(this,a.prefix,g.val())});c.insertBefore(b(d)); +b(g).val(parseInt(g.val(),10)+1);h+=1;""!==e.val()&&0>=e.val()-g.val()&&l.parent().hide();c.find("a."+a.deleteCssClass).on("click",function(d){d.preventDefault();c.remove();--h;a.removed&&a.removed(c);b(document).trigger("formset:removed",[c,a.prefix]);d=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(d.length);(""===e.val()||0 tr",b(d).tabularFormset(d,a.options)}})})})(django.jQuery); diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/popup_response.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/popup_response.js new file mode 100644 index 0000000..b4a07e7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/popup_response.js @@ -0,0 +1,16 @@ +/*global opener */ +(function() { + 'use strict'; + var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); + switch(initData.action) { + case 'change': + opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); + break; + case 'delete': + opener.dismissDeleteRelatedObjectPopup(window, initData.value); + break; + default: + opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); + break; + } +})(); diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/timeparse.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/timeparse.js new file mode 100644 index 0000000..3cdc7ec --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/timeparse.js @@ -0,0 +1,106 @@ +(function() { + 'use strict'; + var timeParsePatterns = [ + // 9 + { + re: /^\d{1,2}$/i, + handler: function(bits) { + if (bits[0].length === 1) { + return '0' + bits[0] + ':00'; + } else { + return bits[0] + ':00'; + } + } + }, + // 13:00 + { + re: /^\d{2}[:.]\d{2}$/i, + handler: function(bits) { + return bits[0].replace('.', ':'); + } + }, + // 9:00 + { + re: /^\d[:.]\d{2}$/i, + handler: function(bits) { + return '0' + bits[0].replace('.', ':'); + } + }, + // 3 am / 3 a.m. / 3am + { + re: /^(\d+)\s*([ap])(?:.?m.?)?$/i, + handler: function(bits) { + var hour = parseInt(bits[1]); + if (hour === 12) { + hour = 0; + } + if (bits[2].toLowerCase() === 'p') { + if (hour === 12) { + hour = 0; + } + return (hour + 12) + ':00'; + } else { + if (hour < 10) { + return '0' + hour + ':00'; + } else { + return hour + ':00'; + } + } + } + }, + // 3.30 am / 3:15 a.m. / 3.00am + { + re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i, + handler: function(bits) { + var hour = parseInt(bits[1]); + var mins = parseInt(bits[2]); + if (mins < 10) { + mins = '0' + mins; + } + if (hour === 12) { + hour = 0; + } + if (bits[3].toLowerCase() === 'p') { + if (hour === 12) { + hour = 0; + } + return (hour + 12) + ':' + mins; + } else { + if (hour < 10) { + return '0' + hour + ':' + mins; + } else { + return hour + ':' + mins; + } + } + } + }, + // noon + { + re: /^no/i, + handler: function(bits) { + return '12:00'; + } + }, + // midnight + { + re: /^mid/i, + handler: function(bits) { + return '00:00'; + } + } + ]; + + function parseTimeString(s) { + for (var i = 0; i < timeParsePatterns.length; i++) { + var re = timeParsePatterns[i].re; + var handler = timeParsePatterns[i].handler; + var bits = re.exec(s); + if (bits) { + return handler(bits); + } + } + return s; + } + + window.parseTimeString = parseTimeString; +})(); diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js new file mode 100644 index 0000000..2accb97 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js new file mode 100644 index 0000000..501c51e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js new file mode 100644 index 0000000..0a09650 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js new file mode 100644 index 0000000..e4a6650 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js new file mode 100644 index 0000000..7796b9f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js new file mode 100644 index 0000000..8e94adc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/km.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js new file mode 100644 index 0000000..4ed0321 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js new file mode 100644 index 0000000..05f3a6e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js new file mode 100644 index 0000000..319ecca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js new file mode 100644 index 0000000..4258f12 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ms.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js new file mode 100644 index 0000000..6770087 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js new file mode 100644 index 0000000..788a263 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js new file mode 100644 index 0000000..82f2941 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js new file mode 100644 index 0000000..bedac08 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js new file mode 100644 index 0000000..25d27a8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js new file mode 100644 index 0000000..2ed9597 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/static/admin/js/vendor/select2/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/actions.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/actions.html new file mode 100644 index 0000000..ef2232e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/actions.html @@ -0,0 +1,23 @@ +{% load i18n %} +
    + {% block actions %} + {% block actions-form %} + {% for field in action_form %}{% if field.label %}{% endif %}{% endfor %} + {% endblock %} + {% block actions-submit %} + + {% endblock %} + {% block actions-counter %} + {% if actions_selection_counter %} + {{ selection_note }} + {% if cl.result_count != cl.result_list|length %} + {{ selection_note_all }} + + {% blocktrans with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktrans %} + + {% trans "Clear selection" %} + {% endif %} + {% endif %} + {% endblock %} + {% endblock %} +
    diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html new file mode 100644 index 0000000..5c240d5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/auth/user/add_form.html @@ -0,0 +1,10 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block form_top %} + {% if not is_popup %} +

    {% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}

    + {% else %} +

    {% trans "Enter a username and password." %}

    + {% endif %} +{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/base.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/base.html new file mode 100644 index 0000000..2cf5137 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/base.html @@ -0,0 +1,93 @@ +{% load i18n static %} +{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} + + +{% block title %}{% endblock %} + +{% block extrastyle %}{% endblock %} +{% if LANGUAGE_BIDI %}{% endif %} +{% block extrahead %}{% endblock %} +{% block responsive %} + + + {% if LANGUAGE_BIDI %}{% endif %} +{% endblock %} +{% block blockbots %}{% endblock %} + +{% load i18n %} + + + + +
    + + {% if not is_popup %} + + + + {% block breadcrumbs %} + + {% endblock %} + {% endif %} + + {% block messages %} + {% if messages %} +
      {% for message in messages %} + {{ message|capfirst }} + {% endfor %}
    + {% endif %} + {% endblock messages %} + + +
    + {% block pretitle %}{% endblock %} + {% block content_title %}{% if title %}

    {{ title }}

    {% endif %}{% endblock %} + {% block content %} + {% block object-tools %}{% endblock %} + {{ content }} + {% endblock %} + {% block sidebar %}{% endblock %} +
    +
    + + + {% block footer %}{% endblock %} +
    + + + + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_form.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_form.html new file mode 100644 index 0000000..1d749f2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_form.html @@ -0,0 +1,81 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_modify %} + +{% block extrahead %}{{ block.super }} + +{{ media }} +{% endblock %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colM{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block content %}
    +{% block object-tools %} +{% if change %}{% if not is_popup %} +
      + {% block object-tools-items %} + {% change_form_object_tools %} + {% endblock %} +
    +{% endif %}{% endif %} +{% endblock %} +
    {% csrf_token %}{% block form_top %}{% endblock %} +
    +{% if is_popup %}{% endif %} +{% if to_field %}{% endif %} +{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} +{% if errors %} +

    + {% if errors|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

    + {{ adminform.form.non_field_errors }} +{% endif %} + +{% block field_sets %} +{% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} +{% endfor %} +{% endblock %} + +{% block after_field_sets %}{% endblock %} + +{% block inline_field_sets %} +{% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} +{% endfor %} +{% endblock %} + +{% block after_related_objects %}{% endblock %} + +{% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + +{% block admin_change_form_document_ready %} + +{% endblock %} + +{# JavaScript for prepopulated fields #} +{% prepopulated_fields_js %} + +
    +
    +{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list.html new file mode 100644 index 0000000..768e581 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list.html @@ -0,0 +1,82 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_list %} + +{% block extrastyle %} + {{ block.super }} + + {% if cl.formset %} + + {% endif %} + {% if cl.formset or action_form %} + + {% endif %} + {{ media.css }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block extrahead %} +{{ block.super }} +{{ media.js }} +{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block coltype %}flex{% endblock %} + +{% block content %} +
    + {% block object-tools %} +
      + {% block object-tools-items %} + {% change_list_object_tools %} + {% endblock %} +
    + {% endblock %} + {% if cl.formset and cl.formset.errors %} +

    + {% if cl.formset.total_error_count == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

    + {{ cl.formset.non_form_errors }} + {% endif %} +
    + {% block search %}{% search_form cl %}{% endblock %} + {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} + + {% block filters %} + {% if cl.has_filters %} +
    +

    {% trans 'Filter' %}

    + {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} +
    + {% endif %} + {% endblock %} + +
    {% csrf_token %} + {% if cl.formset %} +
    {{ cl.formset.management_form }}
    + {% endif %} + + {% block result_list %} + {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} + {% result_list cl %} + {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} + {% endblock %} + {% block pagination %}{% pagination cl %}{% endblock %} +
    +
    +
    +{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list_results.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list_results.html new file mode 100644 index 0000000..9b97b5b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/change_list_results.html @@ -0,0 +1,38 @@ +{% load i18n static %} +{% if result_hidden_fields %} +
    {# DIV for HTML validation #} +{% for item in result_hidden_fields %}{{ item }}{% endfor %} +
    +{% endif %} +{% if results %} +
    + + + +{% for header in result_headers %} +{% endfor %} + + + +{% for result in results %} +{% if result.form and result.form.non_field_errors %} + +{% endif %} +{% for item in result %}{{ item }}{% endfor %} +{% endfor %} + +
    + {% if header.sortable %} + {% if header.sort_priority > 0 %} +
    + + {% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} + +
    + {% endif %} + {% endif %} +
    {% if header.sortable %}{{ header.text|capfirst }}{% else %}{{ header.text|capfirst }}{% endif %}
    +
    +
    {{ result.form.non_field_errors }}
    +
    +{% endif %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html new file mode 100644 index 0000000..65ae800 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/date_hierarchy.html @@ -0,0 +1,16 @@ +{% if show %} +
    +
    +
    +{% endif %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html new file mode 100644 index 0000000..8af4d54 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -0,0 +1,25 @@ +{% load i18n admin_urls static %} +
    +
    +

    {{ inline_admin_formset.opts.verbose_name_plural|capfirst }}

    +{{ inline_admin_formset.formset.management_form }} +{{ inline_admin_formset.formset.non_form_errors }} + +{% for inline_admin_form in inline_admin_formset %}
    +

    {{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% if inline_admin_formset.has_change_permission %}{% trans "Change" %}{% else %}{% trans "View" %}{% endif %}{% endif %} +{% else %}#{{ forloop.counter }}{% endif %} + {% if inline_admin_form.show_url %}{% trans "View on site" %}{% endif %} + {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %} +

    + {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} + {% for fieldset in inline_admin_form %} + {% include "admin/includes/fieldset.html" %} + {% endfor %} + {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} + {% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %} +
    {% endfor %} +
    +
    diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/filter.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/filter.html new file mode 100644 index 0000000..cd88652 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/filter.html @@ -0,0 +1,8 @@ +{% load i18n %} +

    {% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

    + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html new file mode 100644 index 0000000..218fd5a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html @@ -0,0 +1,29 @@ +
    + {% if fieldset.name %}

    {{ fieldset.name }}

    {% endif %} + {% if fieldset.description %} +
    {{ fieldset.description|safe }}
    + {% endif %} + {% for line in fieldset %} +
    + {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} + {% for field in line %} + + {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} + {% if field.is_checkbox %} + {{ field.field }}{{ field.label_tag }} + {% else %} + {{ field.label_tag }} + {% if field.is_readonly %} +
    {{ field.contents }}
    + {% else %} + {{ field.field }} + {% endif %} + {% endif %} + {% if field.field.help_text %} +
    {{ field.field.help_text|safe }}
    + {% endif %} +
    + {% endfor %} + + {% endfor %} +
    diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/index.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/index.html new file mode 100644 index 0000000..2b50015 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/index.html @@ -0,0 +1,86 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block coltype %}colMS{% endblock %} + +{% block bodyclass %}{{ block.super }} dashboard{% endblock %} + +{% block breadcrumbs %}{% endblock %} + +{% block content %} +
    + +{% if app_list %} + {% for app in app_list %} +
    + + + {% for model in app.models %} + + {% if model.admin_url %} + + {% else %} + + {% endif %} + + {% if model.add_url %} + + {% else %} + + {% endif %} + + {% if model.admin_url %} + {% if model.view_only %} + + {% else %} + + {% endif %} + {% else %} + + {% endif %} + + {% endfor %} +
    + {{ app.name }} +
    {{ model.name }}{{ model.name }}{% trans 'Add' %} {% trans 'View' %}{% trans 'Change' %} 
    +
    + {% endfor %} +{% else %} +

    {% trans "You don't have permission to view or edit anything." %}

    +{% endif %} +
    +{% endblock %} + +{% block sidebar %} + +{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/login.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/login.html new file mode 100644 index 0000000..396be27 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/login.html @@ -0,0 +1,66 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %}{{ block.super }} +{{ form.media }} +{% endblock %} + +{% block bodyclass %}{{ block.super }} login{% endblock %} + +{% block usertools %}{% endblock %} + +{% block nav-global %}{% endblock %} + +{% block content_title %}{% endblock %} + +{% block breadcrumbs %}{% endblock %} + +{% block content %} +{% if form.errors and not form.non_field_errors %} +

    +{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} +

    +{% endif %} + +{% if form.non_field_errors %} +{% for error in form.non_field_errors %} +

    + {{ error }} +

    +{% endfor %} +{% endif %} + +
    + +{% if user.is_authenticated %} +

    +{% blocktrans trimmed %} + You are authenticated as {{ username }}, but are not authorized to + access this page. Would you like to login to a different account? +{% endblocktrans %} +

    +{% endif %} + +
    {% csrf_token %} +
    + {{ form.username.errors }} + {{ form.username.label_tag }} {{ form.username }} +
    +
    + {{ form.password.errors }} + {{ form.password.label_tag }} {{ form.password }} + +
    + {% url 'admin_password_reset' as password_reset_url %} + {% if password_reset_url %} + + {% endif %} +
    + +
    +
    + +
    +{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/search_form.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/search_form.html new file mode 100644 index 0000000..3bb5cba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/search_form.html @@ -0,0 +1,16 @@ +{% load i18n static %} +{% if cl.search_fields %} +
    +{% endif %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/submit_line.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/submit_line.html new file mode 100644 index 0000000..bb283fe --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/submit_line.html @@ -0,0 +1,14 @@ +{% load i18n admin_urls %} +
    +{% block submit-row %} +{% if show_save %}{% endif %} +{% if show_delete_link and original %} + {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} + +{% endif %} +{% if show_save_as_new %}{% endif %} +{% if show_save_and_add_another %}{% endif %} +{% if show_save_and_continue %}{% endif %} +{% if show_close %}{% trans 'Close' %}{% endif %} +{% endblock %} +
    diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html new file mode 100644 index 0000000..80699d1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/clearable_file_input.html @@ -0,0 +1,6 @@ +{% if widget.is_initial %}

    {{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} + + +{% endif %}
    +{{ widget.input_text }}:{% endif %} +{% if widget.is_initial %}

    {% endif %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/radio.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/radio.html new file mode 100644 index 0000000..780899a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/radio.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/multiple_input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html new file mode 100644 index 0000000..7fc7bf6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templates/admin/widgets/split_datetime.html @@ -0,0 +1,4 @@ +

    + {{ date_label }} {% with widget=widget.subwidgets.0 %}{% include widget.template_name %}{% endwith %}
    + {{ time_label }} {% with widget=widget.subwidgets.1 %}{% include widget.template_name %}{% endwith %} +

    diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_list.py b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_list.py new file mode 100644 index 0000000..b03e4b6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_list.py @@ -0,0 +1,485 @@ +import datetime + +from django.contrib.admin.templatetags.admin_urls import add_preserved_filters +from django.contrib.admin.utils import ( + display_for_field, display_for_value, label_for_field, lookup_field, +) +from django.contrib.admin.views.main import ( + ALL_VAR, ORDER_VAR, PAGE_VAR, SEARCH_VAR, +) +from django.core.exceptions import ObjectDoesNotExist +from django.db import models +from django.template import Library +from django.template.loader import get_template +from django.templatetags.static import static +from django.urls import NoReverseMatch +from django.utils import formats +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .base import InclusionAdminNode + +register = Library() + +DOT = '.' + + +@register.simple_tag +def paginator_number(cl, i): + """ + Generate an individual page index link in a paginated list. + """ + if i == DOT: + return '… ' + elif i == cl.page_num: + return format_html('{} ', i + 1) + else: + return format_html( + '{} ', + cl.get_query_string({PAGE_VAR: i}), + mark_safe(' class="end"' if i == cl.paginator.num_pages - 1 else ''), + i + 1, + ) + + +def pagination(cl): + """ + Generate the series of links to the pages in a paginated list. + """ + paginator, page_num = cl.paginator, cl.page_num + + pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page + if not pagination_required: + page_range = [] + else: + ON_EACH_SIDE = 3 + ON_ENDS = 2 + + # If there are 10 or fewer pages, display links to every page. + # Otherwise, do some fancy + if paginator.num_pages <= 10: + page_range = range(paginator.num_pages) + else: + # Insert "smart" pagination links, so that there are always ON_ENDS + # links at either end of the list of pages, and there are always + # ON_EACH_SIDE links at either end of the "current page" link. + page_range = [] + if page_num > (ON_EACH_SIDE + ON_ENDS): + page_range += [ + *range(0, ON_ENDS), DOT, + *range(page_num - ON_EACH_SIDE, page_num + 1), + ] + else: + page_range.extend(range(0, page_num + 1)) + if page_num < (paginator.num_pages - ON_EACH_SIDE - ON_ENDS - 1): + page_range += [ + *range(page_num + 1, page_num + ON_EACH_SIDE + 1), DOT, + *range(paginator.num_pages - ON_ENDS, paginator.num_pages) + ] + else: + page_range.extend(range(page_num + 1, paginator.num_pages)) + + need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page + return { + 'cl': cl, + 'pagination_required': pagination_required, + 'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}), + 'page_range': page_range, + 'ALL_VAR': ALL_VAR, + '1': 1, + } + + +@register.tag(name='pagination') +def pagination_tag(parser, token): + return InclusionAdminNode( + parser, token, + func=pagination, + template_name='pagination.html', + takes_context=False, + ) + + +def result_headers(cl): + """ + Generate the list column headers. + """ + ordering_field_columns = cl.get_ordering_field_columns() + for i, field_name in enumerate(cl.list_display): + text, attr = label_for_field( + field_name, cl.model, + model_admin=cl.model_admin, + return_attr=True + ) + is_field_sortable = cl.sortable_by is None or field_name in cl.sortable_by + if attr: + field_name = _coerce_field_name(field_name, i) + # Potentially not sortable + + # if the field is the action checkbox: no sorting and special class + if field_name == 'action_checkbox': + yield { + "text": text, + "class_attrib": mark_safe(' class="action-checkbox-column"'), + "sortable": False, + } + continue + + admin_order_field = getattr(attr, "admin_order_field", None) + if not admin_order_field: + is_field_sortable = False + + if not is_field_sortable: + # Not sortable + yield { + 'text': text, + 'class_attrib': format_html(' class="column-{}"', field_name), + 'sortable': False, + } + continue + + # OK, it is sortable if we got this far + th_classes = ['sortable', 'column-{}'.format(field_name)] + order_type = '' + new_order_type = 'asc' + sort_priority = 0 + # Is it currently being sorted on? + is_sorted = i in ordering_field_columns + if is_sorted: + order_type = ordering_field_columns.get(i).lower() + sort_priority = list(ordering_field_columns).index(i) + 1 + th_classes.append('sorted %sending' % order_type) + new_order_type = {'asc': 'desc', 'desc': 'asc'}[order_type] + + # build new ordering param + o_list_primary = [] # URL for making this field the primary sort + o_list_remove = [] # URL for removing this field from sort + o_list_toggle = [] # URL for toggling order type for this field + + def make_qs_param(t, n): + return ('-' if t == 'desc' else '') + str(n) + + for j, ot in ordering_field_columns.items(): + if j == i: # Same column + param = make_qs_param(new_order_type, j) + # We want clicking on this header to bring the ordering to the + # front + o_list_primary.insert(0, param) + o_list_toggle.append(param) + # o_list_remove - omit + else: + param = make_qs_param(ot, j) + o_list_primary.append(param) + o_list_toggle.append(param) + o_list_remove.append(param) + + if i not in ordering_field_columns: + o_list_primary.insert(0, make_qs_param(new_order_type, i)) + + yield { + "text": text, + "sortable": True, + "sorted": is_sorted, + "ascending": order_type == "asc", + "sort_priority": sort_priority, + "url_primary": cl.get_query_string({ORDER_VAR: '.'.join(o_list_primary)}), + "url_remove": cl.get_query_string({ORDER_VAR: '.'.join(o_list_remove)}), + "url_toggle": cl.get_query_string({ORDER_VAR: '.'.join(o_list_toggle)}), + "class_attrib": format_html(' class="{}"', ' '.join(th_classes)) if th_classes else '', + } + + +def _boolean_icon(field_val): + icon_url = static('admin/img/icon-%s.svg' % {True: 'yes', False: 'no', None: 'unknown'}[field_val]) + return format_html('{}', icon_url, field_val) + + +def _coerce_field_name(field_name, field_index): + """ + Coerce a field_name (which may be a callable) to a string. + """ + if callable(field_name): + if field_name.__name__ == '': + return 'lambda' + str(field_index) + else: + return field_name.__name__ + return field_name + + +def items_for_result(cl, result, form): + """ + Generate the actual list of data. + """ + + def link_in_col(is_first, field_name, cl): + if cl.list_display_links is None: + return False + if is_first and not cl.list_display_links: + return True + return field_name in cl.list_display_links + + first = True + pk = cl.lookup_opts.pk.attname + for field_index, field_name in enumerate(cl.list_display): + empty_value_display = cl.model_admin.get_empty_value_display() + row_classes = ['field-%s' % _coerce_field_name(field_name, field_index)] + try: + f, attr, value = lookup_field(field_name, result, cl.model_admin) + except ObjectDoesNotExist: + result_repr = empty_value_display + else: + empty_value_display = getattr(attr, 'empty_value_display', empty_value_display) + if f is None or f.auto_created: + if field_name == 'action_checkbox': + row_classes = ['action-checkbox'] + boolean = getattr(attr, 'boolean', False) + result_repr = display_for_value(value, empty_value_display, boolean) + if isinstance(value, (datetime.date, datetime.time)): + row_classes.append('nowrap') + else: + if isinstance(f.remote_field, models.ManyToOneRel): + field_val = getattr(result, f.name) + if field_val is None: + result_repr = empty_value_display + else: + result_repr = field_val + else: + result_repr = display_for_field(value, f, empty_value_display) + if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)): + row_classes.append('nowrap') + if str(result_repr) == '': + result_repr = mark_safe(' ') + row_class = mark_safe(' class="%s"' % ' '.join(row_classes)) + # If list_display_links not defined, add the link tag to the first field + if link_in_col(first, field_name, cl): + table_tag = 'th' if first else 'td' + first = False + + # Display link to the result's change_view if the url exists, else + # display just the result's representation. + try: + url = cl.url_for_result(result) + except NoReverseMatch: + link_or_text = result_repr + else: + url = add_preserved_filters({'preserved_filters': cl.preserved_filters, 'opts': cl.opts}, url) + # Convert the pk to something that can be used in Javascript. + # Problem cases are non-ASCII strings. + if cl.to_field: + attr = str(cl.to_field) + else: + attr = pk + value = result.serializable_value(attr) + link_or_text = format_html( + '{}', + url, + format_html( + ' data-popup-opener="{}"', value + ) if cl.is_popup else '', + result_repr) + + yield format_html('<{}{}>{}', table_tag, row_class, link_or_text, table_tag) + else: + # By default the fields come from ModelAdmin.list_editable, but if we pull + # the fields out of the form instead of list_editable custom admins + # can provide fields on a per request basis + if (form and field_name in form.fields and not ( + field_name == cl.model._meta.pk.name and + form[cl.model._meta.pk.name].is_hidden)): + bf = form[field_name] + result_repr = mark_safe(str(bf.errors) + str(bf)) + yield format_html('{}', row_class, result_repr) + if form and not form[cl.model._meta.pk.name].is_hidden: + yield format_html('{}', form[cl.model._meta.pk.name]) + + +class ResultList(list): + """ + Wrapper class used to return items in a list_editable changelist, annotated + with the form object for error reporting purposes. Needed to maintain + backwards compatibility with existing admin templates. + """ + def __init__(self, form, *items): + self.form = form + super().__init__(*items) + + +def results(cl): + if cl.formset: + for res, form in zip(cl.result_list, cl.formset.forms): + yield ResultList(form, items_for_result(cl, res, form)) + else: + for res in cl.result_list: + yield ResultList(None, items_for_result(cl, res, None)) + + +def result_hidden_fields(cl): + if cl.formset: + for res, form in zip(cl.result_list, cl.formset.forms): + if form[cl.model._meta.pk.name].is_hidden: + yield mark_safe(form[cl.model._meta.pk.name]) + + +def result_list(cl): + """ + Display the headers and data list together. + """ + headers = list(result_headers(cl)) + num_sorted_fields = 0 + for h in headers: + if h['sortable'] and h['sorted']: + num_sorted_fields += 1 + return { + 'cl': cl, + 'result_hidden_fields': list(result_hidden_fields(cl)), + 'result_headers': headers, + 'num_sorted_fields': num_sorted_fields, + 'results': list(results(cl)), + } + + +@register.tag(name='result_list') +def result_list_tag(parser, token): + return InclusionAdminNode( + parser, token, + func=result_list, + template_name='change_list_results.html', + takes_context=False, + ) + + +def date_hierarchy(cl): + """ + Display the date hierarchy for date drill-down functionality. + """ + if cl.date_hierarchy: + field_name = cl.date_hierarchy + year_field = '%s__year' % field_name + month_field = '%s__month' % field_name + day_field = '%s__day' % field_name + field_generic = '%s__' % field_name + year_lookup = cl.params.get(year_field) + month_lookup = cl.params.get(month_field) + day_lookup = cl.params.get(day_field) + + def link(filters): + return cl.get_query_string(filters, [field_generic]) + + if not (year_lookup or month_lookup or day_lookup): + # select appropriate start level + date_range = cl.queryset.aggregate(first=models.Min(field_name), + last=models.Max(field_name)) + if date_range['first'] and date_range['last']: + if date_range['first'].year == date_range['last'].year: + year_lookup = date_range['first'].year + if date_range['first'].month == date_range['last'].month: + month_lookup = date_range['first'].month + + if year_lookup and month_lookup and day_lookup: + day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup)) + return { + 'show': True, + 'back': { + 'link': link({year_field: year_lookup, month_field: month_lookup}), + 'title': capfirst(formats.date_format(day, 'YEAR_MONTH_FORMAT')) + }, + 'choices': [{'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))}] + } + elif year_lookup and month_lookup: + days = getattr(cl.queryset, 'dates')(field_name, 'day') + return { + 'show': True, + 'back': { + 'link': link({year_field: year_lookup}), + 'title': str(year_lookup) + }, + 'choices': [{ + 'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}), + 'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT')) + } for day in days] + } + elif year_lookup: + months = getattr(cl.queryset, 'dates')(field_name, 'month') + return { + 'show': True, + 'back': { + 'link': link({}), + 'title': _('All dates') + }, + 'choices': [{ + 'link': link({year_field: year_lookup, month_field: month.month}), + 'title': capfirst(formats.date_format(month, 'YEAR_MONTH_FORMAT')) + } for month in months] + } + else: + years = getattr(cl.queryset, 'dates')(field_name, 'year') + return { + 'show': True, + 'back': None, + 'choices': [{ + 'link': link({year_field: str(year.year)}), + 'title': str(year.year), + } for year in years] + } + + +@register.tag(name='date_hierarchy') +def date_hierarchy_tag(parser, token): + return InclusionAdminNode( + parser, token, + func=date_hierarchy, + template_name='date_hierarchy.html', + takes_context=False, + ) + + +def search_form(cl): + """ + Display a search form for searching the list. + """ + return { + 'cl': cl, + 'show_result_count': cl.result_count != cl.full_result_count, + 'search_var': SEARCH_VAR + } + + +@register.tag(name='search_form') +def search_form_tag(parser, token): + return InclusionAdminNode(parser, token, func=search_form, template_name='search_form.html', takes_context=False) + + +@register.simple_tag +def admin_list_filter(cl, spec): + tpl = get_template(spec.template) + return tpl.render({ + 'title': spec.title, + 'choices': list(spec.choices(cl)), + 'spec': spec, + }) + + +def admin_actions(context): + """ + Track the number of times the action field has been rendered on the page, + so we know which value to use. + """ + context['action_index'] = context.get('action_index', -1) + 1 + return context + + +@register.tag(name='admin_actions') +def admin_actions_tag(parser, token): + return InclusionAdminNode(parser, token, func=admin_actions, template_name='actions.html') + + +@register.tag(name='change_list_object_tools') +def change_list_object_tools_tag(parser, token): + """Display the row of change list object tools.""" + return InclusionAdminNode( + parser, token, + func=lambda context: context, + template_name='change_list_object_tools.html', + ) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_modify.py b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_modify.py new file mode 100644 index 0000000..60bc560 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_modify.py @@ -0,0 +1,111 @@ +import json + +from django import template +from django.template.context import Context + +from .base import InclusionAdminNode + +register = template.Library() + + +def prepopulated_fields_js(context): + """ + Create a list of prepopulated_fields that should render Javascript for + the prepopulated fields for both the admin form and inlines. + """ + prepopulated_fields = [] + if 'adminform' in context: + prepopulated_fields.extend(context['adminform'].prepopulated_fields) + if 'inline_admin_formsets' in context: + for inline_admin_formset in context['inline_admin_formsets']: + for inline_admin_form in inline_admin_formset: + if inline_admin_form.original is None: + prepopulated_fields.extend(inline_admin_form.prepopulated_fields) + + prepopulated_fields_json = [] + for field in prepopulated_fields: + prepopulated_fields_json.append({ + "id": "#%s" % field["field"].auto_id, + "name": field["field"].name, + "dependency_ids": ["#%s" % dependency.auto_id for dependency in field["dependencies"]], + "dependency_list": [dependency.name for dependency in field["dependencies"]], + "maxLength": field["field"].field.max_length or 50, + "allowUnicode": getattr(field["field"].field, "allow_unicode", False) + }) + + context.update({ + 'prepopulated_fields': prepopulated_fields, + 'prepopulated_fields_json': json.dumps(prepopulated_fields_json), + }) + return context + + +@register.tag(name='prepopulated_fields_js') +def prepopulated_fields_js_tag(parser, token): + return InclusionAdminNode(parser, token, func=prepopulated_fields_js, template_name="prepopulated_fields_js.html") + + +def submit_row(context): + """ + Display the row of buttons for delete and save. + """ + add = context['add'] + change = context['change'] + is_popup = context['is_popup'] + save_as = context['save_as'] + show_save = context.get('show_save', True) + show_save_and_continue = context.get('show_save_and_continue', True) + has_add_permission = context['has_add_permission'] + has_change_permission = context['has_change_permission'] + has_view_permission = context['has_view_permission'] + has_editable_inline_admin_formsets = context['has_editable_inline_admin_formsets'] + can_save = (has_change_permission and change) or (has_add_permission and add) or has_editable_inline_admin_formsets + can_save_and_continue = not is_popup and can_save and has_view_permission and show_save_and_continue + can_change = has_change_permission or has_editable_inline_admin_formsets + ctx = Context(context) + ctx.update({ + 'can_change': can_change, + 'show_delete_link': ( + not is_popup and context['has_delete_permission'] and + change and context.get('show_delete', True) + ), + 'show_save_as_new': not is_popup and has_change_permission and change and save_as, + 'show_save_and_add_another': ( + has_add_permission and not is_popup and + (not save_as or add) and can_save + ), + 'show_save_and_continue': can_save_and_continue, + 'show_save': show_save and can_save, + 'show_close': not(show_save and can_save) + }) + return ctx + + +@register.tag(name='submit_row') +def submit_row_tag(parser, token): + return InclusionAdminNode(parser, token, func=submit_row, template_name='submit_line.html') + + +@register.tag(name='change_form_object_tools') +def change_form_object_tools_tag(parser, token): + """Display the row of change form object tools.""" + return InclusionAdminNode( + parser, token, + func=lambda context: context, + template_name='change_form_object_tools.html', + ) + + +@register.filter +def cell_count(inline_admin_form): + """Return the number of cells used in a tabular inline.""" + count = 1 # Hidden cell with hidden 'id' field + for fieldset in inline_admin_form: + # Loop through all the fields (one per cell) + for line in fieldset: + for field in line: + count += 1 + if inline_admin_form.formset.can_delete: + # Delete checkbox + count += 1 + return count diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_urls.py b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_urls.py new file mode 100644 index 0000000..f817c25 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/admin_urls.py @@ -0,0 +1,56 @@ +from urllib.parse import parse_qsl, unquote, urlparse, urlunparse + +from django import template +from django.contrib.admin.utils import quote +from django.urls import Resolver404, get_script_prefix, resolve +from django.utils.http import urlencode + +register = template.Library() + + +@register.filter +def admin_urlname(value, arg): + return 'admin:%s_%s_%s' % (value.app_label, value.model_name, arg) + + +@register.filter +def admin_urlquote(value): + return quote(value) + + +@register.simple_tag(takes_context=True) +def add_preserved_filters(context, url, popup=False, to_field=None): + opts = context.get('opts') + preserved_filters = context.get('preserved_filters') + + parsed_url = list(urlparse(url)) + parsed_qs = dict(parse_qsl(parsed_url[4])) + merged_qs = {} + + if opts and preserved_filters: + preserved_filters = dict(parse_qsl(preserved_filters)) + + match_url = '/%s' % unquote(url).partition(get_script_prefix())[2] + try: + match = resolve(match_url) + except Resolver404: + pass + else: + current_url = '%s:%s' % (match.app_name, match.url_name) + changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name) + if changelist_url == current_url and '_changelist_filters' in preserved_filters: + preserved_filters = dict(parse_qsl(preserved_filters['_changelist_filters'])) + + merged_qs.update(preserved_filters) + + if popup: + from django.contrib.admin.options import IS_POPUP_VAR + merged_qs[IS_POPUP_VAR] = 1 + if to_field: + from django.contrib.admin.options import TO_FIELD_VAR + merged_qs[TO_FIELD_VAR] = to_field + + merged_qs.update(parsed_qs) + + parsed_url[4] = urlencode(merged_qs) + return urlunparse(parsed_url) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/log.py b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/log.py new file mode 100644 index 0000000..08c2345 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admin/templatetags/log.py @@ -0,0 +1,59 @@ +from django import template +from django.contrib.admin.models import LogEntry + +register = template.Library() + + +class AdminLogNode(template.Node): + def __init__(self, limit, varname, user): + self.limit, self.varname, self.user = limit, varname, user + + def __repr__(self): + return "" + + def render(self, context): + if self.user is None: + entries = LogEntry.objects.all() + else: + user_id = self.user + if not user_id.isdigit(): + user_id = context[self.user].pk + entries = LogEntry.objects.filter(user__pk=user_id) + context[self.varname] = entries.select_related('content_type', 'user')[:int(self.limit)] + return '' + + +@register.tag +def get_admin_log(parser, token): + """ + Populate a template variable with the admin log for the given criteria. + + Usage:: + + {% get_admin_log [limit] as [varname] for_user [context_var_containing_user_obj] %} + + Examples:: + + {% get_admin_log 10 as admin_log for_user 23 %} + {% get_admin_log 10 as admin_log for_user user %} + {% get_admin_log 10 as admin_log %} + + Note that ``context_var_containing_user_obj`` can be a hard-coded integer + (user ID) or the name of a template context variable containing the user + object whose ID you want. + """ + tokens = token.contents.split() + if len(tokens) < 4: + raise template.TemplateSyntaxError( + "'get_admin_log' statements require two arguments") + if not tokens[1].isdigit(): + raise template.TemplateSyntaxError( + "First argument to 'get_admin_log' must be an integer") + if tokens[2] != 'as': + raise template.TemplateSyntaxError( + "Second argument to 'get_admin_log' must be 'as'") + if len(tokens) > 4: + if tokens[4] != 'for_user': + raise template.TemplateSyntaxError( + "Fourth argument to 'get_admin_log' must be 'for_user'") + return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(tokens[5] if len(tokens) > 5 else None)) diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..556d253 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ar/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7e87432 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ast/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..49fbe0a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..aa3b1b9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Boris Chervenkov , 2012 +# Jannis Leidel , 2011 +# Lyuboslav Petrov , 2014 +# Todor Lubenov , 2011,2015 +# Venelin Stoykov , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Административна Документация" + +msgid "Home" +msgstr "Начало" + +msgid "Documentation" +msgstr "Документация" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklet-и за документация" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"За да инсталирате bookmarklet-и, задърпайте линка в лентата с отметки " +"(bookmarks toolbar), или щракнете с десния бутон и добавете линка в " +"отметките. Сега можете да изберете bookmarklet-а от която и да е страница на " +"сайта." + +msgid "Documentation for this page" +msgstr "Документация за тази страница" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Препраща Ви от която и да е страница към документацията за изгледа, който я " +"е генерирал." + +msgid "Tags" +msgstr "Етикети" + +msgid "List of all the template tags and their functions." +msgstr "Списък на всички етикети на шаблона и техните функции." + +msgid "Filters" +msgstr "Филтри" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Филтрите са действия, които могат да се използват към променливи в даден " +"шаблон, за да променят изхода." + +msgid "Models" +msgstr "Модели" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Моделите са описания на всички обекти в системата и свързаните с тях полета. " +"Всеки модел си има списък на полетата, които могат да бъдат достъпни както " +"шаблонни променливи" + +msgid "Views" +msgstr "Прегледи" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Всяка страница на публичния сайт се генерира от един изглед. Изгледа " +"определя кой шаблон се използва за генериране на страницата, и които обекти " +"са на разположение за този шаблон." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Инструменти за вашия браузър за бърз достъп до администраторската " +"функционалност." + +msgid "Please install docutils" +msgstr "Моля инсталирайте docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Системата за администраторска документация изисква библиотеката за python docutils." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Моля, попитайте вашите администратори да инсталирате docutils ." + +#, python-format +msgid "Model: %(name)s" +msgstr "Модел: %(name)s" + +msgid "Fields" +msgstr "Полета" + +msgid "Field" +msgstr "Поле" + +msgid "Type" +msgstr "Тип" + +msgid "Description" +msgstr "Описание" + +msgid "Methods with arguments" +msgstr "Методи и аргументи" + +msgid "Method" +msgstr "Метод" + +msgid "Arguments" +msgstr "Аргументи" + +msgid "Back to Model documentation" +msgstr " Върни се в документацията на модела" + +msgid "Model documentation" +msgstr "Модел документация" + +msgid "Model groups" +msgstr "Модел групи" + +msgid "Templates" +msgstr "Шаблони" + +#, python-format +msgid "Template: %(name)s" +msgstr "Template: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Шаблон: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Път за търсене на шаблон \"%(name)s\"" + +msgid "(does not exist)" +msgstr "(Не съществува)" + +msgid "Back to Documentation" +msgstr "Назад към Документацията" + +msgid "Template filters" +msgstr "Шаблонни филтри" + +msgid "Template filter documentation" +msgstr "Документация за Шаблонни филтри" + +msgid "Built-in filters" +msgstr "Вградени филтри" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"За да използвате тези филтри, сложи %(code)s във вашия шаблон, " +"преди да използвате филтъра." + +msgid "Template tags" +msgstr "Шаблон тагове" + +msgid "Template tag documentation" +msgstr "Документация за шаблонни тагове" + +msgid "Built-in tags" +msgstr "Вградени в тагове" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"За да използвате тези тагове, сложи %(code)s във вашия шаблон, " +"преди да използвате етикет." + +#, python-format +msgid "View: %(name)s" +msgstr "Изглед: %(name)s" + +msgid "Context:" +msgstr "Контекст:" + +msgid "Templates:" +msgstr "Шаблони:" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "Документация за Изгледи" + +msgid "Jump to namespace" +msgstr "Направо към именни пространства" + +msgid "Empty namespace" +msgstr "Empty именни пространства" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "Прегледи на празна именни пространства" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "етикет:" + +msgid "filter:" +msgstr "филтър:" + +msgid "view:" +msgstr "изглед:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Приложението %(app_label)r не е намерено" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Моделът %(model_name)r не е намерен в приложение %(app_label)r" + +msgid "model:" +msgstr "модел:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "свързания '%(app_label)s.%(data_type)s' обект" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "свързаните '%(app_label)s.%(object_name)s' обекти" + +#, python-format +msgid "all %s" +msgstr "всички %s" + +#, python-format +msgid "number of %s" +msgstr "брой %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s не прилича на обект от тип urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9ac735f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/bn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..5ead6ad --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 00:02+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"language/dsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: dsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Administrative Documentation" +msgstr "Administratiwna dokumentacija" + +msgid "Home" +msgstr "Startowy bok" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Bookmarklets" +msgstr "Skriptowe cytańske znamjenja" + +msgid "Documentation bookmarklets" +msgstr "Skriptowe cytańske znamjenja dokumentacije" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Aby skriptowe cytańske znamjenja instalěrował, śěgniśo wótkaz do swójeje " +"rědki cytańskich znamjenjow abo klikniśo z pšaweju tastu myški a pśidajśo " +"jen swójim cytańskim znamjenjam. Něnto móžośo skriptowe cytańske znamje z " +"drugego boka na sedle wubraś." + +msgid "Documentation for this page" +msgstr "Dokumentacija za toś ten bok" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Zmóžnja wam, z někakego boka do dokumentacije naglěda skócyś, kótaryž twóri " +"ten bok." + +msgid "Tags" +msgstr "Wobznamjenja" + +msgid "List of all the template tags and their functions." +msgstr "Lisćina wšych pśedłogowych wobznamjenjow a jich funkcijow." + +msgid "Filters" +msgstr "Filtry" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Filtry su akcije, kótarež daju se na wariable w pśedłoze nałožyś, aby wudaśe " +"změnili." + +msgid "Models" +msgstr "Modele" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Modele su wopisanja wšych objektow w systemje a jich pśisłušnych pólow. " +"Kuždy model ma lisćinu pólow, na kótarež maju pśistup ako pśedłogowe " +"wariable." + +msgid "Views" +msgstr "Naglědy" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Kuždy bok na zjawnem sedle twóri se pśez naglěd. Naglěd definěrujo, kótara " +"pśedłoga se wužywa, aby se bok napórał a kótare objekty su tej pśedłoze k " +"dispoziciji." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Rědy za waš wobglědowak za malsny pśistup na adminstratorowu funkcionalnosć." + +msgid "Please install docutils" +msgstr "Pšosym instalěrujśo docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Administratorowy dokumentaciski system pomina se Pythonowu biblioteku docutils." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Pšosym pšosćo swóje administratory, docutils " +"instalěrowaś." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Póla" + +msgid "Field" +msgstr "Pólo" + +msgid "Type" +msgstr "Typ" + +msgid "Description" +msgstr "Wopisanje" + +msgid "Methods with arguments" +msgstr "Metody z argumentami" + +msgid "Method" +msgstr "Metoda" + +msgid "Arguments" +msgstr "Argumenty" + +msgid "Back to Model documentation" +msgstr "Slědk k modelowej dokumentaciji" + +msgid "Model documentation" +msgstr "Modelowa dokumentacija" + +msgid "Model groups" +msgstr "Modelowe kupki" + +msgid "Templates" +msgstr "Pśedłogi" + +#, python-format +msgid "Template: %(name)s" +msgstr "Pśedłoga: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Pśedłoga: „%(name)s“" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Py´tańska sćažka za pśedłogu „%(name)s“:" + +msgid "(does not exist)" +msgstr "(njeeksistěrujo)" + +msgid "Back to Documentation" +msgstr "Slědk k dokumentaciji" + +msgid "Template filters" +msgstr "Pśedłogowe filtry" + +msgid "Template filter documentation" +msgstr "Dokumentacija za pśedłogowe filtry" + +msgid "Built-in filters" +msgstr "Zatwarjone filtry" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Aby toś te filtry wužywał, zasajźćo %(code)s do wójeje " +"pśedłogi, nježli až wužywaśo filter." + +msgid "Template tags" +msgstr "Pśedłogowe wobznamjenja" + +msgid "Template tag documentation" +msgstr "Dokumentacija za pśedłogowe wobznamjenja" + +msgid "Built-in tags" +msgstr "Zatworjone wobznamjenja" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Aby toś te wobznamjenja wužywał, zasajźćo %(code)s do wójeje " +"pśedłogi, nježli až wužywaśo wobznamjenje." + +#, python-format +msgid "View: %(name)s" +msgstr "Naglěd: %(name)s" + +msgid "Context:" +msgstr "Kontekst:" + +msgid "Templates:" +msgstr "Pśedłogi" + +msgid "Back to View documentation" +msgstr "Slědk k naglědowej dokumentaciji" + +msgid "View documentation" +msgstr "Naglědowa dokumentacija" + +msgid "Jump to namespace" +msgstr "K mjenjowemu rumoju skócyś" + +msgid "Empty namespace" +msgstr "Prozny mjenjowy rum" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Naglědy pó mjenjowem rumje %(name)s" + +msgid "Views by empty namespace" +msgstr "Naglědy pó proznem mjenjowem rumje" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Naglědowa funkcija: %(full_name)s. Mě: %(url_name)s.\n" + +msgid "tag:" +msgstr "wobznamjenje:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "naglěd:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Nałoženje %(app_label)r njenamakane" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r njejo se w nałoženju %(app_label)r namakał" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "pśisłušny objekt %(app_label)s.%(data_type)s“" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "pśisłušne objekty „%(app_label)s.%(object_name)s" + +#, python-format +msgid "all %s" +msgstr "wšykne %s" + +#, python-format +msgid "number of %s" +msgstr "ůicba %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "zda se, až %s njejo objekt urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e98cc37 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/el/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po new file mode 100644 index 0000000..4a97bca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_AU/LC_MESSAGES/django.po @@ -0,0 +1,275 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2015-01-18 08:34+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" +"django/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "Documentation" +msgstr "" + +msgid "Bookmarklets" +msgstr "" + +msgid "Documentation bookmarklets" +msgstr "" + +msgid "" +"\n" +"

    To install bookmarklets, drag the link to your bookmarks\n" +"toolbar, or right-click the link and add it to your bookmarks. Now you can\n" +"select the bookmarklet from any page in the site. Note that some of these\n" +"bookmarklets require you to be viewing the site from a computer designated\n" +"as \"internal\" (talk to your system administrator if you aren't sure if\n" +"your computer is \"internal\").

    \n" +msgstr "" + +msgid "Documentation for this page" +msgstr "" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Show object ID" +msgstr "" + +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "" + +msgid "Edit this object (current window)" +msgstr "" + +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "" + +msgid "Edit this object (new window)" +msgstr "" + +msgid "As above, but opens the admin page in a new window." +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Back to Model Documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to Views Documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +msgid "tag:" +msgstr "" + +msgid "filter:" +msgstr "" + +msgid "view:" +msgstr "" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "" + +#, python-format +msgid "all %s" +msgstr "" + +#, python-format +msgid "number of %s" +msgstr "" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..e513e88 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,260 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# jon_atkinson , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Home" + +msgid "Documentation" +msgstr "Documentation" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Documentation bookmarklets" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Documentation for this page" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Jumps you from any page to the documentation for the view that generates " +"that page." + +msgid "Tags" +msgstr "Tags" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Filters" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Models" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Views" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Templates" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "view:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r not found in app %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "the related `%(app_label)s.%(data_type)s` object" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "related `%(app_label)s.%(object_name)s` objects" + +#, python-format +msgid "all %s" +msgstr "all %s" + +#, python-format +msgid "number of %s" +msgstr "number of %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s does not appear to be a urlpattern object" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..45cff1e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,292 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2012-2013 +# Claude Paroz , 2014 +# Eduardo , 2017 +# Ernesto Avilés Vázquez , 2015 +# Herty Nava , 2013 +# Jannis Leidel , 2011 +# José Luis , 2016 +# Josue Naaman Nistal Guerra , 2014 +# Veronicabh , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Eduardo \n" +"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Documentacion Administrativa" + +msgid "Home" +msgstr "Inicio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklets de documentación" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Para instalar bookmarklets, arrastre el enlace a su barra de favoritos, o " +"pulse con el botón derecho el enlace y añádalo a sus favoritos. Ahora puede " +"escoger el bookmarklet desde cualquier página del sitio. " + +msgid "Documentation for this page" +msgstr "Documentación para esta página" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Lleva desde cualquier página a la documentación de la vista que la genera." + +msgid "Tags" +msgstr "Etiquetas" + +msgid "List of all the template tags and their functions." +msgstr "Lista de todas la etiquetas de plantillas y sus funciones." + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Los filtros son accciones se pueden aplicar a variables en una plantilla " +"para alterar el resultado." + +msgid "Models" +msgstr "Modelos" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Los modelos son descripciones de todos los objetos en el sistema y sus " +"campos asociados. Cada modelo tienen una lista de campos a los que se puede " +"acceder como variables de plantilla" + +msgid "Views" +msgstr "Vistas" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Cada página en el sitio público se genera a través de una vista. La vista " +"define qué plantilla se usa para generar la página y qué objetos están " +"disponibles para esa plantilla." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Herramientas para tu navegador para acceder a funciones de administración " +"rápidamente." + +msgid "Please install docutils" +msgstr "Por favor instale docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"El sistema de documentación de la administración require la biblioteca docutils de Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Por favor pida al administrador que instale docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Modelo: %(name)s" + +msgid "Fields" +msgstr "Campos" + +msgid "Field" +msgstr "Campo" + +msgid "Type" +msgstr "Tipo" + +msgid "Description" +msgstr "Descripción" + +msgid "Methods with arguments" +msgstr "Métodos con argumentos" + +msgid "Method" +msgstr "Método" + +msgid "Arguments" +msgstr "Argumentos" + +msgid "Back to Model documentation" +msgstr "Volver a la documentación del modelo" + +msgid "Model documentation" +msgstr "Documentación del modelo" + +msgid "Model groups" +msgstr "Grupo de modelos" + +msgid "Templates" +msgstr "Plantillas" + +#, python-format +msgid "Template: %(name)s" +msgstr "Plantilla: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Plantilla: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Buscar ruta para ejemplo \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(no existe)" + +msgid "Back to Documentation" +msgstr "Volver a la documentación" + +msgid "Template filters" +msgstr "Filtros de plantilla" + +msgid "Template filter documentation" +msgstr "Documentación de los filtros de plantilla" + +msgid "Built-in filters" +msgstr "Filtros integrados" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Para utilizar estos filtros, incluya %(code)s en su plantilla " +"antes de usar el filtro." + +msgid "Template tags" +msgstr "Etiquetas de plantilla" + +msgid "Template tag documentation" +msgstr "Documentación de las etiquetas de plantilla" + +msgid "Built-in tags" +msgstr "Etiquetas integradas" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Para utilizar estas etiquetas, incluya %(code)s en su plantilla " +"antes de utilizar la etiqueta." + +#, python-format +msgid "View: %(name)s" +msgstr "Vista: %(name)s" + +msgid "Context:" +msgstr "Contexto:" + +msgid "Templates:" +msgstr "Plantillas:" + +msgid "Back to View documentation" +msgstr "Volver a la documentación de la vista" + +msgid "View documentation" +msgstr "Ver la documentación" + +msgid "Jump to namespace" +msgstr "Ir al espacio de nombres" + +msgid "Empty namespace" +msgstr "Espacio de nombres vacío" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Visualizaciones por espacio de nombres %(name)s" + +msgid "Views by empty namespace" +msgstr "Visualizaciones por espacio de nombres vacío" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +"Visualizar funcion: %(full_name)s. Nombre: %(url_name)s.\n" + +msgid "tag:" +msgstr "etiqueta:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "vista:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "App %(app_label)r no encontrado" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" +"El modelo %(model_name)r no se ha encontrado en la aplicación %(app_label)r" + +msgid "model:" +msgstr "modelo:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "el objeto relacionado `%(app_label)s.%(data_type)s`" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "los objetos relacionados `%(app_label)s.%(object_name)s`" + +#, python-format +msgid "all %s" +msgstr "todo %s" + +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s no parece ser un objeto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..1693bcd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Federico Bond , 2013 +# Jannis Leidel , 2011 +# Ramiro Morales, 2012-2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Documentación administrativa" + +msgid "Home" +msgstr "Inicio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklets de documentación" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Para instalar bookmarklets, arrastre el enlace a su barra\n" +"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus " +"favoritos.\n" +"Ahora puede seleccionar el bookmarklet desde cualquier página en el sitio." + +msgid "Documentation for this page" +msgstr "Documentación de esta página" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Le lleva desde cualquier página a la documentación de la vista que la genera." + +msgid "Tags" +msgstr "Etiquetas" + +msgid "List of all the template tags and their functions." +msgstr "Lista de todas las etiquetas de plantilla y sus funciones." + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Los filtros son acciones que pueden ser aplicadas a variables en una " +"plantilla para alterar el resultado final." + +msgid "Models" +msgstr "Modelos" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Los modelos son descripciones de todos los objetos en el sistema y sus " +"campos asociados. Cada modelo contiene una lista de campos accesibles como " +"variables de plantilla" + +msgid "Views" +msgstr "Vistas" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Cada página en el sitio público es generada por una vista. La vista define " +"qué plantilla es utilizada para generar la página y qué objetos están " +"disponibles para esta plantilla." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Herramientas para su navegador para acceder rápidamente a la funcionalidad " +"de administración." + +msgid "Please install docutils" +msgstr "Por favor instale docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"El sistema de documentación de admin requiere la biblioteca Python docutils." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Por favor solicite a sus administradores de sistemas que instalen docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Modelo: %(name)s" + +msgid "Fields" +msgstr "Campos" + +msgid "Field" +msgstr "Campo" + +msgid "Type" +msgstr "Tipo" + +msgid "Description" +msgstr "Descripción" + +msgid "Methods with arguments" +msgstr "Métodos con argumentos" + +msgid "Method" +msgstr "Método" + +msgid "Arguments" +msgstr "Argumentos" + +msgid "Back to Model documentation" +msgstr "Volver a documentación de modelos" + +msgid "Model documentation" +msgstr "Documentación de modelos" + +msgid "Model groups" +msgstr "Grupos de modelos" + +msgid "Templates" +msgstr "Plantillas" + +#, python-format +msgid "Template: %(name)s" +msgstr "Plantilla: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Plantilla: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Buscar ruta para la plantilla \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(no existe)" + +msgid "Back to Documentation" +msgstr "Volver a la documentación" + +msgid "Template filters" +msgstr "Filtros de plantilla" + +msgid "Template filter documentation" +msgstr "Documentación de filtros de plantilla" + +msgid "Built-in filters" +msgstr "Filtros Django 'de fábrica'" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Para usar estos filtros, escriba %(code)s en su plantilla antes " +"de usar el filtro." + +msgid "Template tags" +msgstr "Etiquetas de plantilla" + +msgid "Template tag documentation" +msgstr "Documentación de etiquetas de plantilla" + +msgid "Built-in tags" +msgstr "Etiquetas Django 'de fábrica'" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Para usar estas etiquetas, escriba %(code)s en su plantilla " +"antes de usar la etiqueta." + +#, python-format +msgid "View: %(name)s" +msgstr "Vista: %(name)s" + +msgid "Context:" +msgstr "Contexto:" + +msgid "Templates:" +msgstr "Plantillas:" + +msgid "Back to View documentation" +msgstr "Volver a documentación de vistas" + +msgid "View documentation" +msgstr "Documentación de vistas" + +msgid "Jump to namespace" +msgstr "Ir a espacio de nombres" + +msgid "Empty namespace" +msgstr "Espacio de nombres vacío" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Vistas por espacio de nombres %(name)s" + +msgid "Views by empty namespace" +msgstr "Vistas por espacio de nombres vacío" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +"Función vista: %(full_name)s. Nombre: %(url_name)s.\n" + +msgid "tag:" +msgstr "etiqueta:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "vista:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Aplicación %(app_label)r no encontrada" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Modelo %(model_name)r no encontrado en aplicación %(app_label)r" + +msgid "model:" +msgstr "modelo:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "el objeto `%(app_label)s.%(data_type)s` relacionado" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "objetos `%(app_label)s.%(object_name)s` relacionados" + +#, python-format +msgid "all %s" +msgstr "todos los %s" + +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s no parece ser un objeto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b4ce79b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..164f061 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..3242cb0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,260 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abraham Estrada, 2011-2012 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" +"language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Inicio" + +msgid "Documentation" +msgstr "Documentación" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklets de documentación" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Documentación de esta página" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Le lleva desde cualquier página a la documentación de la vista que la genera." + +msgid "Tags" +msgstr "Etiquetas" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Modelos" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Vistas" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Plantillas" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "etiqueta:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "ver:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Modelo %(model_name)r no encontrado en aplicación %(app_label)r" + +msgid "model:" +msgstr "modelo:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "el objeto `%(app_label)s.%(data_type)s` relacionado" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "objetos `%(app_label)s.%(object_name)s` relacionados" + +#, python-format +msgid "all %s" +msgstr "todos los %s" + +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s no parece ser un objeto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8efd5fb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/et/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..433e6f3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..d04b102 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,278 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017 +# Elias Luttinen , 2015 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Hallinnan ohjeet" + +msgid "Home" +msgstr "Etusivu" + +msgid "Documentation" +msgstr "Ohjeita" + +msgid "Bookmarklets" +msgstr "Kirjanmerkkiset" + +msgid "Documentation bookmarklets" +msgstr "Ohjeiden kirjanmerkkiset" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Asenna kirjanmerkkinen raahaamalla linkki kirjanmerkkien työkalupalkkiin tai " +"napsauttamalla linkkiä oikeanpuoleisella hiiren painikkeella ja valitsemalla " +"kirjanmerkkeihin lisäämisen. Sen jälkeen voit valita kirjanmerkkisen miltä " +"tahansa sivuston sivulta." + +msgid "Documentation for this page" +msgstr "Tämän sivun ohjeita" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "Näyttää ohjeet, jotka koskevat ko. sivun luonutta näkymää." + +msgid "Tags" +msgstr "Tagit" + +msgid "List of all the template tags and their functions." +msgstr "Lista kaikista mallinetunnisteista ja niiden toiminnasta." + +msgid "Filters" +msgstr "Suodattimet" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Suotimet ovat toimintoja, jotka käsittelevät mallineessa käytettävän " +"muuttujan ulostuloa." + +msgid "Models" +msgstr "Mallit" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Mallit kuvaavat järjestelmän kaikkia objekteja ja niihin liittyviä kenttiä. " +"Kenttiä pystyy käyttämään mallineista mallinemuuttujina." + +msgid "Views" +msgstr "Näkymät" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Jokainen sivuston sivu on näkymän luoma. Näkymä määrittelee mitä mallinetta " +"sivun luontiin käytetään ja mitä objekteja mallineella on käytössä." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "Selaintyökaluja, joilla pääset nopeasti hallinnointitoimintoihin." + +msgid "Please install docutils" +msgstr "Ole hyvä ja asenna docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Hallinnan dokumentaatio vaatii Pythonin docutils-" +"kirjaston." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "Pyydä ylläpitäjiä asentamaan docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Malli: %(name)s" + +msgid "Fields" +msgstr "Kentät" + +msgid "Field" +msgstr "Kenttä" + +msgid "Type" +msgstr "Tyyppi" + +msgid "Description" +msgstr "Selite" + +msgid "Methods with arguments" +msgstr "Metodit argumentteineen" + +msgid "Method" +msgstr "Metodi" + +msgid "Arguments" +msgstr "Argumentit" + +msgid "Back to Model documentation" +msgstr "Takaisin mallidokumentaatioon" + +msgid "Model documentation" +msgstr "Mallidokumentaatio" + +msgid "Model groups" +msgstr "Malliryhmät" + +msgid "Templates" +msgstr "Mallineet" + +#, python-format +msgid "Template: %(name)s" +msgstr "Malline: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Malline: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Polun \"%(name)s\" hakupolku:" + +msgid "(does not exist)" +msgstr "(ei ole olemassa)" + +msgid "Back to Documentation" +msgstr "Takaisin dokumentaatioon" + +msgid "Template filters" +msgstr "Mallinesuotimet" + +msgid "Template filter documentation" +msgstr "Mallinesuodindokumentaatio" + +msgid "Built-in filters" +msgstr "Sisäänrakennetut suotimet" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Käyttääksesi näitä suotimia, sisällytä %(code)s mallineesi " +"alkuun." + +msgid "Template tags" +msgstr "Mallinetunnisteet" + +msgid "Template tag documentation" +msgstr "Mallinetunnistedokumentaatio" + +msgid "Built-in tags" +msgstr "Sisäänrakennetut tunnisteet" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Käyttääksesi näitä tunnisteita, sisällytä %(code)s mallineesi " +"alkuun." + +#, python-format +msgid "View: %(name)s" +msgstr "Näkymä: %(name)s" + +msgid "Context:" +msgstr "Konteksti:" + +msgid "Templates:" +msgstr "Mallineet:" + +msgid "Back to View documentation" +msgstr "Takaisin näkymädokumentaatioon" + +msgid "View documentation" +msgstr "Näkymädokumentaatio" + +msgid "Jump to namespace" +msgstr "Siirry nimiavaruuteen" + +msgid "Empty namespace" +msgstr "Tyhjä nimiavaruus" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Näkymät nimiavaruuden %(name)s mukaan" + +msgid "Views by empty namespace" +msgstr "Näkymät tyhjän nimiavaruuden mukaan" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +"Näkymäfunktio: %(full_name)s. Nimi: %(url_name)s.\n" + +msgid "tag:" +msgstr "tagi:" + +msgid "filter:" +msgstr "suodatin:" + +msgid "view:" +msgstr "näkymä:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Sovellusta %(app_label)r ei löydy" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Sovelluksesta %(app_label)r ei löydy mallia %(model_name)r" + +msgid "model:" +msgstr "malli:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "tähän liittyvä `%(app_label)s.%(data_type)s`-kohde" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "tähän liittyvät `%(app_label)s.%(object_name)s`-kohteet" + +#, python-format +msgid "all %s" +msgstr "kaikki %s" + +#, python-format +msgid "number of %s" +msgstr "%s-kohteiden lukumäärä" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s ei näytä olevan urlpattern-olio" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a5d776c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..7cae936 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2013-2016,2018 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2018-10-19 16:29+0000\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Administrative Documentation" +msgstr "Documentation technique" + +msgid "Home" +msgstr "Accueil" + +msgid "Documentation" +msgstr "Documentation" + +msgid "Bookmarklets" +msgstr "Signets" + +msgid "Documentation bookmarklets" +msgstr "Documentation des signets" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Pour installer des signets, faites glisser le lien vers votre barre de " +"marques-pages, ou effectuez un clic droit sur le lien et ajoutez-le. " +"Maintenant, vous pouvez le sélectionner depuis n'importe quelle page du site." + +msgid "Documentation for this page" +msgstr "Documentation pour cette page" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Vous envoie de n'importe quelle page vers la documentation de la vue qui a " +"généré cette page." + +msgid "Tags" +msgstr "Balises" + +msgid "List of all the template tags and their functions." +msgstr "Liste de toutes les balises de gabarit et leur fonction." + +msgid "Filters" +msgstr "Filtres" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Les filtres sont des actions qui peuvent être appliquées à des variables " +"dans un gabarit pour modifier leur valeur affichée." + +msgid "Models" +msgstr "Modèles" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Les modèles sont des descriptions de tous les objets du système avec leurs " +"champs associés. Chaque modèle possède une liste de champs auxquels on peut " +"accéder comme pour les variables de gabarit" + +msgid "Views" +msgstr "Vues" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Chaque page du site public est générée par une vue. La vue détermine le " +"gabarit utilisé pour générer la page ainsi que les objets qui sont " +"disponibles dans le gabarit." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Outils permettant au navigateur d'accéder rapidement aux fonctionnalités de " +"l'interface d'administration." + +msgid "Please install docutils" +msgstr "Veuillez installer docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Le système de documentation de l'interface d'administration nécessite la " +"bibliothèque Python docutils." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Demandez à votre administrateur système d'installer docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Modèle : %(name)s" + +msgid "Fields" +msgstr "Champs" + +msgid "Field" +msgstr "Champ" + +msgid "Type" +msgstr "Type" + +msgid "Description" +msgstr "Description" + +msgid "Methods with arguments" +msgstr "Méthodes avec paramètres" + +msgid "Method" +msgstr "Méthode" + +msgid "Arguments" +msgstr "Paramètres" + +msgid "Back to Model documentation" +msgstr "Retour à la documentation des modèles" + +msgid "Model documentation" +msgstr "Documentation des modèles" + +msgid "Model groups" +msgstr "Groupes de modèles" + +msgid "Templates" +msgstr "Gabarits" + +#, python-format +msgid "Template: %(name)s" +msgstr "Gabarit : %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Gabarit : « %(name)s »" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Chemin de recherche du gabarit « %(name)s » :" + +msgid "(does not exist)" +msgstr "(n'existe pas)" + +msgid "Back to Documentation" +msgstr "Retour à la documentation" + +msgid "Template filters" +msgstr "Filtres de gabarit" + +msgid "Template filter documentation" +msgstr "Documentation des filtres de gabarit" + +msgid "Built-in filters" +msgstr "Filtres intégrés" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Pour utiliser ces filtres, placez %(code)s dans votre gabarit " +"avant d'utiliser un des filtres." + +msgid "Template tags" +msgstr "Balises de gabarit" + +msgid "Template tag documentation" +msgstr "Documentation des balises de gabarit" + +msgid "Built-in tags" +msgstr "Balises intégrées" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Pour utiliser ces balises, placez %(code)s dans le gabarit " +"avant d'utiliser une des balises." + +#, python-format +msgid "View: %(name)s" +msgstr "Vue : %(name)s" + +msgid "Context:" +msgstr "Contexte :" + +msgid "Templates:" +msgstr "Gabarits :" + +msgid "Back to View documentation" +msgstr "Retour à la documentation des vues" + +msgid "View documentation" +msgstr "Documentation des vues" + +msgid "Jump to namespace" +msgstr "Aller à l'espace de noms" + +msgid "Empty namespace" +msgstr "Espace de noms vide" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Vues par espace de noms %(name)s" + +msgid "Views by empty namespace" +msgstr "Vues par espace de noms vide" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +"Fonction de vue : %(full_name)s. Nom : %(url_name)s.\n" + +msgid "tag:" +msgstr "mot-clé :" + +msgid "filter:" +msgstr "filtre :" + +msgid "view:" +msgstr "vue :" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "L'application %(app_label)r n'a pas été trouvée" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" +"Le modèle %(model_name)r n'a pas été trouvé dans l'application %(app_label)r" + +msgid "model:" +msgstr "modèle :" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "l'objet « %(app_label)s.%(data_type)s » en relation" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "les objets « %(app_label)s.%(object_name)s » en relation" + +#, python-format +msgid "all %s" +msgstr "tous les %s" + +#, python-format +msgid "number of %s" +msgstr "nombre de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s ne semble pas être un objet urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po new file mode 100644 index 0000000..d786e70 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ga/LC_MESSAGES/django.po @@ -0,0 +1,262 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Luke Blaney , 2019 +# Michael Thornhill , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2019-06-22 21:37+0000\n" +"Last-Translator: Luke Blaney \n" +"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ga\n" +"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " +"4);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Baile" + +msgid "Documentation" +msgstr "Doiciméadúchán" + +msgid "Bookmarklets" +msgstr "Leabharmharcín" + +msgid "Documentation bookmarklets" +msgstr "Leabharmharcín doiciméadúchán" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Doiciméadúchán le hadhaigh an leathanach seo" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Tógann se tusa ón aon leathanach go dtí an doiciméadúchán le hadhaigh an " +"radharc a rinne an leathanach." + +msgid "Tags" +msgstr "Clibeanna" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Scagairí" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Samhla" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Radharcanna" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "Cineál" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Teimpléid" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "clib:" + +msgid "filter:" +msgstr "scag:" + +msgid "view:" +msgstr "radharc:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Ní bhfuarthas samhail %(model_name)r i bhfeidhmclár %(app_label)r" + +msgid "model:" +msgstr "samhail:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "An oibiacht gaolmhara `%(app_label)s.%(data_type)s`" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "Oibiachtí gaolmhara `%(app_label)s.%(object_name)s`" + +#, python-format +msgid "all %s" +msgstr "gach %s" + +#, python-format +msgid "number of %s" +msgstr "líon %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "Feiceann sé nach bhfuil %s oibiacht urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po new file mode 100644 index 0000000..6f2a746 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gd/LC_MESSAGES/django.po @@ -0,0 +1,288 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# GunChleoc, 2015-2016 +# GunChleoc, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-22 17:29+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" +"language/gd/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gd\n" +"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" + +msgid "Administrative Documentation" +msgstr "Docamaideadh na rianachd" + +msgid "Home" +msgstr "Dhachaigh" + +msgid "Documentation" +msgstr "Docamaideadh" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklets an docamaididh" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Gus bookmarklet a stàladh, slaodaich an ceangal gu bàr-inneal nan comharran-" +"lìn agad no dèan briogadh deas air a’ cheangal is cuir e ris na comharran-" +"lìn agad. ’S urrainn dhut am bookmarklet a thaghadh o duilleag sam bith san " +"làrach an uairsin." + +msgid "Documentation for this page" +msgstr "Docamaideadh airson na duilleige seo" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Gearraidh tu leum o duilleag sam bith dhan docamaideadh airson an t-" +"seallaidh a ghineas an duilleag sin." + +msgid "Tags" +msgstr "Tagaichean" + +msgid "List of all the template tags and their functions." +msgstr "" +"Liosta dhe thagaichean nan ùrlaran uile ’s dhe na foincseanan a th’ aca." + +msgid "Filters" +msgstr "Criathragan" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"’S e gnìomhan a tha sna criathragan as urrainn dhut cur an sàs air " +"caochladairean ann an teamplaid gus an t-às-chur atharrachadh." + +msgid "Models" +msgstr "Modailean" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"’S e tuairisgeulan air a h-uile oibseact san t-siostam ’s air na raointean " +"co-cheangailte riutha-san a tha sna modailean. Tha liosta dhe raointean aig " +"gach modail as urrainn dhut inntrigeadh mar chaochladairean teamplaide." + +msgid "Views" +msgstr "Seallaidhean" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Thèid gach duilleag air an làrach phoblach a ghintinn le sealladh. Mìnichidh " +"an sealladh dè an teamplaid a thèid a chleachdadh gus an duilleag a ghintinn " +"agus dè na h-oibseactan as urrainn dhan teamplaid ud a chleachdadh." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Innealan airson a’ bhrabhsair agad gus gnìomhan nan rianairean inntrigeadh " +"gu luath." + +msgid "Please install docutils" +msgstr "Stàlaich docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Tha siostam docamaideadh na rianachd feumach air an leabharlann docutils aig Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Iarr air na rianairean agad gun stàlaich iad docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Modail: %(name)s" + +msgid "Fields" +msgstr "Raointean" + +msgid "Field" +msgstr "Raoin" + +msgid "Type" +msgstr "Seòrsa" + +msgid "Description" +msgstr "Tuairisgeul" + +msgid "Methods with arguments" +msgstr "Modhan le argamaidean" + +msgid "Method" +msgstr "Modh" + +msgid "Arguments" +msgstr "Argamaidean" + +msgid "Back to Model documentation" +msgstr "Till gu docamaideadh modail" + +msgid "Model documentation" +msgstr "Docamaideadh modail" + +msgid "Model groups" +msgstr "Buidhnean modail" + +msgid "Templates" +msgstr "Teamplaidean" + +#, python-format +msgid "Template: %(name)s" +msgstr "Teamplaid: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Teamplaid: “%(name)s”" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Slighe-luirg airson teamplaid “%(name)s”:" + +msgid "(does not exist)" +msgstr "(chan eil e ann)" + +msgid "Back to Documentation" +msgstr "Till gun docamaideadh" + +msgid "Template filters" +msgstr "Criathragan teamplaid" + +msgid "Template filter documentation" +msgstr "Docamaideadh air criathragan teamplaid" + +msgid "Built-in filters" +msgstr "Criathragan ’na bhroinn" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Gus na criathragan seo a chleachdadh, cuir %(code)s san " +"teamplaid agad mus cleachd thu a’ chriathrag." + +msgid "Template tags" +msgstr "Tagaichean teamplaid" + +msgid "Template tag documentation" +msgstr "Docamaideadh air tagaichean teamplaid" + +msgid "Built-in tags" +msgstr "Tagaichean ’na bhroinn" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Gus na tagaichean seo a chleachdadh, cuir %(code)s san " +"teamplaid agad mus cleachd thu an taga." + +#, python-format +msgid "View: %(name)s" +msgstr "Sealladh: %(name)s" + +msgid "Context:" +msgstr "Co-theacsa:" + +msgid "Templates:" +msgstr "Teamplaidean:" + +msgid "Back to View documentation" +msgstr "Till gu docamaideadh nan seallaidhean" + +msgid "View documentation" +msgstr "Docamaideadh nan seallaidhean" + +msgid "Jump to namespace" +msgstr "Gearr leum dhan ainm-spàs" + +msgid "Empty namespace" +msgstr "Ainm-spàs falamh" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Seallaidhean a-rèir ainm-spàs %(name)s" + +msgid "Views by empty namespace" +msgstr "Seallaidhean a-rèir an ainm-spàis fhalaimh" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Foincsean seallaidh: %(full_name)s. Ainm: " +"%(url_name)s.\n" + +msgid "tag:" +msgstr "taga:" + +msgid "filter:" +msgstr "criathrag:" + +msgid "view:" +msgstr "sealladh:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Cha deach aplacaid %(app_label)r a lorg" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Cha deach modail %(model_name)r a lorg ann an aplacaid %(app_label)r" + +msgid "model:" +msgstr "modail:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "an t-oibseact `%(app_label)s.%(data_type)s` dàimheach" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "na h-oibseactan `%(app_label)s.%(object_name)s` dàimheach" + +#, python-format +msgid "all %s" +msgstr "a h-uile %s" + +#, python-format +msgid "number of %s" +msgstr "àireamh dhe %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "Chan eil coltas oibseact urlpattern air %s" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e126f35 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e789b5a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..0b70aa7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,264 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# aljosa , 2012 +# Filip Cuk , 2016 +# Jannis Leidel , 2011 +# Mislav Cimperšak , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Croatian (http://www.transifex.com/django/django/language/" +"hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgid "Administrative Documentation" +msgstr "Administrativna dokumentacija" + +msgid "Home" +msgstr "Početna" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Dokumentacija bookmarklets-a" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Dokumentacija za ovu stranicu" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Preusmjeri te sa bilo koje stranice na dokumentaciju za taj prikaz (view) " +"koji generira stranicu." + +msgid "Tags" +msgstr "Tagovi" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Filteri" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Modeli" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Views" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "Molimo instalirajte docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "Polja" + +msgid "Field" +msgstr "Polje" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "Opis" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Predlošci" + +#, python-format +msgid "Template: %(name)s" +msgstr "Predložak: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Predložak: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "(ne postoji)" + +msgid "Back to Documentation" +msgstr "Povratak na dokumentaciju" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "Predlošci:" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "prikaz:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Aplikacija %(app_label)r nije pronađena" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r nije pronađen u aplikaciji %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "povezani `%(app_label)s.%(data_type)s` objekt" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "povezani `%(app_label)s.%(object_name)s` objekti" + +#, python-format +msgid "all %s" +msgstr "svi %s" + +#, python-format +msgid "number of %s" +msgstr "broj %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "izgleda da %s nije urlpattern objekt" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..a3a639e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 00:02+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Administrative Documentation" +msgstr "Administratiwna dokumentacija" + +msgid "Home" +msgstr "Startowa strona" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Bookmarklets" +msgstr "Skriptowe zapołožki" + +msgid "Documentation bookmarklets" +msgstr "Skriptowe zapołožki dokumentacije" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Zo byšće skriptowe zapołožki instalował, ćehńće wotkaz do swojeje lajsty " +"zapołožkow abo klikńće z prawej tastu myški na wotkaz a přidajće jón k " +"swojim zapołožkam. Móžeće skriptowu zapołožku nětko z kóždeje strony na " +"sydle wubrać." + +msgid "Documentation for this page" +msgstr "Dokumentacija za tutu stronu" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Zmóžnja wam, wot někajkeje strony do dokumentacije napohlada skočić, kotryž " +"je tu stronu wutworił." + +msgid "Tags" +msgstr "Znački" + +msgid "List of all the template tags and their functions." +msgstr "Lisćina wšěch předłohowych značkow a jich funkcijow." + +msgid "Filters" +msgstr "Filtry" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Filtry su akcije, kotrež dadźa so na wariable w předłoze nałožić, zo bychu " +"wudaće změnili." + +msgid "Models" +msgstr "Modele" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Modele su wopisanja wšěch objektow w systemje a jich přisłušnych polow. " +"Kóždy model ma lisćinu polow, na kotrež maja přistup jako předłohowe " +"wariable." + +msgid "Views" +msgstr "Napohlady" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Kóžda strona na zjawnym sydle so přez napohlad twori. Napohlad definuje, " +"kotra předłoha so wužiwa, zo by stronu wutworiła a kotre objekty su tej " +"přełoze k dispoziciji." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Nastroje za waš wobhladowak za spěšny přistup na administratorowu " +"funkcionalnosć." + +msgid "Please install docutils" +msgstr "Prošu instalujće docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Administratorowy dokumentaciski system sej Pythonowu biblioteku docutils wužaduje." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Prošu prošće swojich administratorow, docutils " +"instalować." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Pola" + +msgid "Field" +msgstr "Polo" + +msgid "Type" +msgstr "Typ" + +msgid "Description" +msgstr "Wopisanje" + +msgid "Methods with arguments" +msgstr "Metody z argumentami" + +msgid "Method" +msgstr "Metoda" + +msgid "Arguments" +msgstr "Argumenty" + +msgid "Back to Model documentation" +msgstr "Wróćo k modelowej dokumentaciji" + +msgid "Model documentation" +msgstr "Modelowa dokumentacija" + +msgid "Model groups" +msgstr "Modelowe skupiny" + +msgid "Templates" +msgstr "Předłohi" + +#, python-format +msgid "Template: %(name)s" +msgstr "Předłoha: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Předłoha: „%(name)s“" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Pytanska šćežka za předłohu „%(name)s“:" + +msgid "(does not exist)" +msgstr "(njeeksistuje)" + +msgid "Back to Documentation" +msgstr "Wróćo k dokumentaciji" + +msgid "Template filters" +msgstr "Předłohowe filtry" + +msgid "Template filter documentation" +msgstr "Dokumentacija předłohowych filtrow" + +msgid "Built-in filters" +msgstr "Zatwarjene filtry" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Zo byšće tute filtry wužiwał, zasadźće %(code)s do swojeje " +"předłohi, prjedy hač filter wužiwaće." + +msgid "Template tags" +msgstr "Předłohowe znački" + +msgid "Template tag documentation" +msgstr "Dokumentacija předłohowych značkow" + +msgid "Built-in tags" +msgstr "Zatwarjene znački" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Zo byšće tute znački wužiwał, zasadźće %(code)s do swojeje " +"předłohi, prjedy hač značku wužiwaće." + +#, python-format +msgid "View: %(name)s" +msgstr "Napohlad: %(name)s" + +msgid "Context:" +msgstr "Kontekst:" + +msgid "Templates:" +msgstr "Předłohi:" + +msgid "Back to View documentation" +msgstr "Wróćo k napohladowej dokumentaciji" + +msgid "View documentation" +msgstr "Napohladowa dokumentacija" + +msgid "Jump to namespace" +msgstr "K mjenowemu rumej skočić" + +msgid "Empty namespace" +msgstr "Prózdny mjenowy rum" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Napohlady po mjenowym rumje %(name)s" + +msgid "Views by empty namespace" +msgstr "Napohlady po prózdnym mjenowym rumje" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Napohladowa funkcija: %(full_name)s. Mjeno: " +"%(url_name)s.\n" + +msgid "tag:" +msgstr "značka:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "napohlad:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Nałoženje %(app_label)r njenamakane" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r njeje so w nałoženju %(app_label)r namakał" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "přisłušny objekt %(app_label)s.%(data_type)s“" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "přisłušne objekty %(app_label)s.%(object_name)s“" + +#, python-format +msgid "all %s" +msgstr "wšě %s" + +#, python-format +msgid "number of %s" +msgstr "ličba %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "zda so, zo %s objekt urlpattern njeje" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..318768a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..d1fd38b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016 +# Attila Nagy <>, 2012 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: János R (Hangya)\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Adminisztrációs dokumentáció" + +msgid "Home" +msgstr "Kezdőlap" + +msgid "Documentation" +msgstr "Dokumentáció" + +msgid "Bookmarklets" +msgstr "Könyvjelzők" + +msgid "Documentation bookmarklets" +msgstr "Dokumentum könyvjelzők" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"A könyvjelzők felvételéhez húzza a könyvjelzők linkjét az eszköztárra, vagy " +"kattintson rájuk jobb egérgombbal és úgy adja hozzá. Ezután már ki tudja " +"választani a könyvjelzőt a honlap bármely oldaláról." + +msgid "Documentation for this page" +msgstr "Az oldal dokumentációja" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Bármely oldalról annak a nézetnek a dokumentációjára ugrik, amely a kérdéses " +"oldalt generálta." + +msgid "Tags" +msgstr "Címkék" + +msgid "List of all the template tags and their functions." +msgstr "" +"Az összes sablon címke (template tags) és a hozzá tartozó függvények listája" + +msgid "Filters" +msgstr "Szűrők" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"A szűrők olyan műveletek, amelyeket változókon végrehajtva a sablon kimenete " +"módosul." + +msgid "Models" +msgstr "Modellek" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"A modellek a rendszerben található objektumok és a hozzá tartozó mezők " +"leírásai. Minden modell rendelkezik mezőkkel, amelyek a sablonokban " +"változóként érhetők el." + +msgid "Views" +msgstr "Nézetek" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"A honlapon minden oldalt egy nézet generál. A nézet definiálja, melyik " +"sablonból készül az oldal, és milyen objektumok állnak az adott nézet " +"rendelkezésére." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "Segédeszközök a böngészőjébe az admin funkciók gyors eléréséhez." + +msgid "Please install docutils" +msgstr "Kérem telepítse a docutils-t" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Az adminisztrációs dokumentáció működéséhez szükség van a Python docutils könyvtárára." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Kérje meg a rendszergazdát, hogy telepítse a docutils-t." + +#, python-format +msgid "Model: %(name)s" +msgstr "%(name)s modell" + +msgid "Fields" +msgstr "Mezők" + +msgid "Field" +msgstr "Mező" + +msgid "Type" +msgstr "Típus" + +msgid "Description" +msgstr "Leírás" + +msgid "Methods with arguments" +msgstr "Metódusok és paramétereik" + +msgid "Method" +msgstr "Metódus" + +msgid "Arguments" +msgstr "Paraméterek" + +msgid "Back to Model documentation" +msgstr "Vissza a modell dokumentációhoz" + +msgid "Model documentation" +msgstr "Modell dokumentáció" + +msgid "Model groups" +msgstr "Modell csoportok" + +msgid "Templates" +msgstr "Sablonok" + +#, python-format +msgid "Template: %(name)s" +msgstr "%(name)s sablon" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "%(name)s sablon" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "\"%(name)s\" sablon keresési útvonala:" + +msgid "(does not exist)" +msgstr "(nem létezik)" + +msgid "Back to Documentation" +msgstr "Vissza a dokumentációhoz" + +msgid "Template filters" +msgstr "Sablon szűrők" + +msgid "Template filter documentation" +msgstr "Sablon szűrő dokumentáci" + +msgid "Built-in filters" +msgstr "Beépített szűrők" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Ezen szűrők használatához a %(code)s kódrészletnek kell " +"szerepelnie használat előtt a sablonban." + +msgid "Template tags" +msgstr "Sablon címkék" + +msgid "Template tag documentation" +msgstr "Sablon címke dokumentáció" + +msgid "Built-in tags" +msgstr "Beépített címkék" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Ezen címkék használatához a %(code)s kódrészletnek kell " +"szerepelnie használat előtt a sablonban." + +#, python-format +msgid "View: %(name)s" +msgstr "%(name)s nézet" + +msgid "Context:" +msgstr "Környezet:" + +msgid "Templates:" +msgstr "Sablonok:" + +msgid "Back to View documentation" +msgstr "Vissza a nézetek dokumentációhoz" + +msgid "View documentation" +msgstr "Nézet dokumentáció" + +msgid "Jump to namespace" +msgstr "Ugrás a névtérhez" + +msgid "Empty namespace" +msgstr "Üres névtér" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "%(name)s névtérhez tartozó nézetek" + +msgid "Views by empty namespace" +msgstr "Névtér nélküli nézetek" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Nézet függvény: %(full_name)s. Név: %(url_name)s.\n" + +msgid "tag:" +msgstr "címke:" + +msgid "filter:" +msgstr "szűrő:" + +msgid "view:" +msgstr "nézet:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "%(app_label)r alkalmazás nem található" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" +"%(model_name)r modell nem található a következő alkalmazásban: %(app_label)r" + +msgid "model:" +msgstr "modell:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "a kapcsolódó '%(app_label)s.%(data_type)s' objektum" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "kapcsolódó '%(app_label)s.%(object_name)s' objektumok" + +#, python-format +msgid "all %s" +msgstr "minden %s" + +#, python-format +msgid "number of %s" +msgstr "%s mennyisége" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s nem tűnik egy urlpattern objektumnak." diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..f20e8b6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,260 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Initio" + +msgid "Documentation" +msgstr "Documentation" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Documentation bookmarklets" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Documentation pro iste pagina" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Transporta vos ab omne pagina al documentation pro le visualisation que " +"genera ille pagina." + +msgid "Tags" +msgstr "Etiquettas" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Modellos" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Visualisationes" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Patronos" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "etiquetta:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "visualisation:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Modello %(model_name)r non trovate in application %(app_label)r" + +msgid "model:" +msgstr "modello:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "le objecto `%(app_label)s.%(data_type)s` connexe" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "objectos `%(app_label)s.%(object_name)s` connexe" + +#, python-format +msgid "all %s" +msgstr "tote le %s" + +#, python-format +msgid "number of %s" +msgstr "numero de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s non pare esser un objecto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9813d7c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.po new file mode 100644 index 0000000..069a4eb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/id/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fery Setiawan , 2015-2016 +# Jannis Leidel , 2011 +# rodin , 2011-2012 +# rodin , 2013-2014,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Administrative Documentation" +msgstr "Dokumentasi Administrasi" + +msgid "Home" +msgstr "Beranda" + +msgid "Documentation" +msgstr "Dokumentasi" + +msgid "Bookmarklets" +msgstr "Bookmarklet" + +msgid "Documentation bookmarklets" +msgstr "Bookmarklet dokumentasi" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Untuk memasang bookmarklet, tarik tautan ke bilah markah, atau klik kanan " +"tautan dan tambahkan ke markah Anda. Sekarang Anda dapat memilih bookmarklet " +"dari semua halaman di situs." + +msgid "Documentation for this page" +msgstr "Dokumentasi untuk laman ini" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Buka dari laman apa saja ke laman dokumentasi untuk view yang menghasilkan " +"laman tersebut." + +msgid "Tags" +msgstr "Tag" + +msgid "List of all the template tags and their functions." +msgstr "Daftar seluruh tag templat dan fungsinya." + +msgid "Filters" +msgstr "Filter" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Filter merupakan tindakan yang dapat diterapkan pada variabel dalam sebuah " +"templat untuk mengubah keluaran." + +msgid "Models" +msgstr "Model" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Model merupakan deskripsi semua objek dalam sistem dan bidang yang terkait. " +"Setiap model memiliki beberapa bidang yang dapat diakses sebagai variabel " +"templat" + +msgid "Views" +msgstr "View" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Setiap laman pada situs publik dihasilkan oleh sebuah 'view'. 'View' " +"mendefinisikan templat mana yang digunakan untuk menghasilkan laman dan " +"objek mana yang tersedia untuk templat tersebut." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Alat untuk peramban Anda untuk mempercepat akses fungsionalitas admin. " + +msgid "Please install docutils" +msgstr "Instal docutils." + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Sistem dokumentasi admin membutuhkan pustaka docutils dari Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Ajukan permintaan kepada administrator Anda untuk menginstal docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Bidang" + +msgid "Field" +msgstr "Bidang" + +msgid "Type" +msgstr "Tipe" + +msgid "Description" +msgstr "Deskripsi" + +msgid "Methods with arguments" +msgstr "Metode dengan argumen" + +msgid "Method" +msgstr "Metode" + +msgid "Arguments" +msgstr "Argumen" + +msgid "Back to Model documentation" +msgstr "Kembali ke Dokumentasi Model" + +msgid "Model documentation" +msgstr "Dokumentasi model" + +msgid "Model groups" +msgstr "Grup model" + +msgid "Templates" +msgstr "Templat" + +#, python-format +msgid "Template: %(name)s" +msgstr "Templat: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Templat: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Cari lokasi untuk templat \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(tidak ada)" + +msgid "Back to Documentation" +msgstr "Kembali ke Dokumentasi" + +msgid "Template filters" +msgstr "Filter templat" + +msgid "Template filter documentation" +msgstr "Dokumentasi filter templat" + +msgid "Built-in filters" +msgstr "Filter bawaan" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Untuk menggunakan filter ini, sertakan %(code)s pada templat " +"Anda sebelum menggunakan filternya." + +msgid "Template tags" +msgstr "Tag templat" + +msgid "Template tag documentation" +msgstr "Dokumentasi tag templat" + +msgid "Built-in tags" +msgstr "Tag bawaan" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Untuk menggunakan tag ini, sertakan %(code)s pada templat Anda " +"sebelum menggunakan tagnya." + +#, python-format +msgid "View: %(name)s" +msgstr "View: %(name)s" + +msgid "Context:" +msgstr "Konteks:" + +msgid "Templates:" +msgstr "Templat:" + +msgid "Back to View documentation" +msgstr "Kembali ke dokumentasi Tampilan" + +msgid "View documentation" +msgstr "Dokumentasi view" + +msgid "Jump to namespace" +msgstr "Loncat ke namespace" + +msgid "Empty namespace" +msgstr "Namespace kosong" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "View berdasarkan namespace %(name)s" + +msgid "Views by empty namespace" +msgstr "View berdasarkan namespace kosong" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Fungsi view: %(full_name)s. Nama: %(url_name)s.\n" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "view:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Aplikasi %(app_label)r tidak ditemukan" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r tidak ditemukan di aplikasi %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "objek `%(app_label)s.%(data_type)s` yang terkait" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "obyek `%(app_label)s.%(object_name)s` yang terkait" + +#, python-format +msgid "all %s" +msgstr "semua %s" + +#, python-format +msgid "number of %s" +msgstr "jumlah %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s bukan berupa objek urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2b4eb43 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..f404ac2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,258 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Muḥend Belqasem , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-10-06 12:00+0000\n" +"Last-Translator: Muḥend Belqasem \n" +"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" +"kab/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kab\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Agejdan" + +msgid "Documentation" +msgstr "Tasemlit" + +msgid "Bookmarklets" +msgstr "" + +msgid "Documentation bookmarklets" +msgstr "" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Tags" +msgstr "Tiṛekkizin" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Imzizdigen" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Timeẓriyin" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "Urtan" + +msgid "Field" +msgstr "Urti" + +msgid "Type" +msgstr "Tawsit" + +msgid "Description" +msgstr "Aglam" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "Tarrayt" + +msgid "Arguments" +msgstr "Tiɣira" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Tineɣrufin" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "(ula- it)" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "Asatal:" + +msgid "Templates:" +msgstr "Tineɣrufin:" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "Sken tasemlit" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tabzimt:" + +msgid "filter:" +msgstr "imzizdig:" + +msgid "view:" +msgstr "wali:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "Taneɣruft" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "" + +#, python-format +msgid "all %s" +msgstr "akk %s" + +#, python-format +msgid "number of %s" +msgstr "" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8440d72 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..f606425 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,259 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "គេហទំព័រ" + +msgid "Documentation" +msgstr "ឯកសារ" + +msgid "Bookmarklets" +msgstr "កំរងចំណាំ" + +msgid "Documentation bookmarklets" +msgstr "កំរងចំណាំអំពីឯកសារ" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "ឯកសារសំរាប់ទំព័រនេះ" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Jumps you from any page to the documentation for the view that generates " +"that page." + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ប្រភេទ:" + +msgid "filter:" +msgstr "ពាក្យស្វែងរក" + +msgid "view:" +msgstr "មើល" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "" + +#, python-format +msgid "all %s" +msgstr "ទាំងអស់ %s" + +#, python-format +msgid "number of %s" +msgstr "ចំនួន​នៃ​%s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s ហាក់បីដូចជា URL ដែល​ត្រឹមត្រូវទេ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1c112d5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po new file mode 100644 index 0000000..26d571b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/lb/LC_MESSAGES/django.po @@ -0,0 +1,275 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2015-01-18 08:34+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" +"language/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "Documentation" +msgstr "" + +msgid "Bookmarklets" +msgstr "" + +msgid "Documentation bookmarklets" +msgstr "" + +msgid "" +"\n" +"

    To install bookmarklets, drag the link to your bookmarks\n" +"toolbar, or right-click the link and add it to your bookmarks. Now you can\n" +"select the bookmarklet from any page in the site. Note that some of these\n" +"bookmarklets require you to be viewing the site from a computer designated\n" +"as \"internal\" (talk to your system administrator if you aren't sure if\n" +"your computer is \"internal\").

    \n" +msgstr "" + +msgid "Documentation for this page" +msgstr "" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Show object ID" +msgstr "" + +msgid "" +"Shows the content-type and unique ID for pages that represent a single " +"object." +msgstr "" + +msgid "Edit this object (current window)" +msgstr "" + +msgid "Jumps to the admin page for pages that represent a single object." +msgstr "" + +msgid "Edit this object (new window)" +msgstr "" + +msgid "As above, but opens the admin page in a new window." +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Back to Model Documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to Views Documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "Boolean (Either True or False)" +msgstr "" + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +msgid "tag:" +msgstr "" + +msgid "filter:" +msgstr "" + +msgid "view:" +msgstr "" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "" + +#, python-format +msgid "all %s" +msgstr "" + +#, python-format +msgid "number of %s" +msgstr "" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..128e463 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Vasil Vangelovski , 2016-2017 +# Vasil Vangelovski , 2013-2014 +# Vasil Vangelovski , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Vasil Vangelovski \n" +"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" +"mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgid "Administrative Documentation" +msgstr "Административна документација" + +msgid "Home" +msgstr "Дома" + +msgid "Documentation" +msgstr "Документација" + +msgid "Bookmarklets" +msgstr "Обележувачи" + +msgid "Documentation bookmarklets" +msgstr "Обележувачи на документација" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"За да инсталирате букмарклети повлечете го линкот во траката со bookmarks, " +"или кликенете со десното копче и додадете го во bookmarks. Така ќе можете да " +"го одберете букмарклетот од било која страна на сајтот." + +msgid "Documentation for this page" +msgstr "Документација за оваа страница" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Ве носи од било која страница од документацијата до погледот кој ја генерира " +"таа страница." + +msgid "Tags" +msgstr "Тагови" + +msgid "List of all the template tags and their functions." +msgstr "Листа на сите шаблонски тагови и нивните функции." + +msgid "Filters" +msgstr "Филтри" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Филтри се акции кои може да се применат на променливи во шаблон за менување " +"на излезниот резултат." + +msgid "Models" +msgstr "Модели" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Модели се описи на сите објекти во системот и нивните полиња. Секој модел " +"има листа на полиња до кои може да се пристапи со променливи во шаблони." + +msgid "Views" +msgstr "Погледи (вјуа)" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Секоја страна на јавниот сајт се генерира од поглед. Подгледот дефинира кој " +"шаблон се користи за да се генерира страната и кој објекти се достапни за " +"тој шаблон." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Алатки за вашиот веб прегледувач за брз пристап до администраторските " +"функционалности." + +msgid "Please install docutils" +msgstr "Ве молиме инсталирајте docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"На админ документацискиот систем му е потребна docutils Python библиотеката." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Ве молиме побарајте од вашите администратори да инсталираат docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Модел %(name)s" + +msgid "Fields" +msgstr "Полиња" + +msgid "Field" +msgstr "Поле" + +msgid "Type" +msgstr "Тип" + +msgid "Description" +msgstr "Опис" + +msgid "Methods with arguments" +msgstr "Методи со аргументи" + +msgid "Method" +msgstr "Метод" + +msgid "Arguments" +msgstr "Аргументи" + +msgid "Back to Model documentation" +msgstr "Назад до документација за модели." + +msgid "Model documentation" +msgstr "Документација за модели" + +msgid "Model groups" +msgstr "Групи на модели" + +msgid "Templates" +msgstr "Шаблони (темплејти)" + +#, python-format +msgid "Template: %(name)s" +msgstr "Шаблон: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Шаблон: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Пребарај ја патеката за шаблонот \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(не постои)" + +msgid "Back to Documentation" +msgstr "Назад во документација" + +msgid "Template filters" +msgstr "Шаблонски филтри" + +msgid "Template filter documentation" +msgstr "Документација за шаблонски филтер" + +msgid "Built-in filters" +msgstr "Вградени филтри" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"За да ги користите овие филтри, внесете %(code)s во вашиот " +"шаблон пред да го користите филтерот." + +msgid "Template tags" +msgstr "Шаблонски тагови" + +msgid "Template tag documentation" +msgstr "Документација за шаблонски таг" + +msgid "Built-in tags" +msgstr "Вградени тагови" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"За да ги користите овие тагови, внесете %(code)s во вашиот " +"шаблон пред да го користите тагот." + +#, python-format +msgid "View: %(name)s" +msgstr "Поглед: %(name)s" + +msgid "Context:" +msgstr "Контекст:" + +msgid "Templates:" +msgstr "Шаблони:" + +msgid "Back to View documentation" +msgstr "Назад до документација за погледи" + +msgid "View documentation" +msgstr "Документација за поглед" + +msgid "Jump to namespace" +msgstr "Скокни до именски простор" + +msgid "Empty namespace" +msgstr "Празен именски простор" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Погледи по именски простор %(name)s" + +msgid "Views by empty namespace" +msgstr "Погледи по празен именски простор" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Погледска функција (вју функција): %(full_name)s. Име: " +"%(url_name)s.\n" + +msgid "tag:" +msgstr "таг:" + +msgid "filter:" +msgstr "филтер:" + +msgid "view:" +msgstr "поглед:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Апликацијата %(app_label)r не е пронајдена" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Моделот %(model_name)r не е најден во апликацијата %(app_label)r" + +msgid "model:" +msgstr "модел:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "поврзаниот `%(app_label)s.%(data_type)s` објект" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "поврзани `%(app_label)s.%(object_name)s` објекти" + +#, python-format +msgid "all %s" +msgstr "сите %s" + +#, python-format +msgid "number of %s" +msgstr "број на %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s не изгледа дека е url објект" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po new file mode 100644 index 0000000..a73c318 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ml/LC_MESSAGES/django.po @@ -0,0 +1,268 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emil Joseph , 2019 +# Jannis Leidel , 2011 +# MUHAMMED RAMEEZ , 2019 +# Rag sagar , 2016 +# Rajeesh Nair , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2019-03-10 07:17+0000\n" +"Last-Translator: Emil Joseph \n" +"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" +"ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "കാര്യനിർവ്വാഹകർക്കായുള്ള ഡോക്യൂമെന്റേഷൻ " + +msgid "Home" +msgstr "ഹോം " + +msgid "Documentation" +msgstr "സഹായക്കുറിപ്പുകള്‍" + +msgid "Bookmarklets" +msgstr "ബുക്ക് മാര്‍ക്കുകള്‍" + +msgid "Documentation bookmarklets" +msgstr "സഹായക്കുറിപ്പുകളുടെ ബുക്ക്മാര്‍ക്കുകള്‍" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"ബുക്ക്മാർക്കുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ, നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ ടൂൾബാറിലേക്ക് ലിങ്ക് ഇഴയ്ക്കുക, " +"അല്ലെങ്കിൽ ലിങ്കിൽ വലത് ക്ലിക്കുചെയ്ത് നിങ്ങളുടെ ബുക്ക്മാർക്കുകളിൽ ചേർക്കുക. ഇപ്പോൾ നിങ്ങൾക്ക് " +"സൈറ്റിലെ ഏത് പേജിൽ നിന്നും ബുക്മാർക്കറ്റ് തിരഞ്ഞെടുക്കാം." + +msgid "Documentation for this page" +msgstr "ഈ പേജിന്റെ സഹായക്കുറിപ്പുകള്‍" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "ഏതു പേജില്‍ നിന്നും അതിന്റെ ഉദ്ഭവമായ വ്യൂവിന്റെ സഹായക്കുറിപ്പിലേക്കു ചാടാന്‍" + +msgid "Tags" +msgstr "ടാഗുകള്‍" + +msgid "List of all the template tags and their functions." +msgstr "എല്ലാ ടെംപ്ലേറ്റുകളും അവയുടെ ഫംഗ്ഷനുകളുടെ പട്ടിക" + +msgid "Filters" +msgstr "ഫില്‍ട്ടറുകള്‍" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"ഫിൽറ്ററുകൾ എന്നാൽ ഔട്പുട്ടിനു മാറ്റം വരുത്തുവാൻ ടെംപ്ലേറ്റുകൾക്കു ഉള്ളില്ലേ വാരിയബിലിസിന് " +"(variables) നൽകുന്ന ആക്ഷൻസ്സാണ് " + +msgid "Models" +msgstr "മോഡലുകള്‍" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "വ്യൂകള്‍" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"അഡ്മിൻ ഫങ്ക്ഷണാലിറ്റിയിലേക്കു പെട്ടെന്നു പ്രവേശിക്കുവാൻ നിങ്ങളുടെ ബ്രൗസെറിനുള്ള ടൂളുകൾ ." + +msgid "Please install docutils" +msgstr "ദയവായി ഡോക്യൂട്ടിൽസ്‌ ഇൻസ്റ്റാൾ ചെയ്യുക." + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "ഫീൽഡുകൾ " + +msgid "Field" +msgstr "ഫീൽഡ്." + +msgid "Type" +msgstr "ടൈപ്പ് " + +msgid "Description" +msgstr "വിവരണം" + +msgid "Methods with arguments" +msgstr "മെതോടുകൾ ഉള്ള ആർഗുമെന്റ്സ് " + +msgid "Method" +msgstr "രീതി" + +msgid "Arguments" +msgstr "വാദങ്ങൾ" + +msgid "Back to Model documentation" +msgstr "മോഡൽ ഡോക്യൂമെന്റന്റഷനിലേക്ക് തിരികെ പോവുക ." + +msgid "Model documentation" +msgstr "മോഡൽ ഡോക്യൂമെന്റേഷൻ." + +msgid "Model groups" +msgstr "മോഡൽ ഗ്രൂപ്സ്" + +msgid "Templates" +msgstr "ടെമ്പ്‌ലേറ്റുകള്‍" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "(എക്സിസ്റ് ചെയ്യുന്നില്ല )" + +msgid "Back to Documentation" +msgstr "ഡോക്യൂമെന്റഷനിലേക്കു തിരികെ പോവുക ." + +msgid "Template filters" +msgstr "ടെമ്പ്ലേറ്റ് ഫിൽറ്ററുകൾ " + +msgid "Template filter documentation" +msgstr "ടെമ്പ്ലേറ്റ് ഫിൽറ്റർ ഡോക്യൂമെന്റേഷൻ " + +msgid "Built-in filters" +msgstr "ബിൽട്ടിൻ ഫിൽറ്ററുകൾ " + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "ടെമ്പ്ലേറ്റ് റ്റാഗുകൾ " + +msgid "Template tag documentation" +msgstr "ടെമ്പ്ലേറ്റ് ടാഗിന്റെ ഡോക്യൂമെന്റേഷൻ " + +msgid "Built-in tags" +msgstr "ബിൽട്ടിൻ റ്റാഗുകൾ " + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "കോണ്ടെക്സ്റ് :" + +msgid "Templates:" +msgstr "ടെമ്പ്‌ലേറ്റുകള്‍" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "ഡോക്യൂമെന്റെഷൻ കാണുക " + +msgid "Jump to namespace" +msgstr "നെയിംസ്പേസിലേക്ക് ചാടുക ." + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ടാഗ്:" + +msgid "filter:" +msgstr "അരിപ്പ:" + +msgid "view:" +msgstr "വ്യൂ" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "%(app_label)r എന്ന Appല്‍ %(model_name)r എന്ന മാത്രുക കണ്ടില്ല." + +msgid "model:" +msgstr "മാത്രുക:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "ബന്ധപ്പെട്ട `%(app_label)s.%(data_type)s` വസ്തു" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "ബന്ധപ്പെട്ട `%(app_label)s.%(object_name)s` വസ്തുക്കള്‍" + +#, python-format +msgid "all %s" +msgstr "%s എല്ലാം" + +#, python-format +msgid "number of %s" +msgstr "%sന്റെ എണ്ണം" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s വിലാസ മാത്രുക (urlpattern object) ആണെന്ന് തോന്നുന്നില്ല." diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fa8a6a5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..450fa41 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,258 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Yhal Htet Aung , 2013,2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Burmese (http://www.transifex.com/django/django/language/" +"my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "ပင်မ" + +msgid "Documentation" +msgstr "အချက်အလက်" + +msgid "Bookmarklets" +msgstr "" + +msgid "Documentation bookmarklets" +msgstr "" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Tags" +msgstr "အမည်များ" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "စီစစ်မှုများ" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "မော်ဒယ်များ" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "ကြည့်ရှုခြင်းများ" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "ပံုစံပြားများ" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "အမည်:" + +msgid "filter:" +msgstr "စီစစ်မှု:" + +msgid "view:" +msgstr "ကြည့်ရှု:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "%(app_label)r အပ်ပရိုဂရမ်တွင် %(model_name)r မော်ဒယ်ရှာမတွေ့" + +msgid "model:" +msgstr "မော်ဒယ်:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "ဆက်နွယ်သော `%(app_label)s.%(data_type)s` အရာဝတ္ထု" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "ဆက်နွယ်သော `%(app_label)s.%(object_name)s` အရာဝတ္ထုများ" + +#, python-format +msgid "all %s" +msgstr "%s အားလံုး" + +#, python-format +msgid "number of %s" +msgstr "%s အရေအတွက်" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo new file mode 100644 index 0000000..05b0d90 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..305a11b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,257 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Paras Nath Chaudhary , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "गृह " + +msgid "Documentation" +msgstr "प्रलेखन" + +msgid "Bookmarklets" +msgstr "" + +msgid "Documentation bookmarklets" +msgstr "" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "यो पृस्ठको लागी प्रलेखन" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Tags" +msgstr "ट्यागहरु " + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "नमुनाहरु " + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "धृस्यहरु " + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ट्याग:" + +msgid "filter:" +msgstr "" + +msgid "view:" +msgstr "धृस्य :" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "%(model_name)r नमुना %(app_label)r appमा भेटिएन" + +msgid "model:" +msgstr "नमुना :" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "`%(app_label)s.%(data_type)s` संबंधित बस्तु " + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "`%(app_label)s.%(object_name)s` संबंधित बस्तु " + +#, python-format +msgid "all %s" +msgstr "सबै %s" + +#, python-format +msgid "number of %s" +msgstr "%sको संख्या" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f4d86cf Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..f0d904e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,261 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" +"language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Heim" + +msgid "Documentation" +msgstr "Dokumentasjon" + +msgid "Bookmarklets" +msgstr "Bokmerke" + +msgid "Documentation bookmarklets" +msgstr "Dokumentasjonsbokmerke" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Dokumentasjon for denne sida" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Hopp frå kva som helst side til dokumentasjonen for visingsfunksjonen som " +"genererte sida." + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "view:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" +"Kunne ikkje finne modellen %(model_name)r i applikasjonen %(app_label)r" + +msgid "model:" +msgstr "modell:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "det relaterte `%(app_label)s.%(data_type)s`-objektet" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "relaterte `%(app_label)s.%(object_name)s`-objekt" + +#, python-format +msgid "all %s" +msgstr "alle %s" + +#, python-format +msgid "number of %s" +msgstr "tal på %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s ser ikkje ut til å vere eit urlpattern-objekt" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8be0a2c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po new file mode 100644 index 0000000..775238c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pa/LC_MESSAGES/django.po @@ -0,0 +1,258 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" +"language/pa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pa\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "ਘਰ" + +msgid "Documentation" +msgstr "ਡੌਕੂਮੈਂਟੇਸ਼ਨ" + +msgid "Bookmarklets" +msgstr "ਬੁੱਕਮਾਰਕਲਿਟ" + +msgid "Documentation bookmarklets" +msgstr "ਡੌਕੂਮੈਟੇਸ਼ਨ ਬੁੱਕਮਾਰਕਲਿਟ" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "ਇਹ ਸਫ਼ੇ ਲਈ ਡੌਕੂਮੈਂਟੇਸ਼ਨ" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ਟੈਗ:" + +msgid "filter:" +msgstr "ਫਿਲਟਰ:" + +msgid "view:" +msgstr "ਵੇਖੋ:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "ਮਾਡਲ:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "ਸਬੰਧਿਤ `%(app_label)s.%(object_name)s` ਆਬਜੈਕਟ" + +#, python-format +msgid "all %s" +msgstr "ਸਭ %s" + +#, python-format +msgid "number of %s" +msgstr "%s ਦੀ ਗਿਣਤੀ" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..7c0ce19 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bruno Miguel Custódio , 2012 +# Jannis Leidel , 2011 +# Nuno Mariz , 2011-2013,2015,2017 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "Documentação Administrativa" + +msgid "Home" +msgstr "Início" + +msgid "Documentation" +msgstr "Documentação" + +msgid "Bookmarklets" +msgstr "Bookmarklets" + +msgid "Documentation bookmarklets" +msgstr "Documentação dos bookmarklets" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Para instalar bookmarklets, arraste o link da barra dos bookmarks, ou " +"pressione do lado direito no link e adicione aos bookmarks.\n" +"Agora poderá selecionar o bookmarklet de qualquer página do site." + +msgid "Documentation for this page" +msgstr "Documentação desta página" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Vai de qualquer página para a documentação da view que gera essa página." + +msgid "Tags" +msgstr "Tags" + +msgid "List of all the template tags and their functions." +msgstr "Lista de todas as template tags e suas funções." + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Os filtros são as acções que podem ser aplicadas às variáveis ​​de uma " +"template para alterar o output." + +msgid "Models" +msgstr "Models" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Models são descrições de todos os objetos no sistema e seus campos " +"associados. Cada model tem uma lista de campos que podem ser acedidos como " +"variáveis ​​de template" + +msgid "Views" +msgstr "Views" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Cada página no site público é gerada por uma view. A view define qual " +"template será usado para gerar a página e quais objetos estarão disponíveis " +"para esse template." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Ferramentas para o seu navegador para aceder rapidamente a funcionalidade de " +"administração." + +msgid "Please install docutils" +msgstr "Por favor, instale o docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"A documentação do sistema de admin requer a biblioteca docutils do Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Por favor, peça aos seu administradores para instalar o docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Campos" + +msgid "Field" +msgstr "Campo" + +msgid "Type" +msgstr "Tipo" + +msgid "Description" +msgstr "Descrição" + +msgid "Methods with arguments" +msgstr "Métodos com argumentos" + +msgid "Method" +msgstr "Métodos" + +msgid "Arguments" +msgstr "Argumentos" + +msgid "Back to Model documentation" +msgstr "Voltar para a documentação dos Models" + +msgid "Model documentation" +msgstr "Documentação dos Models" + +msgid "Model groups" +msgstr "Grupos de Models" + +msgid "Templates" +msgstr "Templates" + +#, python-format +msgid "Template: %(name)s" +msgstr "Template: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Template: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Caminho de pesquisa para o template \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(Não existe)" + +msgid "Back to Documentation" +msgstr "Voltar para a Documentação" + +msgid "Template filters" +msgstr "Filtros de template" + +msgid "Template filter documentation" +msgstr "Documentação de filtros de template" + +msgid "Built-in filters" +msgstr "Filtros built-in" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Para utilizar estes filtros, coloque %(code)s na sua template " +"antes de utilizar o filtro." + +msgid "Template tags" +msgstr "Tags de template" + +msgid "Template tag documentation" +msgstr "Documentação de tags de template" + +msgid "Built-in tags" +msgstr "Tags built-in" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Para utilizar estas tags, coloque %(code)s na sua template " +"antes de usar a tag." + +#, python-format +msgid "View: %(name)s" +msgstr "View: %(name)s" + +msgid "Context:" +msgstr "Contexto:" + +msgid "Templates:" +msgstr "Templates:" + +msgid "Back to View documentation" +msgstr "Voltar para a documentação das Views" + +msgid "View documentation" +msgstr "Ver documentação" + +msgid "Jump to namespace" +msgstr "Saltar para namespace" + +msgid "Empty namespace" +msgstr "Namespace vazio" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Views por namespace %(name)s" + +msgid "Views by empty namespace" +msgstr "Views por namespace vazio" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Função de view: %(full_name)s. Nome: %(url_name)s.\n" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "view:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "A aplicação %(app_label)r não foi encontrada" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "O Model %(model_name)r não foi encontrado na aplicação %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "o objeto `%(app_label)s.%(data_type)s` relacionado" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "os objetos `%(app_label)s.%(object_name)s` relacionados" + +#, python-format +msgid "all %s" +msgstr "todos %s" + +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s não parece ser um objeto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..3b45274 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,290 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# andrewsmedina , 2016 +# Carlos Leite , 2016 +# Filipe Cifali Stangler , 2016 +# Eduardo Cereto Carvalho, 2016 +# Elyézer Rezende , 2013 +# semente, 2012 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Administrative Documentation" +msgstr "Documentação Administrativa" + +msgid "Home" +msgstr "Início" + +msgid "Documentation" +msgstr "Documentação" + +msgid "Bookmarklets" +msgstr "Itens de bookmark" + +msgid "Documentation bookmarklets" +msgstr "Documentação de itens de bookmark" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Para instalar bookmarklets, arraste o link para a sua barra de favoritos, ou " +"clique com o botão direito no link e o adicione aos seus favoritos. Agora " +"você pode selecionar o bookmarklet a partir de qualquer página do site." + +msgid "Documentation for this page" +msgstr "Documentação para esta página" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Leva você de qualquer página para a documentação da view que gera tal página." + +msgid "Tags" +msgstr "Tags" + +msgid "List of all the template tags and their functions." +msgstr "Lista de todas as tags de template e suas funções." + +msgid "Filters" +msgstr "Filtros" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Os filtros são ações que podem ser aplicadas às variáveis ​​em um template " +"para alterar a saída." + +msgid "Models" +msgstr "Models" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Modelos são descrições de todos os objetos no sistema e seus campos " +"associados. Cada modelo tem uma lista de campos que podem ser acessados ​​como " +"variáveis ​​no template" + +msgid "Views" +msgstr "Views" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Cada página no site público é gerada por uma view. A view define qual " +"template será usado para gerar a página e quais objetos estarão disponíveis " +"para este template." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Ferramentas para o seu navegador para acessar rapidamente a funcionalidade " +"de administração." + +msgid "Please install docutils" +msgstr "Por favor, instale o docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"O sistema de documentação de administração exige a biblioteca docutils do Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Por favor, peça para os seus administradores para instalar o docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Campos" + +msgid "Field" +msgstr "Campo" + +msgid "Type" +msgstr "Tipo" + +msgid "Description" +msgstr "Descrição" + +msgid "Methods with arguments" +msgstr "Métodos com argumentos" + +msgid "Method" +msgstr "Método" + +msgid "Arguments" +msgstr "Argumentos" + +msgid "Back to Model documentation" +msgstr "Voltar para Documentação do Model" + +msgid "Model documentation" +msgstr "Documentação do model" + +msgid "Model groups" +msgstr "Grupos de models" + +msgid "Templates" +msgstr "Templates" + +#, python-format +msgid "Template: %(name)s" +msgstr "Template: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Template: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Caminho de busca para o template \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(não existe)" + +msgid "Back to Documentation" +msgstr "Voltar para Documentação" + +msgid "Template filters" +msgstr "Filtros do template" + +msgid "Template filter documentation" +msgstr "Documentação do filtro do template" + +msgid "Built-in filters" +msgstr "Filtros built-in" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Para usar esses filtros, coloque %(code)s no seu template antes " +"de usar o filtro." + +msgid "Template tags" +msgstr "Tags de template" + +msgid "Template tag documentation" +msgstr "Documentação da tag de template" + +msgid "Built-in tags" +msgstr "Tags built-in" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Para usar estas tags, coloque o código %(code)s no seu template " +"antes de usar a tag." + +#, python-format +msgid "View: %(name)s" +msgstr "View: %(name)s" + +msgid "Context:" +msgstr "Contexto:" + +msgid "Templates:" +msgstr "Templates:" + +msgid "Back to View documentation" +msgstr "Voltar para a Documentação das Views" + +msgid "View documentation" +msgstr "Ver documentação" + +msgid "Jump to namespace" +msgstr "Ir para namespace" + +msgid "Empty namespace" +msgstr "Namespace vazio" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Views por namespace %(name)s" + +msgid "Views by empty namespace" +msgstr "Views por namespace vazio" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +"View função: %(full_name)s. Nome: %(url_name)s.\n" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filtro:" + +msgid "view:" +msgstr "view:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "App %(app_label)r não encontrado" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r não encontrado na aplicação %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "o objeto `%(app_label)s.%(data_type)s` relacionado" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "objetos `%(app_label)s.%(object_name)s` relacionados" + +#, python-format +msgid "all %s" +msgstr "todos %s" + +#, python-format +msgid "number of %s" +msgstr "número de %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s não aparenta ser um objeto urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b338b84 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..1cb6abc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Primož Verdnik , 2017 +# zejn , 2013,2016 +# zejn , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Administrative Documentation" +msgstr "Dokumentacija o administraciji" + +msgid "Home" +msgstr "Domov" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Bookmarklets" +msgstr "Apleti zaznamkov" + +msgid "Documentation bookmarklets" +msgstr "Dokumentacijski apleti zaznamkov" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Aplete zaznamkov je mogoče namestiti z vleko povezave v orodno vrstico z " +"zaznamki, ali pa z desnim klikom na povezavo. Zaznamek je mogoče izbrati s " +"katerekoli strani tega spletnega mesta." + +msgid "Documentation for this page" +msgstr "Dokumentacija te strani" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "Skok na stran z dokumentacijo za pogled, ki gustvarja trenutno stran." + +msgid "Tags" +msgstr "Oznake" + +msgid "List of all the template tags and their functions." +msgstr "Izpiši vse značke za predloge in njihov opis." + +msgid "Filters" +msgstr "Filtri" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Filtri so opravila, ki jih lahko uporabite na spremenljivkah v predlogah, da " +"spremenite izpis." + +msgid "Models" +msgstr "Modeli" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Modeli so opisi vseh objektov v sistemu in njihovih pripadajočih polj. Vsak " +"model ima seznam polj, do katerih lahko dostopate v predlogi" + +msgid "Views" +msgstr "Pogledi" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Vsaka stran na javni strani je zgenerirana iz pogleda. Pogled definira " +"katera predloga je uporabljena za generiranje strani in kateri objekti so " +"dostopni ti predlogi." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Orodja za vaš brskalnik, da lahko hitro dostopate do administracijskih " +"funkcij." + +msgid "Please install docutils" +msgstr "Prosimo namestite paket docutils" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Dokumentcijski sistem administracijskega vmesnika zahteva knjižnico docutils za Python." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Prosimo povprašajte administratorja, da namesti docutils." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Polja" + +msgid "Field" +msgstr "Polje" + +msgid "Type" +msgstr "Tip" + +msgid "Description" +msgstr "Opis" + +msgid "Methods with arguments" +msgstr "Metode z argumenti" + +msgid "Method" +msgstr "Metoda" + +msgid "Arguments" +msgstr "Argumenti" + +msgid "Back to Model documentation" +msgstr "Nazaj na dokumentacijo modelov" + +msgid "Model documentation" +msgstr "Dokumentacija modelov" + +msgid "Model groups" +msgstr "Skupine modelov" + +msgid "Templates" +msgstr "Predloge" + +#, python-format +msgid "Template: %(name)s" +msgstr "Predloga: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Predloga: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "Poti iskanja za predlogo \"%(name)s\":" + +msgid "(does not exist)" +msgstr "(ne obstaja)" + +msgid "Back to Documentation" +msgstr "Nazaj na dokumentacijo" + +msgid "Template filters" +msgstr "Filtri v predlogah" + +msgid "Template filter documentation" +msgstr "Dokumentacija filtrov v predlogah" + +msgid "Built-in filters" +msgstr "Vgrajeni filtri" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Če želite uporabiti te filtre, dodajte %(code)s v vašo predlogo " +"preden uporabite filter." + +msgid "Template tags" +msgstr "Značke v predlogah" + +msgid "Template tag documentation" +msgstr "Dokumentacija značk v predlogah" + +msgid "Built-in tags" +msgstr "Vgrajene značke" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Če želite uporabiti te značke, dodajte %(code)s v vašo predlogo " +"preden uporabite značko." + +#, python-format +msgid "View: %(name)s" +msgstr "Pogled: %(name)s" + +msgid "Context:" +msgstr "Kontekst:" + +msgid "Templates:" +msgstr "Predloge:" + +msgid "Back to View documentation" +msgstr "Nazaj na dokumentacijo pogledov" + +msgid "View documentation" +msgstr "Dokumentacija pogledov" + +msgid "Jump to namespace" +msgstr "Skoči na imenski prostor" + +msgid "Empty namespace" +msgstr "Prazen imenski prostor" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "Pogledi v imenskem prostoru %(name)s" + +msgid "Views by empty namespace" +msgstr "Pogledi brez imenskega prostora" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Funkcija pogleda: %(full_name)s. Ime: %(url_name)s.\n" + +msgid "tag:" +msgstr "oznaka:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "pogled:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "Applikacije %(app_label)r ni bilo mogoče najti" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Modela %(model_name)r ni v programu %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "povezani predmet `%(app_label)s.%(data_type)s`" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "povezani predmeti `%(app_label)s.%(object_name)s`" + +#, python-format +msgid "all %s" +msgstr "vse %s" + +#, python-format +msgid "number of %s" +msgstr "število %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "Predmet %s ni videti veljaven predmet urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..04a4758 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,262 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Janos Guljas , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" +"language/sr%40latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Početna" + +msgid "Documentation" +msgstr "Dokumentacija" + +msgid "Bookmarklets" +msgstr "Bukmarkleti" + +msgid "Documentation bookmarklets" +msgstr "Bukmarkleti dokumentacije" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Dokumentacija za ovu stranicu" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Vodi od bilo koje stranice do dokumentaicje pogleda koji je generisao tu " +"stranicu." + +msgid "Tags" +msgstr "Tagovi" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Filteri" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Modeli" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Vjuevi" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Šabloni" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tag:" + +msgid "filter:" +msgstr "filter:" + +msgid "view:" +msgstr "vju:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Model %(model_name)r nije pronađen u aplikaciji %(app_label)r" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "povezani objekti klase `%(app_label)s.%(data_type)s`" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "klase `%(app_label)s.%(object_name)s`" + +#, python-format +msgid "all %s" +msgstr "svi povezani objekti %s" + +#, python-format +msgid "number of %s" +msgstr "broj povezanih objekata %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s ne izgleda kao „urlpattern“ objekat" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..3a9e2fd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,259 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "Sebule" + +msgid "Documentation" +msgstr "Waraka" + +msgid "Bookmarklets" +msgstr "Vialamisho" + +msgid "Documentation bookmarklets" +msgstr "Vialamisho vya waraka" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "Nyaraka kwa ajili ya ukurasa huu" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Inakurusha kutoka ukurasa wowote hadi kwenye waraka wa mounekano unaozalisha " +"ukurasa huo." + +msgid "Tags" +msgstr "Tagi" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "Chujio" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "Modeli" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "Mionekano" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "Templeti" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "tagi" + +msgid "filter:" +msgstr "chujio" + +msgid "view:" +msgstr "muonekano" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "Modeli %(model_name)r haijapatikana katika programu %(app_label)r" + +msgid "model:" +msgstr "modeli" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "`%(app_label)s.%(data_type)s` kinachohusiana" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "`%(app_label)s.%(object_name)s` vinavyohusiana" + +#, python-format +msgid "all %s" +msgstr "kila %s" + +#, python-format +msgid "number of %s" +msgstr "idadi ya %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s haionekani kuwa ni kitu cha urlpattern" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..c0ca3d9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,258 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "வீடு" + +msgid "Documentation" +msgstr "ஆவனமாக்கம்" + +msgid "Bookmarklets" +msgstr "புத்தகக்குறிகள்" + +msgid "Documentation bookmarklets" +msgstr "ஆவணமாக்கக் குறியீடுகள்" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "இந்த பக்கத்திற்கான ஆவணம்" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"எந்த ஒரு பக்கத்திலிருந்தும் ஆவணப்பக்கத்தை பார்வையிடுதல், அந்த பக்கத்தை உருவாக்குகிறது." + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ஒட்டு:" + +msgid "filter:" +msgstr "வடிகட்டி:" + +msgid "view:" +msgstr "நோற்றமிடு:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "மாதிரி:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "" + +#, python-format +msgid "all %s" +msgstr "அனைத்து %s " + +#, python-format +msgid "number of %s" +msgstr "எண்ணிக்கை %s" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s -ல் urlpattern தோன்றுவதில்லை" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/te/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..b03f0b3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,258 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# bhaskar teja yerneni , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "నివాసము" + +msgid "Documentation" +msgstr "పత్రికీకరణ" + +msgid "Bookmarklets" +msgstr "నిర్దుష్ట గుర్తులు " + +msgid "Documentation bookmarklets" +msgstr "పత్రికీకరణ యొక్క నిర్దుష్ట గుర్తులు " + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "ఈ పొరటుకు పత్రికీకరణ" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "టాగ్:" + +msgid "filter:" +msgstr "వడపోత:" + +msgid "view:" +msgstr "దర్శనం:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "" + +msgid "model:" +msgstr "మొడల్:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "సంబంధించిన `%(app_label)s.%(data_type)s` అంశము" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "సంబంధించిన `%(app_label)s.%(object_name)s` వస్తువులు" + +#, python-format +msgid "all %s" +msgstr "ఆన్నీ %s" + +#, python-format +msgid "number of %s" +msgstr "%s సంఖ్య" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s యు ఆర్ యల్ నిర్మాణక్రమ అంశము లా లేదు " diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..b939921 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,287 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ahmet Emre Aladağ , 2013 +# BouRock, 2015-2016 +# BouRock, 2014 +# Jannis Leidel , 2011 +# Murat Çorlu , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Administrative Documentation" +msgstr "Yönetimsel Belgeler" + +msgid "Home" +msgstr "Giriş" + +msgid "Documentation" +msgstr "Belgeler" + +msgid "Bookmarklets" +msgstr "Bookmarklet'ler" + +msgid "Documentation bookmarklets" +msgstr "Belge bookmarklet'leri" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" +"Bookmarklet'leri yüklemek için, bağlantıyı yer imleri araç çubuğuna " +"sürükleyin ya da bağlantıya sağ tıklayın ve yer imlerinize ekleyin. Artık " +"sitedeki herhangi bir sayfadan bookmarklet seçebilirsiniz." + +msgid "Documentation for this page" +msgstr "Bu sayfa için belgeler" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"Sizi, bu sayfayı oluşturan görünüm için herhangi bir sayfadan belgelere " +"atlatır." + +msgid "Tags" +msgstr "Etiketler" + +msgid "List of all the template tags and their functions." +msgstr "Tüm şablon etiketlerinin ve işlevlerinin listesi." + +msgid "Filters" +msgstr "Süzgeçler" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" +"Süzgeçler, çıktıyı değiştirmek için bir şablondaki değişkenlere " +"uygulanabilen eylemlerdir." + +msgid "Models" +msgstr "Modeller" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" +"Modeller, sistemdeki nesnelerin ve ilişkilendirilmiş alanlarının tümünün " +"tanımlarıdır. Her model, şablon değişkenleri olarak erişilebilen alanların " +"bir listesine sahiptir." + +msgid "Views" +msgstr "Görünümler" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" +"Ortak sitedeki her sayfa, bir görünüm tarafından oluşturulur. Görünüm, " +"sayfayı oluşturmak için hangi şablonun kullanılacağını ve bu şablon için " +"hangi nesnelerin kullanılabilir olacağını tanımlar." + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" +"Tarayıcınızın yönetici işlevselliğine hızlıca erişebilmesi için araçlar" + +msgid "Please install docutils" +msgstr "Lütfen docutils'i yükleyin" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" +"Yönetici belge sistemi, Python'un docutils " +"kütüphanesini gerektirir." + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" +"Lütfen yöneticilerinizden docutils yüklemesini " +"isteyin." + +#, python-format +msgid "Model: %(name)s" +msgstr "Model: %(name)s" + +msgid "Fields" +msgstr "Alanlar" + +msgid "Field" +msgstr "Alan" + +msgid "Type" +msgstr "Tür" + +msgid "Description" +msgstr "Açıklama" + +msgid "Methods with arguments" +msgstr "Bağımsız değişkenleri olan yöntemler" + +msgid "Method" +msgstr "Yöntem" + +msgid "Arguments" +msgstr "Bağımsız değişkenler" + +msgid "Back to Model documentation" +msgstr "Model belgelerine geri dön" + +msgid "Model documentation" +msgstr "Model belgeleri" + +msgid "Model groups" +msgstr "Model grupları" + +msgid "Templates" +msgstr "Şablonlar" + +#, python-format +msgid "Template: %(name)s" +msgstr "Şablon: %(name)s" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "Şablon: \"%(name)s\"" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "\"%(name)s\" şablonu için arama yolu:" + +msgid "(does not exist)" +msgstr "(mevcut değil)" + +msgid "Back to Documentation" +msgstr "Belgelere Geri Dön" + +msgid "Template filters" +msgstr "Şablon süzgeçleri" + +msgid "Template filter documentation" +msgstr "Şablon süzgeci belgeleri" + +msgid "Built-in filters" +msgstr "Yerleşik süzgeçler" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" +"Bu süzgeçleri kullanmak için, süzgeci kullanmadan önce şablonunuzun içine " +"%(code)s yerleştirin." + +msgid "Template tags" +msgstr "Şablon etiketleri" + +msgid "Template tag documentation" +msgstr "Şablon etiketi belgeleri" + +msgid "Built-in tags" +msgstr "Yerleşik etiketler" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" +"Bu etiketleri kullanmak için, etiketi kullanmadan önce şablonunuzun içine " +"%(code)s yerleştirin." + +#, python-format +msgid "View: %(name)s" +msgstr "Görünüm: %(name)s" + +msgid "Context:" +msgstr "Bağlam:" + +msgid "Templates:" +msgstr "Şablonlar:" + +msgid "Back to View documentation" +msgstr "Görünüm belgelerine geri dön" + +msgid "View documentation" +msgstr "Belgeleri görüntüle" + +msgid "Jump to namespace" +msgstr "İsim alanına atla" + +msgid "Empty namespace" +msgstr "Boş isim alanı" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "%(name)s isim alanına göre görünümler" + +msgid "Views by empty namespace" +msgstr "Boş isim alanına göre görünümler" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" +"\n" +" Görünüm işlevi: %(full_name)s. Adı: %(url_name)s.\n" + +msgid "tag:" +msgstr "etiket:" + +msgid "filter:" +msgstr "süzgeç:" + +msgid "view:" +msgstr "görünüm:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "%(app_label)r uygulaması bulunamadı" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "%(app_label)r uygulamasında %(model_name)r modeli bulunamadı" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "İlgili `%(app_label)s.%(data_type)s` nesnesi" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "ilgili `%(app_label)s.%(object_name)s` nesneleri" + +#, python-format +msgid "all %s" +msgstr "tüm %s" + +#, python-format +msgid "number of %s" +msgstr "%s sayısı" + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s, bir urlpattern nesnesi olarak görünmüyor" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..83b6d94 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/tt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d945bd1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..c15800a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,259 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mansoorulhaq Mansoor , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Administrative Documentation" +msgstr "" + +msgid "Home" +msgstr "صفحۂ اول" + +msgid "Documentation" +msgstr "طریق استعمال" + +msgid "Bookmarklets" +msgstr "بک مارک لیٹس" + +msgid "Documentation bookmarklets" +msgstr "طریق استعمال کے بک مارک لیٹس" + +msgid "" +"To install bookmarklets, drag the link to your bookmarks toolbar, or right-" +"click the link and add it to your bookmarks. Now you can select the " +"bookmarklet from any page in the site." +msgstr "" + +msgid "Documentation for this page" +msgstr "اس صفحے کا طریق استعمال" + +msgid "" +"Jumps you from any page to the documentation for the view that generates " +"that page." +msgstr "" +"آپ کو لے جاتا ہے کسی بھی صفحے سے طریق استعمال کی طرف اس ویو کے لئے جو اس " +"صفحے کو بناتا ہے۔" + +msgid "Tags" +msgstr "" + +msgid "List of all the template tags and their functions." +msgstr "" + +msgid "Filters" +msgstr "" + +msgid "" +"Filters are actions which can be applied to variables in a template to alter " +"the output." +msgstr "" + +msgid "Models" +msgstr "" + +msgid "" +"Models are descriptions of all the objects in the system and their " +"associated fields. Each model has a list of fields which can be accessed as " +"template variables" +msgstr "" + +msgid "Views" +msgstr "" + +msgid "" +"Each page on the public site is generated by a view. The view defines which " +"template is used to generate the page and which objects are available to " +"that template." +msgstr "" + +msgid "Tools for your browser to quickly access admin functionality." +msgstr "" + +msgid "Please install docutils" +msgstr "" + +#, python-format +msgid "" +"The admin documentation system requires Python's docutils library." +msgstr "" + +#, python-format +msgid "" +"Please ask your administrators to install docutils." +msgstr "" + +#, python-format +msgid "Model: %(name)s" +msgstr "" + +msgid "Fields" +msgstr "" + +msgid "Field" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Methods with arguments" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Arguments" +msgstr "" + +msgid "Back to Model documentation" +msgstr "" + +msgid "Model documentation" +msgstr "" + +msgid "Model groups" +msgstr "" + +msgid "Templates" +msgstr "" + +#, python-format +msgid "Template: %(name)s" +msgstr "" + +#, python-format +msgid "Template: \"%(name)s\"" +msgstr "" + +#. Translators: Search is not a verb here, it qualifies path (a search path) +#, python-format +msgid "Search path for template \"%(name)s\":" +msgstr "" + +msgid "(does not exist)" +msgstr "" + +msgid "Back to Documentation" +msgstr "" + +msgid "Template filters" +msgstr "" + +msgid "Template filter documentation" +msgstr "" + +msgid "Built-in filters" +msgstr "" + +#, python-format +msgid "" +"To use these filters, put %(code)s in your template before " +"using the filter." +msgstr "" + +msgid "Template tags" +msgstr "" + +msgid "Template tag documentation" +msgstr "" + +msgid "Built-in tags" +msgstr "" + +#, python-format +msgid "" +"To use these tags, put %(code)s in your template before using " +"the tag." +msgstr "" + +#, python-format +msgid "View: %(name)s" +msgstr "" + +msgid "Context:" +msgstr "" + +msgid "Templates:" +msgstr "" + +msgid "Back to View documentation" +msgstr "" + +msgid "View documentation" +msgstr "" + +msgid "Jump to namespace" +msgstr "" + +msgid "Empty namespace" +msgstr "" + +#, python-format +msgid "Views by namespace %(name)s" +msgstr "" + +msgid "Views by empty namespace" +msgstr "" + +#, python-format +msgid "" +"\n" +" View function: %(full_name)s. Name: %(url_name)s.\n" +msgstr "" + +msgid "tag:" +msgstr "ٹیگ :" + +msgid "filter:" +msgstr "فلٹر:" + +msgid "view:" +msgstr "ویو:" + +#, python-format +msgid "App %(app_label)r not found" +msgstr "" + +#, python-format +msgid "Model %(model_name)r not found in app %(app_label)r" +msgstr "ماڈل %(model_name)r ایپ %(app_label)r میں نہیں ملا" + +msgid "model:" +msgstr "model:" + +#, python-format +msgid "the related `%(app_label)s.%(data_type)s` object" +msgstr "متعلقہ `%(app_label)s.%(data_type)s`اوبجیکٹ" + +#, python-format +msgid "related `%(app_label)s.%(object_name)s` objects" +msgstr "متعلقہ `%(app_label)s.%(object_name)s` اوبجیکٹس" + +#, python-format +msgid "all %s" +msgstr "تمام %s" + +#, python-format +msgid "number of %s" +msgstr "%sکی تعداد " + +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s بطور urlpattern ظاہر نہیں ہو رہا۔" diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/templates/admin_doc/index.html b/venv/lib/python3.7/site-packages/django/contrib/admindocs/templates/admin_doc/index.html new file mode 100644 index 0000000..aa86a4b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/templates/admin_doc/index.html @@ -0,0 +1,34 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} +{% block title %}{% trans 'Documentation' %}{% endblock %} + +{% block content %} + +

    {% trans 'Documentation' %}

    + +
    +

    {% trans 'Tags' %}

    +

    {% trans 'List of all the template tags and their functions.' %}

    + +

    {% trans 'Filters' %}

    +

    {% trans 'Filters are actions which can be applied to variables in a template to alter the output.' %}

    + +

    {% trans 'Models' %}

    +

    {% trans 'Models are descriptions of all the objects in the system and their associated fields. Each model has a list of fields which can be accessed as template variables' %}.

    + +

    {% trans 'Views' %}

    +

    {% trans 'Each page on the public site is generated by a view. The view defines which template is used to generate the page and which objects are available to that template.' %}

    + +

    {% trans 'Bookmarklets' %}

    +

    {% trans 'Tools for your browser to quickly access admin functionality.' %}

    +
    + +{% endblock %} + diff --git a/venv/lib/python3.7/site-packages/django/contrib/admindocs/urls.py b/venv/lib/python3.7/site-packages/django/contrib/admindocs/urls.py new file mode 100644 index 0000000..bc9c3df --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/admindocs/urls.py @@ -0,0 +1,50 @@ +from django.contrib.admindocs import views +from django.urls import path, re_path + +urlpatterns = [ + path( + '', + views.BaseAdminDocsView.as_view(template_name='admin_doc/index.html'), + name='django-admindocs-docroot', + ), + path( + 'bookmarklets/', + views.BookmarkletsView.as_view(), + name='django-admindocs-bookmarklets', + ), + path( + 'tags/', + views.TemplateTagIndexView.as_view(), + name='django-admindocs-tags', + ), + path( + 'filters/', + views.TemplateFilterIndexView.as_view(), + name='django-admindocs-filters', + ), + path( + 'views/', + views.ViewIndexView.as_view(), + name='django-admindocs-views-index', + ), + path( + 'views//', + views.ViewDetailView.as_view(), + name='django-admindocs-views-detail', + ), + path( + 'models/', + views.ModelIndexView.as_view(), + name='django-admindocs-models-index', + ), + re_path( + r'^models/(?P[^\.]+)\.(?P[^/]+)/$', + views.ModelDetailView.as_view(), + name='django-admindocs-models-detail', + ), + path( + 'templates//', + views.TemplateDetailView.as_view(), + name='django-admindocs-templates', + ), +] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/auth/__init__.py new file mode 100644 index 0000000..6aa900f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/__init__.py @@ -0,0 +1,225 @@ +import inspect +import re + +from django.apps import apps as django_apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from django.middleware.csrf import rotate_token +from django.utils.crypto import constant_time_compare +from django.utils.module_loading import import_string +from django.utils.translation import LANGUAGE_SESSION_KEY + +from .signals import user_logged_in, user_logged_out, user_login_failed + +SESSION_KEY = '_auth_user_id' +BACKEND_SESSION_KEY = '_auth_user_backend' +HASH_SESSION_KEY = '_auth_user_hash' +REDIRECT_FIELD_NAME = 'next' + + +def load_backend(path): + return import_string(path)() + + +def _get_backends(return_tuples=False): + backends = [] + for backend_path in settings.AUTHENTICATION_BACKENDS: + backend = load_backend(backend_path) + backends.append((backend, backend_path) if return_tuples else backend) + if not backends: + raise ImproperlyConfigured( + 'No authentication backends have been defined. Does ' + 'AUTHENTICATION_BACKENDS contain anything?' + ) + return backends + + +def get_backends(): + return _get_backends(return_tuples=False) + + +def _clean_credentials(credentials): + """ + Clean a dictionary of credentials of potentially sensitive info before + sending to less secure functions. + + Not comprehensive - intended for user_login_failed signal + """ + SENSITIVE_CREDENTIALS = re.compile('api|token|key|secret|password|signature', re.I) + CLEANSED_SUBSTITUTE = '********************' + for key in credentials: + if SENSITIVE_CREDENTIALS.search(key): + credentials[key] = CLEANSED_SUBSTITUTE + return credentials + + +def _get_user_session_key(request): + # This value in the session is always serialized to a string, so we need + # to convert it back to Python whenever we access it. + return get_user_model()._meta.pk.to_python(request.session[SESSION_KEY]) + + +def authenticate(request=None, **credentials): + """ + If the given credentials are valid, return a User object. + """ + for backend, backend_path in _get_backends(return_tuples=True): + try: + inspect.getcallargs(backend.authenticate, request, **credentials) + except TypeError: + # This backend doesn't accept these credentials as arguments. Try the next one. + continue + try: + user = backend.authenticate(request, **credentials) + except PermissionDenied: + # This backend says to stop in our tracks - this user should not be allowed in at all. + break + if user is None: + continue + # Annotate the user object with the path of the backend. + user.backend = backend_path + return user + + # The credentials supplied are invalid to all backends, fire signal + user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request) + + +def login(request, user, backend=None): + """ + Persist a user id and a backend in the request. This way a user doesn't + have to reauthenticate on every request. Note that data set during + the anonymous session is retained when the user logs in. + """ + session_auth_hash = '' + if user is None: + user = request.user + if hasattr(user, 'get_session_auth_hash'): + session_auth_hash = user.get_session_auth_hash() + + if SESSION_KEY in request.session: + if _get_user_session_key(request) != user.pk or ( + session_auth_hash and + not constant_time_compare(request.session.get(HASH_SESSION_KEY, ''), session_auth_hash)): + # To avoid reusing another user's session, create a new, empty + # session if the existing session corresponds to a different + # authenticated user. + request.session.flush() + else: + request.session.cycle_key() + + try: + backend = backend or user.backend + except AttributeError: + backends = _get_backends(return_tuples=True) + if len(backends) == 1: + _, backend = backends[0] + else: + raise ValueError( + 'You have multiple authentication backends configured and ' + 'therefore must provide the `backend` argument or set the ' + '`backend` attribute on the user.' + ) + else: + if not isinstance(backend, str): + raise TypeError('backend must be a dotted import path string (got %r).' % backend) + + request.session[SESSION_KEY] = user._meta.pk.value_to_string(user) + request.session[BACKEND_SESSION_KEY] = backend + request.session[HASH_SESSION_KEY] = session_auth_hash + if hasattr(request, 'user'): + request.user = user + rotate_token(request) + user_logged_in.send(sender=user.__class__, request=request, user=user) + + +def logout(request): + """ + Remove the authenticated user's ID from the request and flush their session + data. + """ + # Dispatch the signal before the user is logged out so the receivers have a + # chance to find out *who* logged out. + user = getattr(request, 'user', None) + if not getattr(user, 'is_authenticated', True): + user = None + user_logged_out.send(sender=user.__class__, request=request, user=user) + + # remember language choice saved to session + language = request.session.get(LANGUAGE_SESSION_KEY) + + request.session.flush() + + if language is not None: + request.session[LANGUAGE_SESSION_KEY] = language + + if hasattr(request, 'user'): + from django.contrib.auth.models import AnonymousUser + request.user = AnonymousUser() + + +def get_user_model(): + """ + Return the User model that is active in this project. + """ + try: + return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False) + except ValueError: + raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'") + except LookupError: + raise ImproperlyConfigured( + "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL + ) + + +def get_user(request): + """ + Return the user model instance associated with the given request session. + If no user is retrieved, return an instance of `AnonymousUser`. + """ + from .models import AnonymousUser + user = None + try: + user_id = _get_user_session_key(request) + backend_path = request.session[BACKEND_SESSION_KEY] + except KeyError: + pass + else: + if backend_path in settings.AUTHENTICATION_BACKENDS: + backend = load_backend(backend_path) + user = backend.get_user(user_id) + # Verify the session + if hasattr(user, 'get_session_auth_hash'): + session_hash = request.session.get(HASH_SESSION_KEY) + session_hash_verified = session_hash and constant_time_compare( + session_hash, + user.get_session_auth_hash() + ) + if not session_hash_verified: + request.session.flush() + user = None + + return user or AnonymousUser() + + +def get_permission_codename(action, opts): + """ + Return the codename of the permission for the specified action. + """ + return '%s_%s' % (action, opts.model_name) + + +def update_session_auth_hash(request, user): + """ + Updating a user's password logs out all sessions for the user. + + Take the current request and the updated user object from which the new + session hash will be derived and update the session hash appropriately to + prevent a password change from logging out the session from which the + password was changed. + """ + request.session.cycle_key() + if hasattr(user, 'get_session_auth_hash') and request.user == user: + request.session[HASH_SESSION_KEY] = user.get_session_auth_hash() + + +default_app_config = 'django.contrib.auth.apps.AuthConfig' diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/checks.py b/venv/lib/python3.7/site-packages/django/contrib/auth/checks.py new file mode 100644 index 0000000..ec133e8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/checks.py @@ -0,0 +1,166 @@ +from itertools import chain +from types import MethodType + +from django.apps import apps +from django.conf import settings +from django.core import checks + +from .management import _get_builtin_permissions + + +def check_user_model(app_configs=None, **kwargs): + if app_configs is None: + cls = apps.get_model(settings.AUTH_USER_MODEL) + else: + app_label, model_name = settings.AUTH_USER_MODEL.split('.') + for app_config in app_configs: + if app_config.label == app_label: + cls = app_config.get_model(model_name) + break + else: + # Checks might be run against a set of app configs that don't + # include the specified user model. In this case we simply don't + # perform the checks defined below. + return [] + + errors = [] + + # Check that REQUIRED_FIELDS is a list + if not isinstance(cls.REQUIRED_FIELDS, (list, tuple)): + errors.append( + checks.Error( + "'REQUIRED_FIELDS' must be a list or tuple.", + obj=cls, + id='auth.E001', + ) + ) + + # Check that the USERNAME FIELD isn't included in REQUIRED_FIELDS. + if cls.USERNAME_FIELD in cls.REQUIRED_FIELDS: + errors.append( + checks.Error( + "The field named as the 'USERNAME_FIELD' " + "for a custom user model must not be included in 'REQUIRED_FIELDS'.", + obj=cls, + id='auth.E002', + ) + ) + + # Check that the username field is unique + if not cls._meta.get_field(cls.USERNAME_FIELD).unique: + if (settings.AUTHENTICATION_BACKENDS == + ['django.contrib.auth.backends.ModelBackend']): + errors.append( + checks.Error( + "'%s.%s' must be unique because it is named as the 'USERNAME_FIELD'." % ( + cls._meta.object_name, cls.USERNAME_FIELD + ), + obj=cls, + id='auth.E003', + ) + ) + else: + errors.append( + checks.Warning( + "'%s.%s' is named as the 'USERNAME_FIELD', but it is not unique." % ( + cls._meta.object_name, cls.USERNAME_FIELD + ), + hint='Ensure that your authentication backend(s) can handle non-unique usernames.', + obj=cls, + id='auth.W004', + ) + ) + + if isinstance(cls().is_anonymous, MethodType): + errors.append( + checks.Critical( + '%s.is_anonymous must be an attribute or property rather than ' + 'a method. Ignoring this is a security issue as anonymous ' + 'users will be treated as authenticated!' % cls, + obj=cls, + id='auth.C009', + ) + ) + if isinstance(cls().is_authenticated, MethodType): + errors.append( + checks.Critical( + '%s.is_authenticated must be an attribute or property rather ' + 'than a method. Ignoring this is a security issue as anonymous ' + 'users will be treated as authenticated!' % cls, + obj=cls, + id='auth.C010', + ) + ) + return errors + + +def check_models_permissions(app_configs=None, **kwargs): + if app_configs is None: + models = apps.get_models() + else: + models = chain.from_iterable(app_config.get_models() for app_config in app_configs) + + Permission = apps.get_model('auth', 'Permission') + permission_name_max_length = Permission._meta.get_field('name').max_length + errors = [] + + for model in models: + opts = model._meta + builtin_permissions = dict(_get_builtin_permissions(opts)) + # Check builtin permission name length. + max_builtin_permission_name_length = ( + max(len(name) for name in builtin_permissions.values()) + if builtin_permissions else 0 + ) + if max_builtin_permission_name_length > permission_name_max_length: + verbose_name_max_length = ( + permission_name_max_length - (max_builtin_permission_name_length - len(opts.verbose_name_raw)) + ) + errors.append( + checks.Error( + "The verbose_name of model '%s.%s' must be at most %d characters " + "for its builtin permission names to be at most %d characters." % ( + opts.app_label, opts.object_name, verbose_name_max_length, permission_name_max_length + ), + obj=model, + id='auth.E007', + ) + ) + codenames = set() + for codename, name in opts.permissions: + # Check custom permission name length. + if len(name) > permission_name_max_length: + errors.append( + checks.Error( + "The permission named '%s' of model '%s.%s' is longer than %d characters." % ( + name, opts.app_label, opts.object_name, permission_name_max_length + ), + obj=model, + id='auth.E008', + ) + ) + # Check custom permissions codename clashing. + if codename in builtin_permissions: + errors.append( + checks.Error( + "The permission codenamed '%s' clashes with a builtin permission " + "for model '%s.%s'." % ( + codename, opts.app_label, opts.object_name + ), + obj=model, + id='auth.E005', + ) + ) + elif codename in codenames: + errors.append( + checks.Error( + "The permission codenamed '%s' is duplicated for model '%s.%s'." % ( + codename, opts.app_label, opts.object_name + ), + obj=model, + id='auth.E006', + ) + ) + codenames.add(codename) + + return errors diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/common-passwords.txt.gz b/venv/lib/python3.7/site-packages/django/contrib/auth/common-passwords.txt.gz new file mode 100644 index 0000000..e758dbe Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/common-passwords.txt.gz differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/decorators.py b/venv/lib/python3.7/site-packages/django/contrib/auth/decorators.py new file mode 100644 index 0000000..53f62e8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/decorators.py @@ -0,0 +1,73 @@ +from functools import wraps +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.core.exceptions import PermissionDenied +from django.shortcuts import resolve_url + + +def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): + """ + Decorator for views that checks that the user passes the given test, + redirecting to the log-in page if necessary. The test should be a callable + that takes the user object and returns True if the user passes. + """ + + def decorator(view_func): + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + if test_func(request.user): + return view_func(request, *args, **kwargs) + path = request.build_absolute_uri() + resolved_login_url = resolve_url(login_url or settings.LOGIN_URL) + # If the login url is the same scheme and net location then just + # use the path as the "next" url. + login_scheme, login_netloc = urlparse(resolved_login_url)[:2] + current_scheme, current_netloc = urlparse(path)[:2] + if ((not login_scheme or login_scheme == current_scheme) and + (not login_netloc or login_netloc == current_netloc)): + path = request.get_full_path() + from django.contrib.auth.views import redirect_to_login + return redirect_to_login( + path, resolved_login_url, redirect_field_name) + return _wrapped_view + return decorator + + +def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): + """ + Decorator for views that checks that the user is logged in, redirecting + to the log-in page if necessary. + """ + actual_decorator = user_passes_test( + lambda u: u.is_authenticated, + login_url=login_url, + redirect_field_name=redirect_field_name + ) + if function: + return actual_decorator(function) + return actual_decorator + + +def permission_required(perm, login_url=None, raise_exception=False): + """ + Decorator for views that checks whether a user has a particular permission + enabled, redirecting to the log-in page if necessary. + If the raise_exception parameter is given the PermissionDenied exception + is raised. + """ + def check_perms(user): + if isinstance(perm, str): + perms = (perm,) + else: + perms = perm + # First check if the user has the permission (even anon users) + if user.has_perms(perms): + return True + # In case the 403 handler should be called raise the exception + if raise_exception: + raise PermissionDenied + # As the last resort, show the login form + return False + return user_passes_test(check_perms, login_url=login_url) diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/handlers/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/auth/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ar/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..92fa4fd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ar/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ast/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e5f1ace Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ast/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1418c1f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..8277d9d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,304 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Boris Chervenkov , 2012 +# Georgi Kostadinov , 2012 +# Jannis Leidel , 2011 +# Lyuboslav Petrov , 2014 +# Todor Lubenov , 2015 +# Venelin Stoykov , 2015-2016 +# vestimir , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Лична информация" + +msgid "Permissions" +msgstr "Права" + +msgid "Important dates" +msgstr "Важни дати" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s обект с първичен ключ %(key)r не съществува." + +msgid "Password changed successfully." +msgstr "Паролата беше променена успешно. " + +#, python-format +msgid "Change password: %s" +msgstr "Промени парола: %s" + +msgid "Authentication and Authorization" +msgstr "Аутентикация и оторизация" + +msgid "password" +msgstr "парола" + +msgid "last login" +msgstr "последно вписване" + +msgid "No password set." +msgstr "Не е запазена парола." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Невалиден формат за парола или неизвестен алгоритъм за хеширане." + +msgid "The two password fields didn't match." +msgstr "Двете полета за паролата не съвпадат. " + +msgid "Password" +msgstr "Парола" + +msgid "Password confirmation" +msgstr "Потвърждение на паролата" + +msgid "Enter the same password as before, for verification." +msgstr "Въведете същата парола като преди, за да потвърдите." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Моля, въведете правилните %(username)s и парола. Имайте предвид, че и двете " +"полета могат да бъдат малки или главни букви." + +msgid "This account is inactive." +msgstr "Този профил е неактивен." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Нова парола" + +msgid "New password confirmation" +msgstr "Потвърждение на новата парола" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Въвели сте погрешна стара парола. Въведете я отново. " + +msgid "Old password" +msgstr "Стара парола" + +msgid "Password (again)" +msgstr "Парола (отново)" + +msgid "algorithm" +msgstr "алгоритъм" + +msgid "iterations" +msgstr "повторения" + +msgid "salt" +msgstr "'salt'" + +msgid "hash" +msgstr "хеш" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "версия" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "работен фактор" + +msgid "checksum" +msgstr "чексума" + +msgid "name" +msgstr "име" + +msgid "content type" +msgstr "тип на съдържанието" + +msgid "codename" +msgstr "код" + +msgid "permission" +msgstr "право" + +msgid "permissions" +msgstr "права" + +msgid "group" +msgstr "група" + +msgid "groups" +msgstr "групи" + +msgid "superuser status" +msgstr "статут на супер-потребител" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Указва, че този потребител има всички права (без да има нужда да се " +"изброяват изрично)." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Групите на които този потребител принадлежи. Потребителят ще получи всички " +"разрешения, дадени на всяка една от своите групи." + +msgid "user permissions" +msgstr "права на потребител" + +msgid "Specific permissions for this user." +msgstr "Специфични права за този потребител" + +msgid "username" +msgstr "потребител" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Задължително. 150 знака или по-малко. Букви, цифри и @/./+/-/_ ." + +msgid "A user with that username already exists." +msgstr "Потребител с това потребителско име вече съществува. " + +msgid "first name" +msgstr "собствено име" + +msgid "last name" +msgstr "фамилно име" + +msgid "email address" +msgstr "имейл адрес" + +msgid "staff status" +msgstr "статус на персонал" + +msgid "Designates whether the user can log into this admin site." +msgstr "Указва дали този потребител има достъп до административния панел." + +msgid "active" +msgstr "активен" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Указва дали този потребител трябва да се третира като активен. Премахнете на " +"избора на това, вместо да триете профила." + +msgid "date joined" +msgstr "дата на регистриране" + +msgid "user" +msgstr "потребител" + +msgid "users" +msgstr "потребители" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Паролата е прекелно къса. Трябва да съдържа поне %(min_length)d символ." +msgstr[1] "" +"Паролата е прекелно къса. Трябва да съдържа поне %(min_length)d символа." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Вашата парола трябва да съдържа поне %(min_length)d символ." +msgstr[1] "Вашата парола трябва да съдържа поне %(min_length)d символа." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Паролата е много подобна на %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Вашата парола не може да прилича на останалата Ви лична информация." + +msgid "This password is too common." +msgstr "Тази парола е често срещана." + +msgid "Your password can't be a commonly used password." +msgstr "Вашата парола не може да бъде често срещана." + +msgid "This password is entirely numeric." +msgstr "Тази парола е изцяло от цифри." + +msgid "Your password can't be entirely numeric." +msgstr "Вашата парола не може да бъде само от цифри." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Променена парола на %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Въведете валидно потребителско име. То може да съдържа само букви на " +"латиница, цифри и @/./+/-/_ символи." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Въведете валидно потребителско име. То може да съдържа само букви, цифри и " +"@/./+/-/_ символи." + +msgid "Logged out" +msgstr "Извън системата" + +msgid "Password reset" +msgstr "Забравена парола" + +msgid "Password reset sent" +msgstr "Нулиране на паролата изпратено" + +msgid "Enter new password" +msgstr "Въведете нова парола" + +msgid "Password reset unsuccessful" +msgstr "Неуспешна промяна на паролата " + +msgid "Password reset complete" +msgstr "Промяната на парола завърши" + +msgid "Password change" +msgstr "Промяна на парола" + +msgid "Password change successful" +msgstr "Паролата е сменена успешно" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9bb6607 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..7656fb3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,292 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Personal info" +msgstr "Lični podaci" + +msgid "Permissions" +msgstr "Dozvole" + +msgid "Important dates" +msgstr "Važni datumi" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "Lozinka uspješno izmjenjena." + +#, python-format +msgid "Change password: %s" +msgstr "Izmjeni lozinku: %s" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "lozinka" + +msgid "last login" +msgstr "posljednja prijava" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "Dva polja za lozinku se nisu poklopila." + +msgid "Password" +msgstr "Lozinka" + +msgid "Password confirmation" +msgstr "Potvrda lozinke" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "Ovaj nalog je neaktivan." + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "Nova lozinka" + +msgid "New password confirmation" +msgstr "Potvrda nove lozinke" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Vaša stara lozinka nije pravilno unesena. Unesite je ponovo." + +msgid "Old password" +msgstr "Stara lozinka" + +msgid "Password (again)" +msgstr "Lozinka (ponovite)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "ime" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "šifra dozvole" + +msgid "permission" +msgstr "dozvola" + +msgid "permissions" +msgstr "dozvole" + +msgid "group" +msgstr "grupa" + +msgid "groups" +msgstr "grupe" + +msgid "superuser status" +msgstr "status administratora" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Označava da li korisnik ima sve dozvole bez dodjeljivanja pojedinačnih " +"dozvola." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "korisničke dozvole" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "korisničko ime" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "Korisnik sa tim korisničkim imenom već postoji." + +msgid "first name" +msgstr "ime" + +msgid "last name" +msgstr "prezime" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "status člana uredništva" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Označava da li korisnik može da se prijavi na ovaj sajt za administraciju." + +msgid "active" +msgstr "aktivan" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Označava da li se korisnik smatra aktivnim. Uklnote izbor sa ovog polja " +"umjesto da brišete nalog." + +msgid "date joined" +msgstr "datum registracije" + +msgid "user" +msgstr "korisnik" + +msgid "users" +msgstr "korisnici" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "Odjavljen" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c8eb06d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..eb8c14e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,306 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jan Munclinger , 2013 +# Jannis Leidel , 2011 +# Tomáš Ehrlich , 2015 +# Vláďa Macek , 2013-2014 +# Vláďa Macek , 2015-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-16 12:22+0000\n" +"Last-Translator: Vláďa Macek \n" +"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " +"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgid "Personal info" +msgstr "Osobní údaje" + +msgid "Permissions" +msgstr "Oprávnění" + +msgid "Important dates" +msgstr "Důležitá data" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Položka \"%(name)s\" s primárním klíčem \"%(key)r\" neexistuje." + +msgid "Password changed successfully." +msgstr "Změna hesla byla úspěšná." + +#, python-format +msgid "Change password: %s" +msgstr "Heslo pro uživatele %s: změnit" + +msgid "Authentication and Authorization" +msgstr "Autentizace a autorizace" + +msgid "password" +msgstr "heslo" + +msgid "last login" +msgstr "poslední přihlášení" + +msgid "No password set." +msgstr "Heslo nenastaveno." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Neplatný formát hesla nebo neplatný hashovací algoritmus." + +msgid "The two password fields didn't match." +msgstr "Hesla se neshodují." + +msgid "Password" +msgstr "Heslo" + +msgid "Password confirmation" +msgstr "Potvrzení hesla" + +msgid "Enter the same password as before, for verification." +msgstr "Zadejte pro ověření stejné heslo jako předtím." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Hesla se neukládají přímo a tak je nelze zobrazit. Je ale možné je změnit " +"pomocí tohoto formuláře." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Zadejte správnou hodnotu pole %(username)s a heslo. Pozor, obě pole mohou " +"rozlišovat malá a velká písmena." + +msgid "This account is inactive." +msgstr "Tento účet je neaktivní." + +msgid "Email" +msgstr "E-mail" + +msgid "New password" +msgstr "Nové heslo" + +msgid "New password confirmation" +msgstr "Potvrzení nového hesla" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Vaše současné heslo nebylo zadáno správně. Zkuste to znovu." + +msgid "Old password" +msgstr "Současné heslo" + +msgid "Password (again)" +msgstr "Heslo (znovu)" + +msgid "algorithm" +msgstr "algoritmus" + +msgid "iterations" +msgstr "iterace" + +msgid "salt" +msgstr "hodnota salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "varieta" + +msgid "version" +msgstr "verze" + +msgid "memory cost" +msgstr "spotřeba paměti" + +msgid "time cost" +msgstr "doba" + +msgid "parallelism" +msgstr "paralelismus" + +msgid "work factor" +msgstr "faktor práce" + +msgid "checksum" +msgstr "kontrolní součet" + +msgid "name" +msgstr "název" + +msgid "content type" +msgstr "typ obsahu" + +msgid "codename" +msgstr "kódový název" + +msgid "permission" +msgstr "oprávnění" + +msgid "permissions" +msgstr "oprávnění" + +msgid "group" +msgstr "skupina" + +msgid "groups" +msgstr "skupiny" + +msgid "superuser status" +msgstr "superuživatel" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Určuje, že uživatel má veškerá oprávnění bez jejich explicitního přiřazení." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Skupiny, do kterých tento uživatel patří. Uživatel dostane všechna oprávnění " +"udělená každé z jeho skupin." + +msgid "user permissions" +msgstr "uživatelská oprávnění" + +msgid "Specific permissions for this user." +msgstr "Konkrétní oprávnění tohoto uživatele." + +msgid "username" +msgstr "uživatelské jméno" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Požadováno. 150 znaků nebo méně. Pouze písmena, číslice a znaky @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Uživatel s tímto jménem již existuje." + +msgid "first name" +msgstr "křestní jméno" + +msgid "last name" +msgstr "příjmení" + +msgid "email address" +msgstr "e-mailová adresa" + +msgid "staff status" +msgstr "administrační přístup" + +msgid "Designates whether the user can log into this admin site." +msgstr "Určuje, zda se uživatel může přihlásit do správy tohoto webu." + +msgid "active" +msgstr "aktivní" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Určuje, zda bude uživatel považován za aktivního. Použijte tuto možnost " +"místo odstranění účtů." + +msgid "date joined" +msgstr "datum registrace" + +msgid "user" +msgstr "uživatel" + +msgid "users" +msgstr "uživatelé" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "Heslo je příliš krátké. Musí mít délku aspoň %(min_length)d znak." +msgstr[1] "Heslo je příliš krátké. Musí mít délku aspoň %(min_length)d znaky." +msgstr[2] "Heslo je příliš krátké. Musí mít délku aspoň %(min_length)d znaků." +msgstr[3] "Heslo je příliš krátké. Musí mít délku aspoň %(min_length)d znaků." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Heslo musí mít délku aspoň %(min_length)d znak." +msgstr[1] "Heslo musí mít délku aspoň %(min_length)d znaky." +msgstr[2] "Heslo musí mít délku aspoň %(min_length)d znaků." +msgstr[3] "Heslo musí mít délku aspoň %(min_length)d znaků." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Heslo je příliš podobné obsahu pole %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Heslo nemůže být příliš podobné jinému údaji ve vašem účtu." + +msgid "This password is too common." +msgstr "Heslo je příliš běžné." + +msgid "Your password can't be a commonly used password." +msgstr "Vaše heslo nemůže být takové, které je často používané." + +msgid "This password is entirely numeric." +msgstr "Heslo se skládá pouze z čísel." + +msgid "Your password can't be entirely numeric." +msgstr "Vaše heslo nemůže být čistě číselné." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Obnovení hesla na webu %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Zadejte platné uživatelské jméno. Hodnota může obsahovat pouze písmena bez " +"diakritiky, tj. háčků a čárek, číslice a znaky @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Zadejte platné uživatelské jméno. Hodnota může obsahovat pouze písmena, " +"číslice a znaky @/./+/-/_." + +msgid "Logged out" +msgstr "Odhlášeno" + +msgid "Password reset" +msgstr "Obnovení hesla" + +msgid "Password reset sent" +msgstr "Zpráva s obnovením hesla byla odeslána" + +msgid "Enter new password" +msgstr "Zadejte nové heslo" + +msgid "Password reset unsuccessful" +msgstr "Obnovení hesla bylo neúspěšné" + +msgid "Password reset complete" +msgstr "Heslo bylo obnoveno" + +msgid "Password change" +msgstr "Změna hesla" + +msgid "Password change successful" +msgstr "Změna hesla byla úspěšná" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..110c5c7 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/dsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..abe465c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,315 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-10-02 10:01+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"language/dsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: dsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Personal info" +msgstr "Wósobinske informacije" + +msgid "Permissions" +msgstr "Pšawa" + +msgid "Important dates" +msgstr "Wažne daty" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Objekt %(name)s z primarnym klucom %(key)r njeeksistěrujo." + +msgid "Password changed successfully." +msgstr "Gronidło jo se změniło." + +#, python-format +msgid "Change password: %s" +msgstr "Gronidło změniś: %s" + +msgid "Authentication and Authorization" +msgstr "Awtentifikacija a awtorizacija" + +msgid "password" +msgstr "gronidło" + +msgid "last login" +msgstr "slědne pśizjawjenje" + +msgid "No password set." +msgstr "Žedno gronidło nastajone." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Njepłaśiwy gronidłowy format abo njeznaty kontrolny algoritmus." + +msgid "The two password fields didn't match." +msgstr "Gronidle njejstej jadnak." + +msgid "Password" +msgstr "Gronidło" + +msgid "Password confirmation" +msgstr "Gronidłowe wobkšuśenje" + +msgid "Enter the same password as before, for verification." +msgstr "Zapódajśo to samske gronidło, za pśespytanje." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Grube gronidła se njeskładuju, togodla njejo móžno, gronidło wužywarja " +"wiźeś, ale móžośo gronidło z pomocu toś togo formulara " +"změniś." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Pšosym zapódajśo pšawe %(username)s a gronidło. Źiwajśo na to, až wobej póli " +"móžotej mjazy wjeliko- a małopisanim rozeznawaś." + +msgid "This account is inactive." +msgstr "Toś to konto jo inaktiwne." + +msgid "Email" +msgstr "E-mail" + +msgid "New password" +msgstr "Nowe gronidło" + +msgid "New password confirmation" +msgstr "Wobkšuśenje nowego gronidła" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Wašo stare gronidło jo se wopak zapódało. Pšosym zapódajśo jo hyšći raz." + +msgid "Old password" +msgstr "Stare gronidło" + +msgid "Password (again)" +msgstr "Gronidło (znowego)" + +msgid "algorithm" +msgstr "algoritmus" + +msgid "iterations" +msgstr "wóspjetowanja" + +msgid "salt" +msgstr "sol" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "warianta" + +msgid "version" +msgstr "wersija" + +msgid "memory cost" +msgstr "składowa pśetrjeba" + +msgid "time cost" +msgstr "casowa pśetrjeba" + +msgid "parallelism" +msgstr "paralelizm" + +msgid "work factor" +msgstr "źěłowy faktor" + +msgid "checksum" +msgstr "kontrolna suma" + +msgid "name" +msgstr "mě" + +msgid "content type" +msgstr "wopśimjeśowy typ" + +msgid "codename" +msgstr "kodowe mě" + +msgid "permission" +msgstr "pšawo" + +msgid "permissions" +msgstr "pšawa" + +msgid "group" +msgstr "kupka" + +msgid "groups" +msgstr "kupki" + +msgid "superuser status" +msgstr "status superwužywarja" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Wóznamjenijo, lěc toś ten wužywaŕ ma wšykne pšawa bźez togo, aby mógał je " +"pśipokazaś." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Kupki, ku kótarymž toś ten wužywaŕ słuša. Wužywaŕ dóstanjo wšykne pšawa, " +"kótarež jomu kupki dawaju." + +msgid "user permissions" +msgstr "wužywarske pšawa" + +msgid "Specific permissions for this user." +msgstr "Wěste pšawa za toś togo wužywarja." + +msgid "username" +msgstr "wužywarske mě" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Trěbne. 150 znamuškow abo mjenjej. Jano pismiki, cyfry a @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Wužywaŕ z toś tym wužywarskim mjenim južo eksistěrujo." + +msgid "first name" +msgstr "pśedmě" + +msgid "last name" +msgstr "familijowe mě" + +msgid "email address" +msgstr "e-mailowa adresa" + +msgid "staff status" +msgstr "personalny status" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Wóznamjenijo, lěc wužywaŕ móžo se pla administratorowego sedła pśizjawiś." + +msgid "active" +msgstr "aktiwny" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Wóznamjenijo, lěc deje z toś tym wužywarjom ako z aktiwnym wobchadás. " +"Znjemóžniśo to město togo, aby konta wulašował." + +msgid "date joined" +msgstr "cłonk wót" + +msgid "user" +msgstr "wužywaŕ" + +msgid "users" +msgstr "wužywarje" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Toś to gronidło jo pśekrotke. Musy nanejmjenjej %(min_length)d znamuško " +"wopśimowaś." +msgstr[1] "" +"Toś to gronidło jo pśekrotke. Musy nanejmjenjej %(min_length)d znamušce " +"wopśimowaś." +msgstr[2] "" +"Toś to gronidło jo pśekrotke. Musy nanejmjenjej %(min_length)d znamuška " +"wopśimowaś." +msgstr[3] "" +"Toś to gronidło jo pśekrotke. Musy nanejmjenjej %(min_length)d znamuškow " +"wopśimowaś." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Wašo gronidło musy nanejmjenjej %(min_length)d znamuško wopśimowaś." +msgstr[1] "Wašo gronidło musy nanejmjenjej %(min_length)d znamušce wopśimowaś." +msgstr[2] "Wašo gronidło musy nanejmjenjej %(min_length)d znamuška wopśimowaś." +msgstr[3] "" +"Wašo gronidło musy nanejmjenjej %(min_length)d znamuškow wopśimowaś." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Gronidło jo na %(verbose_name)s pśepódobne." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Wašo gronidło njesmějo na waše druge wósobinske daty pśepódobne byś." + +msgid "This password is too common." +msgstr "Toś to gronidło jo pśepowšykne." + +msgid "Your password can't be a commonly used password." +msgstr "Wašo gronidło njesmějo cesto wužywane gronidło byś." + +msgid "This password is entirely numeric." +msgstr "Toś to gronidło jo cele numeriske." + +msgid "Your password can't be entirely numeric." +msgstr "Wašo gronidło njesmějo cele numeriske byś." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Slědkstajenje gronidła na %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Zapódajśo płaśiwe wužywarske mě. Toś ta gódnota smějo jano engelske pismiki, " +"licby a znamuška @/./+/-/_ wopśimowaś." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Zapódajśo płaśiwe wužywarske mě. Toś ta gódnota smějo jano pismiki, licby a " +"znamuška @/./+/-/_ wopśimowaś." + +msgid "Logged out" +msgstr "Wótzjawjony" + +msgid "Password reset" +msgstr "Slědkstajenje gronidła" + +msgid "Password reset sent" +msgstr "Slědkstajenje gronidła wótpósłane" + +msgid "Enter new password" +msgstr "Zapódajśo nowe gronidło" + +msgid "Password reset unsuccessful" +msgstr "Slědkstajenje gronidła njejo se raźiło" + +msgid "Password reset complete" +msgstr "Slědkstajenje gronidła dokóńcone" + +msgid "Password change" +msgstr "Změnjenje gronidła" + +msgid "Password change successful" +msgstr "Gronidło jo se wuspěšnje změniło" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/el/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..18a8b2a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/el/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..e9488ac --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,369 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: contrib/auth/admin.py:49 +msgid "Personal info" +msgstr "" + +#: contrib/auth/admin.py:50 +msgid "Permissions" +msgstr "" + +#: contrib/auth/admin.py:52 +msgid "Important dates" +msgstr "" + +#: contrib/auth/admin.py:136 +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +#: contrib/auth/admin.py:146 +msgid "Password changed successfully." +msgstr "" + +#: contrib/auth/admin.py:165 +#, python-format +msgid "Change password: %s" +msgstr "" + +#: contrib/auth/apps.py:12 +msgid "Authentication and Authorization" +msgstr "" + +#: contrib/auth/base_user.py:50 +msgid "password" +msgstr "" + +#: contrib/auth/base_user.py:51 +msgid "last login" +msgstr "" + +#: contrib/auth/forms.py:30 +msgid "No password set." +msgstr "" + +#: contrib/auth/forms.py:36 +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +#: contrib/auth/forms.py:69 contrib/auth/forms.py:268 +#: contrib/auth/forms.py:332 +msgid "The two password fields didn't match." +msgstr "" + +#: contrib/auth/forms.py:71 contrib/auth/forms.py:102 +#: contrib/auth/forms.py:130 contrib/auth/forms.py:336 +msgid "Password" +msgstr "" + +#: contrib/auth/forms.py:73 +msgid "Password confirmation" +msgstr "" + +#: contrib/auth/forms.py:75 contrib/auth/forms.py:343 +msgid "Enter the same password as before, for verification." +msgstr "" + +#: contrib/auth/forms.py:103 +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#: contrib/auth/forms.py:133 +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +#: contrib/auth/forms.py:135 +msgid "This account is inactive." +msgstr "" + +#: contrib/auth/forms.py:198 +msgid "Email" +msgstr "" + +#: contrib/auth/forms.py:270 +msgid "New password" +msgstr "" + +#: contrib/auth/forms.py:273 +msgid "New password confirmation" +msgstr "" + +#: contrib/auth/forms.py:306 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +#: contrib/auth/forms.py:309 +msgid "Old password" +msgstr "" + +#: contrib/auth/forms.py:341 +msgid "Password (again)" +msgstr "" + +#: contrib/auth/hashers.py:251 contrib/auth/hashers.py:334 +#: contrib/auth/hashers.py:386 contrib/auth/hashers.py:414 +#: contrib/auth/hashers.py:447 contrib/auth/hashers.py:480 +#: contrib/auth/hashers.py:514 +msgid "algorithm" +msgstr "" + +#: contrib/auth/hashers.py:252 +msgid "iterations" +msgstr "" + +#: contrib/auth/hashers.py:253 contrib/auth/hashers.py:336 +#: contrib/auth/hashers.py:387 contrib/auth/hashers.py:415 +#: contrib/auth/hashers.py:515 +msgid "salt" +msgstr "" + +#: contrib/auth/hashers.py:254 contrib/auth/hashers.py:388 +#: contrib/auth/hashers.py:416 contrib/auth/hashers.py:448 +#: contrib/auth/hashers.py:481 contrib/auth/hashers.py:516 +msgid "hash" +msgstr "" + +#: contrib/auth/hashers.py:347 +msgid "variety" +msgstr "" + +#: contrib/auth/hashers.py:348 +msgid "version" +msgstr "" + +#: contrib/auth/hashers.py:349 +msgid "memory cost" +msgstr "" + +#: contrib/auth/hashers.py:350 +msgid "time cost" +msgstr "" + +#: contrib/auth/hashers.py:351 +msgid "parallelism" +msgstr "" + +#: contrib/auth/hashers.py:445 +msgid "work factor" +msgstr "" + +#: contrib/auth/hashers.py:337 +msgid "checksum" +msgstr "" + +#: contrib/auth/models.py:61 contrib/auth/models.py:116 +msgid "name" +msgstr "" + +#: contrib/auth/models.py:65 +msgid "content type" +msgstr "" + +#: contrib/auth/models.py:67 +msgid "codename" +msgstr "" + +#: contrib/auth/models.py:71 +msgid "permission" +msgstr "" + +#: contrib/auth/models.py:72 contrib/auth/models.py:119 +msgid "permissions" +msgstr "" + +#: contrib/auth/models.py:126 +msgid "group" +msgstr "" + +#: contrib/auth/models.py:127 contrib/auth/models.py:222 +msgid "groups" +msgstr "" + +#: contrib/auth/models.py:213 +msgid "superuser status" +msgstr "" + +#: contrib/auth/models.py:216 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +#: contrib/auth/models.py:225 +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +#: contrib/auth/models.py:233 +msgid "user permissions" +msgstr "" + +#: contrib/auth/models.py:235 +msgid "Specific permissions for this user." +msgstr "" + +#: contrib/auth/models.py:305 +msgid "username" +msgstr "" + +#: contrib/auth/models.py:313 +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +#: contrib/auth/models.py:316 +msgid "A user with that username already exists." +msgstr "" + +#: contrib/auth/models.py:320 +msgid "first name" +msgstr "" + +#: contrib/auth/models.py:321 +msgid "last name" +msgstr "" + +#: contrib/auth/models.py:322 +msgid "email address" +msgstr "" + +#: contrib/auth/models.py:324 +msgid "staff status" +msgstr "" + +#: contrib/auth/models.py:326 +msgid "Designates whether the user can log into this admin site." +msgstr "" + +#: contrib/auth/models.py:329 +msgid "active" +msgstr "" + +#: contrib/auth/models.py:332 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +#: contrib/auth/models.py:336 +msgid "date joined" +msgstr "" + +#: contrib/auth/models.py:344 +msgid "user" +msgstr "" + +#: contrib/auth/models.py:345 +msgid "users" +msgstr "" + +#: contrib/auth/password_validation.py:101 +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#: contrib/auth/password_validation.py:111 +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#: contrib/auth/password_validation.py:147 +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +#: contrib/auth/password_validation.py:153 +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +#: contrib/auth/password_validation.py:180 +msgid "This password is too common." +msgstr "" + +#: contrib/auth/password_validation.py:185 +msgid "Your password can't be a commonly used password." +msgstr "" + +#: contrib/auth/password_validation.py:195 +msgid "This password is entirely numeric." +msgstr "" + +#: contrib/auth/password_validation.py:200 +msgid "Your password can't be entirely numeric." +msgstr "" + +#: contrib/auth/templates/registration/password_reset_subject.txt:2 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +#: contrib/auth/validators.py:13 +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +#: contrib/auth/validators.py:23 +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +#: contrib/auth/views.py:133 +msgid "Logged out" +msgstr "" + +#: contrib/auth/views.py:211 +msgid "Password reset" +msgstr "" + +#: contrib/auth/views.py:224 +msgid "Password reset sent" +msgstr "" + +#: contrib/auth/views.py:261 +msgid "Enter new password" +msgstr "" + +#: contrib/auth/views.py:272 +msgid "Password reset unsuccessful" +msgstr "" + +#: contrib/auth/views.py:290 +msgid "Password reset complete" +msgstr "" + +#: contrib/auth/views.py:325 +msgid "Password change" +msgstr "" + +#: contrib/auth/views.py:339 +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cd7c3ad Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..77154a3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.po new file mode 100644 index 0000000..6390b30 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/eo/LC_MESSAGES/django.po @@ -0,0 +1,306 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Baptiste Darthenay , 2012-2013 +# Baptiste Darthenay , 2013-2019 +# Robin van der Vliet , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2019-02-13 19:03+0000\n" +"Last-Translator: Baptiste Darthenay \n" +"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" +"eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Personaj informoj" + +msgid "Permissions" +msgstr "Permesoj" + +msgid "Important dates" +msgstr "Gravaj datoj" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s objekto kun ĉefŝlosilo %(key)r ne ekzistas." + +msgid "Password changed successfully." +msgstr "Pasvorto suksese ŝanĝita." + +#, python-format +msgid "Change password: %s" +msgstr "Ŝanĝi pasvorton: %s" + +msgid "Authentication and Authorization" +msgstr "Aŭtentigo kaj rajtigo" + +msgid "password" +msgstr "pasvorto" + +msgid "last login" +msgstr "lasta ensaluto" + +msgid "No password set." +msgstr "Neniu pasvorto agordita." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Nevalida pasvorta formato, aŭ nekonata haketa algoritmo." + +msgid "The two password fields didn't match." +msgstr "La du pasvotaj kampoj ne kongruas." + +msgid "Password" +msgstr "Pasvorto" + +msgid "Password confirmation" +msgstr "Pasvorta konfirmo" + +msgid "Enter the same password as before, for verification." +msgstr "Entajpu la saman pasvorton kiel supre, por konfirmo." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Krudaj pasvortoj ne estas entenitaj, do ne eblas vidi la pasvorton de tiu " +"uzanto, sed vi povas ŝanĝi la pasvorton uzante tiun " +"formalaron." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Bonvolu enigi ĝustan %(username)sn kaj pasvorton. Notu, ke ambaŭ kampoj " +"povas esti usklecodistingaj." + +msgid "This account is inactive." +msgstr "Ĉi-tiu konto ne estas aktiva." + +msgid "Email" +msgstr "Retpoŝto" + +msgid "New password" +msgstr "Nova pasvorto" + +msgid "New password confirmation" +msgstr "Nova pasvorto por konfirmo" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Via malnova pasvorto estis tajpita malĝuste. Bonvolu denove entajpi ĝin." + +msgid "Old password" +msgstr "Malnova pasvorto" + +msgid "Password (again)" +msgstr "Pasvorto (denove)" + +msgid "algorithm" +msgstr "algoritmo" + +msgid "iterations" +msgstr "iteracioj" + +msgid "salt" +msgstr "salo" + +msgid "hash" +msgstr "haketo" + +msgid "variety" +msgstr "diverseco" + +msgid "version" +msgstr "versio" + +msgid "memory cost" +msgstr "memoria kosto" + +msgid "time cost" +msgstr "tempa kosto" + +msgid "parallelism" +msgstr "paralelismo" + +msgid "work factor" +msgstr "laborfaktoro" + +msgid "checksum" +msgstr "kontrolsumo" + +msgid "name" +msgstr "nomo" + +msgid "content type" +msgstr "enhava tipo" + +msgid "codename" +msgstr "kodnomo" + +msgid "permission" +msgstr "permeso" + +msgid "permissions" +msgstr "permesoj" + +msgid "group" +msgstr "grupo" + +msgid "groups" +msgstr "grupoj" + +msgid "superuser status" +msgstr "ĉefuzanta statuso" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Indikas ke tiu uzanto havas ĉiujn permesojn, sen eksplicite asigni ilin." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"La grupoj en kiu tiu uzanto apartenas. Uzanto akiros ĉiuj permesoj donita al " +"ĉiuj de iliaj grupoj." + +msgid "user permissions" +msgstr "uzantaj permesoj" + +msgid "Specific permissions for this user." +msgstr "Specifaj permesoj por tiu ĉi uzanto." + +msgid "username" +msgstr "salutnomo" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Petita. 150 signoj aŭ malpli. Nur literoj, ciferoj kaj @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Uzanto kun sama salutnomo jam ekzistas." + +msgid "first name" +msgstr "persona nomo" + +msgid "last name" +msgstr "familia nomo" + +msgid "email address" +msgstr "retpoŝta adreso" + +msgid "staff status" +msgstr "personara statuso" + +msgid "Designates whether the user can log into this admin site." +msgstr "Indikas ĉu la uzanto povas saluti en ĉi-tiu administranta retejo." + +msgid "active" +msgstr "aktiva" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Indikas ĉu tiu uzanto devus esti traktita kiel aktiva. Malselekti tion ĉi " +"anstataŭ forigi kontojn." + +msgid "date joined" +msgstr "dato aliĝita" + +msgid "user" +msgstr "uzanto" + +msgid "users" +msgstr "uzantoj" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Tiu pasvorto estas tro mallonga. Ĝi devas enhavi almenaŭ %(min_length)d " +"signon." +msgstr[1] "" +"Tiu pasvorto estas tro mallonga. Ĝi devas enhavi almenaŭ %(min_length)d " +"signojn." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Via pasvorto devas enhavi almenaŭ %(min_length)d signon." +msgstr[1] "Via pasvorto devas enhavi almenaŭ %(min_length)d signojn." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "La pasvorto estas tro simila al la %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Via pasvorto ne povas esti tro similaj al viaj aliaj personaj informoj." + +msgid "This password is too common." +msgstr "Tiu pasvorto estas tro kutima." + +msgid "Your password can't be a commonly used password." +msgstr "Via pasvorto ne povas esti kutime uzata pasvorto." + +msgid "This password is entirely numeric." +msgstr "Tiu pasvorto estas tute cefera." + +msgid "Your password can't be entirely numeric." +msgstr "Via pasvorto ne povas esti tute cifera." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Pasvorta rekomencigo ĉe %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Enigu validan uzantnomon. Ĉi tiu valoro povas enhavi nur sensupersignajn " +"literojn, ciferojn kaj la signojn @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Enigu validan uzantnomon. Ĉi tiu valoro povas enhavi nur literojn, ciferojn " +"kaj la signojn @/./+/-/_." + +msgid "Logged out" +msgstr "Adiaŭita" + +msgid "Password reset" +msgstr "Pasvorta rekomencigo" + +msgid "Password reset sent" +msgstr "Pasvorta rekomencigo sendita" + +msgid "Enter new password" +msgstr "Enigu novan pasvorton" + +msgid "Password reset unsuccessful" +msgstr "Pasvorta rekomencigo malsuksesis" + +msgid "Password reset complete" +msgstr "Pasvorta rekomencigo plenumita" + +msgid "Password change" +msgstr "Pasvorta ŝanĝo" + +msgid "Password change successful" +msgstr "Pasvorto sukcese ŝanĝita" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0862404 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..88fee29 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,311 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Ramiro Morales, 2013-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-10-29 17:25+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Información personal" + +msgid "Permissions" +msgstr "Permisos" + +msgid "Important dates" +msgstr "Fechas importantes" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "No existe un objeto %(name)s con una clave primaria %(key)r." + +msgid "Password changed successfully." +msgstr "Cambio de contraseña exitoso" + +#, python-format +msgid "Change password: %s" +msgstr "Cambiar contraseña: %s" + +msgid "Authentication and Authorization" +msgstr "Autenticación y Autorización" + +msgid "password" +msgstr "contraseña" + +msgid "last login" +msgstr "último ingreso" + +msgid "No password set." +msgstr "No se ha establecido una contraseña." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Formato de contraseña inválido o algoritmo de hashing desconocido." + +msgid "The two password fields didn't match." +msgstr "Los dos campos de contraseñas no coinciden entre si." + +msgid "Password" +msgstr "Contraseña" + +msgid "Password confirmation" +msgstr "Confirmación de contraseña" + +msgid "Enter the same password as before, for verification." +msgstr "" +"Introduzca la misma contraseña nuevamente, para poder verificar la misma." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"El sistema no almacena las contraseñas originales por lo cual no es posible " +"visualizar la contraseña de este usuario, pero puede modificarla usando este formulario." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Por favor introduzca un %(username)s y una contraseña correctos. Tenga en " +"cuenta que ambos campos son sensibles a mayúsculas/minúsculas." + +msgid "This account is inactive." +msgstr "Esta cuenta está inactiva." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Contraseña nueva" + +msgid "New password confirmation" +msgstr "Confirmación de contraseña nueva" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"La antigua contraseña introducida es incorrecta. Por favor introdúzcala " +"nuevamente." + +msgid "Old password" +msgstr "Contraseña antigua" + +msgid "Password (again)" +msgstr "Contraseña (de nuevo)" + +msgid "algorithm" +msgstr "algoritmo" + +msgid "iterations" +msgstr "iteraciones" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "variedad" + +msgid "version" +msgstr "versión" + +msgid "memory cost" +msgstr "costo en memoria" + +msgid "time cost" +msgstr "costo en tiempo" + +msgid "parallelism" +msgstr "paralelismo" + +msgid "work factor" +msgstr "work factor" + +msgid "checksum" +msgstr "suma de verificación" + +msgid "name" +msgstr "nombre" + +msgid "content type" +msgstr "tipo de contenido" + +msgid "codename" +msgstr "nombre en código" + +msgid "permission" +msgstr "permiso" + +msgid "permissions" +msgstr "permisos" + +msgid "group" +msgstr "grupo" + +msgid "groups" +msgstr "grupos" + +msgid "superuser status" +msgstr "es superusuario" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Indica que este usuario posee todos los permisos sin que sea necesario " +"asignarle los mismos en forma explícita." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Grupos a los cuales pertenece este usuario. Un usuario obtiene todos los " +"permisos otorgados a cada uno de los grupos a los cuales pertenece." + +msgid "user permissions" +msgstr "permisos de usuario" + +msgid "Specific permissions for this user." +msgstr "Permisos específicos de este usuario" + +msgid "username" +msgstr "nombre de usuario" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Obligatorio. Longitud máxima de 150 caracteres. Solo puede estar formado por " +"letras, números y los caracteres @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Ya existe un usuario con ese nombre." + +msgid "first name" +msgstr "nombre" + +msgid "last name" +msgstr "apellido" + +msgid "email address" +msgstr "Dirección de email" + +msgid "staff status" +msgstr "es staff" + +msgid "Designates whether the user can log into this admin site." +msgstr "Indica si el usuario puede ingresar a este sitio de administración." + +msgid "active" +msgstr "activo" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Indica si el usuario debe ser tratado como un usuario activo. Desactive este " +"campo en lugar de eliminar usuarios." + +msgid "date joined" +msgstr "fecha de creación" + +msgid "user" +msgstr "usuario" + +msgid "users" +msgstr "usuarios" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"La contraseña es demasiado corta. Debe contener por lo menos %(min_length)d " +"caracter." +msgstr[1] "" +"La contraseña es demasiado corta. Debe contener por lo menos %(min_length)d " +"caracteres." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Su contraseña debe contener por lo menos %(min_length)d caracter." +msgstr[1] "Su contraseña debe contener por lo menos %(min_length)d caracteres." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "La contraseña es muy similar a %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Su contraseña no puede ser similar a otros componentes de su información " +"personal." + +msgid "This password is too common." +msgstr "La contraseña tiene un valor demasiado común." + +msgid "Your password can't be a commonly used password." +msgstr "Su contraseña no puede ser una contraseña muy comunmente usada." + +msgid "This password is entirely numeric." +msgstr "La contraseña está formada completamente por dígitos." + +msgid "Your password can't be entirely numeric." +msgstr "Su contraseña no puede estar formada exclusivamente por números." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Reinicio de contraseña en %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Introduzca un nombre de usuario válido. Este valor solo puede contener " +"letras del alfabeto inglés, números y los caracteres @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Introduzca un nombre de usuario válido. Este valor solo puede contener " +"letras, números y los caracteres @/./+/-/_." + +msgid "Logged out" +msgstr "Sesión cerrada" + +msgid "Password reset" +msgstr "Reinicio de contraseña" + +msgid "Password reset sent" +msgstr "Se ha enviado un email de reinicialización de contraseña" + +msgid "Enter new password" +msgstr "Introduzca nueva contraseña" + +msgid "Password reset unsuccessful" +msgstr "Reinicio de contraseña fallido" + +msgid "Password reset complete" +msgstr "Reinicio de contraseña completado" + +msgid "Password change" +msgstr "Cambio de contraseña" + +msgid "Password change successful" +msgstr "Cambio de contraseña exitoso" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo new file mode 100644 index 0000000..11f27e4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/es_VE/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4319f61 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..c0c36f8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,308 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Nikneshan , 2015 +# Eric Hamiter , 2013 +# Jannis Leidel , 2011 +# Kaveh Karimi, 2015 +# MJafar Mashhadi , 2018 +# Pouya Abbassi, 2016 +# Reza Mohammadi , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2018-06-23 23:12+0000\n" +"Last-Translator: MJafar Mashhadi \n" +"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Personal info" +msgstr "اطلاعات شخصی" + +msgid "Permissions" +msgstr "اجازه‌ها" + +msgid "Important dates" +msgstr "تاریخ‌های مهم" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "شیء %(name)s با کلید اصلی %(key)r وجود ندارد." + +msgid "Password changed successfully." +msgstr "گذرواژه با موفقیت تغییر یافت." + +#, python-format +msgid "Change password: %s" +msgstr "تغییر گذرواژه: %s" + +msgid "Authentication and Authorization" +msgstr "بررسی اصالت و اجازه‌ها" + +msgid "password" +msgstr "گذرواژه" + +msgid "last login" +msgstr "آخرین ورود" + +msgid "No password set." +msgstr "هیچ رمزی انتخاب نشده است." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "رمز نامعتبر یا الگوریتم رمزنگاری ناشناس" + +msgid "The two password fields didn't match." +msgstr "دو فیلد گذرواژه با هم مطابقت ندارند." + +msgid "Password" +msgstr "گذرواژه" + +msgid "Password confirmation" +msgstr "تأیید گذرواژه" + +msgid "Enter the same password as before, for verification." +msgstr "برای تائید، رمز عبور قبلی را وارد کنید." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"گذرواژه‌ها به صورت خام نگهداری نمی‌شوند لذا راهی برای مشاهدهٔ گذرواژهٔ این کاربر " +"وجود ندارد، اما می‌توانید آن را با این فرم تغییر دهید." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"لطفا %(username)s و گذرواژه‌ای قابل قبول وارد کنید.\n" +"توجه داشته باشید که ممکن است هر دو به کوچکی و بزرگی حروف حساس باشند." + +msgid "This account is inactive." +msgstr "این حساب غیر فعال است." + +msgid "Email" +msgstr "ایمیل" + +msgid "New password" +msgstr "گذرواژهٔ جدید" + +msgid "New password confirmation" +msgstr "تأیید گذرواژهٔ جدید" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "گذرواژهٔ قدیمی‌تان اشتباه وارد شد. لطفاً دوباره وارد کنید." + +msgid "Old password" +msgstr "گذرواژهٔ قدیمی" + +msgid "Password (again)" +msgstr "گذرواژه (تکرار)" + +msgid "algorithm" +msgstr "الگوریتم" + +msgid "iterations" +msgstr "تکرار" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "تنوع" + +msgid "version" +msgstr "نسخه" + +msgid "memory cost" +msgstr "هزینه‌ی حافظه" + +msgid "time cost" +msgstr "هزینه‌ی زمان" + +msgid "parallelism" +msgstr "موازات" + +msgid "work factor" +msgstr "عامل کار" + +msgid "checksum" +msgstr "جمع کنترلی" + +msgid "name" +msgstr "نام" + +msgid "content type" +msgstr "نوع محتوی" + +msgid "codename" +msgstr "نام کد" + +msgid "permission" +msgstr "اجازه" + +msgid "permissions" +msgstr "اجازه‌ها" + +msgid "group" +msgstr "گروه" + +msgid "groups" +msgstr "گروه‌ها" + +msgid "superuser status" +msgstr "ابرکاربر" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"نشان می‌دهد که این کاربر همهٔ اجازه‌ها را دارد بدون آنکه به صراحت به او اختصاص " +"داده شده باشد." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"گروه‌هایی که این کاربر به آنها تعلق دارد. کاربر تمام اجازه‌های مرتبط با این " +"گروه‌ها را دریافت خواهد کرد." + +msgid "user permissions" +msgstr "اجازه‌های کاربر" + +msgid "Specific permissions for this user." +msgstr "اجازه‌های خاص این کاربر." + +msgid "username" +msgstr "نام کاربری" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "الزامی. 150 کاراکتر یا کمتر. فقط شامل حروف، اعداد، و علامات @/./+/-/_" + +msgid "A user with that username already exists." +msgstr "کاربری با آن نام کاربری وجود دارد." + +msgid "first name" +msgstr "نام" + +msgid "last name" +msgstr "نام خانوادگی" + +msgid "email address" +msgstr "آدرس ایمیل" + +msgid "staff status" +msgstr "وضعیت کارمندی" + +msgid "Designates whether the user can log into this admin site." +msgstr "نشان می‌دهد که آیا این کاربر می‌تواند وارد این وبگاه مدیریت شود یا خیر." + +msgid "active" +msgstr "فعال" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"نشان می‌دهد که آیا این کاربر اجازهٔ فعالیت دارد یا خیر. به جای حذف کاربر این " +"تیک را بردارید." + +msgid "date joined" +msgstr "تاریخ پیوستن" + +msgid "user" +msgstr "کاربر" + +msgid "users" +msgstr "کاربرها" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"این رمز عبور خیلی کوتاه است. رمز عبور می‌بایست حداقل از %(min_length)d حرف " +"تشکیل شده باشد." +msgstr[1] "" +"این رمز عبور خیلی کوتاه است. رمز عبور می‌بایست حداقل از %(min_length)d حرف " +"تشکیل شده باشد." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "رمز عبور شما می‌بایست حداقل از %(min_length)d حرف تشکیل شده باشد." +msgstr[1] "رمز عبور شما می‌بایست حداقل از %(min_length)d حرف تشکیل شده باشد." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "این رمز عبور بسیار شبیه %(verbose_name)s می‌باشد." + +msgid "Your password can't be too similar to your other personal information." +msgstr "رمز عبور شما نمی‌تواند شبیه سایر اطلاعات شخصی شما باشد." + +msgid "This password is too common." +msgstr "این رمز عبور بسیار رایج است." + +msgid "Your password can't be a commonly used password." +msgstr "رمز شما نمی تواند از عبارات معروف باشد." + +msgid "This password is entirely numeric." +msgstr "رمز شما کلا عدد است" + +msgid "Your password can't be entirely numeric." +msgstr "رمز شما نمی تواند کلا عدد باشد" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "بازیابی گذرواژه در %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"یک نام کاربری معتبر وارد کنید. این مقدار میتواند فقط شامل حروف الفبای " +"انگلیسی، اعداد، و علامات @/./+/-/_ باشد." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"یک نام کاربری معتبر وارد کنید. این مقدار میتواند فقط شامل حروف، اعداد، و " +"علامات @/./+/-/_ باشد." + +msgid "Logged out" +msgstr "خارج شدید" + +msgid "Password reset" +msgstr "ایجاد گذرواژهٔ جدید" + +msgid "Password reset sent" +msgstr "تقاضای ریست رمز فرستاده شد" + +msgid "Enter new password" +msgstr "ورود گذرواژهٔ جدید" + +msgid "Password reset unsuccessful" +msgstr "گذرواژهٔ جدید ایجاد نشد." + +msgid "Password reset complete" +msgstr "گذرواژهٔ جدید ایجاد شد" + +msgid "Password change" +msgstr "تغییر گذرواژه" + +msgid "Password change successful" +msgstr "گذرواژه تغییر یافت." diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..1e31edb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,315 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2013-2018 +# Claude Paroz , 2013 +# Jannis Leidel , 2011 +# mlorant , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2018-02-27 13:36+0000\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Personal info" +msgstr "Informations personnelles" + +msgid "Permissions" +msgstr "Permissions" + +msgid "Important dates" +msgstr "Dates importantes" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "L'objet %(name)s avec la clef primaire %(key)r n'existe pas." + +msgid "Password changed successfully." +msgstr "Mot de passe modifié avec succès" + +#, python-format +msgid "Change password: %s" +msgstr "Modifier le mot de passe : %s" + +msgid "Authentication and Authorization" +msgstr "Authentification et autorisation" + +msgid "password" +msgstr "mot de passe" + +msgid "last login" +msgstr "dernière connexion" + +msgid "No password set." +msgstr "Aucun mot de passe défini." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" +"Format de mot de passe non valide ou algorithme de hachage non reconnu." + +msgid "The two password fields didn't match." +msgstr "Les deux mots de passe ne correspondent pas." + +msgid "Password" +msgstr "Mot de passe" + +msgid "Password confirmation" +msgstr "Confirmation du mot de passe" + +msgid "Enter the same password as before, for verification." +msgstr "Saisissez le même mot de passe que précédemment, pour vérification." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Les mots de passe ne sont pas enregistrés en clair, ce qui ne permet pas " +"d'afficher le mot de passe de cet utilisateur, mais il est possible de le " +"changer en utilisant ce formulaire. " + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Saisissez un %(username)s et un mot de passe valides. Remarquez que chacun " +"de ces champs est sensible à la casse (différenciation des majuscules/" +"minuscules)." + +msgid "This account is inactive." +msgstr "Ce compte est inactif." + +msgid "Email" +msgstr "Courriel" + +msgid "New password" +msgstr "Nouveau mot de passe" + +msgid "New password confirmation" +msgstr "Confirmation du nouveau mot de passe" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Votre ancien mot de passe est incorrect. Veuillez le rectifier." + +msgid "Old password" +msgstr "Ancien mot de passe" + +msgid "Password (again)" +msgstr "Mot de passe (à nouveau)" + +msgid "algorithm" +msgstr "algorithme" + +msgid "iterations" +msgstr "itérations" + +msgid "salt" +msgstr "salage" + +msgid "hash" +msgstr "empreinte" + +msgid "variety" +msgstr "variété" + +msgid "version" +msgstr "version" + +msgid "memory cost" +msgstr "coût mémoire" + +msgid "time cost" +msgstr "coût temps" + +msgid "parallelism" +msgstr "parallélisme" + +msgid "work factor" +msgstr "facteur travail" + +msgid "checksum" +msgstr "somme de contrôle" + +msgid "name" +msgstr "nom" + +msgid "content type" +msgstr "type de contenu" + +msgid "codename" +msgstr "nom de code" + +msgid "permission" +msgstr "permission" + +msgid "permissions" +msgstr "permissions" + +msgid "group" +msgstr "groupe" + +msgid "groups" +msgstr "groupes" + +msgid "superuser status" +msgstr "statut super-utilisateur" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Précise que l'utilisateur possède toutes les permissions sans les assigner " +"explicitement." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Les groupes dont fait partie cet utilisateur. Celui-ci obtient tous les " +"droits de tous les groupes auxquels il appartient." + +msgid "user permissions" +msgstr "permissions de l'utilisateur" + +msgid "Specific permissions for this user." +msgstr "Permissions spécifiques à cet utilisateur." + +msgid "username" +msgstr "nom d'utilisateur" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Requis. 150 caractères maximum. Uniquement des lettres, nombres et les " +"caractères « @ », « . », « + », « - » et « _ »." + +msgid "A user with that username already exists." +msgstr "Un utilisateur avec ce nom existe déjà." + +msgid "first name" +msgstr "prénom" + +msgid "last name" +msgstr "nom" + +msgid "email address" +msgstr "adresse électronique" + +msgid "staff status" +msgstr "statut équipe" + +msgid "Designates whether the user can log into this admin site." +msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration." + +msgid "active" +msgstr "actif" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Précise si l'utilisateur doit être considéré comme actif. Décochez ceci " +"plutôt que de supprimer le compte." + +msgid "date joined" +msgstr "date d'inscription" + +msgid "user" +msgstr "utilisateur" + +msgid "users" +msgstr "utilisateurs" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Ce mot de passe est trop court. Il doit contenir au minimum %(min_length)d " +"caractère." +msgstr[1] "" +"Ce mot de passe est trop court. Il doit contenir au minimum %(min_length)d " +"caractères." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +"Votre mot de passe doit contenir au minimum %(min_length)d caractère." +msgstr[1] "" +"Votre mot de passe doit contenir au minimum %(min_length)d caractères." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Le mot de passe est trop semblable au champ « %(verbose_name)s »." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Votre mot de passe ne peut pas trop ressembler à vos autres informations " +"personnelles." + +msgid "This password is too common." +msgstr "Ce mot de passe est trop courant." + +msgid "Your password can't be a commonly used password." +msgstr "" +"Votre mot de passe ne peut pas être un mot de passe couramment utilisé." + +msgid "This password is entirely numeric." +msgstr "Ce mot de passe est entièrement numérique." + +msgid "Your password can't be entirely numeric." +msgstr "Votre mot de passe ne peut pas être entièrement numérique." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Réinitialisation du mot de passe sur %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Saisissez un nom d'utilisateur valide. Il ne peut contenir que des lettres " +"non accentuées, des nombres ou les caractères « @ », « . », « + », « - » et " +"« _ »." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Saisissez un nom d'utilisateur valide. Il ne peut contenir que des lettres, " +"des nombres ou les caractères « @ », « . », « + », « - » et « _ »." + +msgid "Logged out" +msgstr "Déconnecté" + +msgid "Password reset" +msgstr "Réinitialisation du mot de passe" + +msgid "Password reset sent" +msgstr "Message de réinitialisation du mot de passe envoyé" + +msgid "Enter new password" +msgstr "Saisissez un nouveau mot de passe" + +msgid "Password reset unsuccessful" +msgstr "Échec lors de la mise à jour du mot de passe" + +msgid "Password reset complete" +msgstr "Mise à jour du mot de passe terminée" + +msgid "Password change" +msgstr "Modification du mot de passe" + +msgid "Password change successful" +msgstr "Mot de passe modifié avec succès" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2331e0e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/fy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3221b18 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.po new file mode 100644 index 0000000..a91375a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ga/LC_MESSAGES/django.po @@ -0,0 +1,298 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Michael Thornhill , 2012,2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ga\n" +"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " +"4);\n" + +msgid "Personal info" +msgstr "Eolas pearsantach" + +msgid "Permissions" +msgstr "Ceada" + +msgid "Important dates" +msgstr "Dáta tábhactach" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "Focal faire aithraithe rathúil" + +#, python-format +msgid "Change password: %s" +msgstr "Athraigh focal faire: %s" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "focal faire" + +msgid "last login" +msgstr "logáil deirneach" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "Níl an dá focla faire comhoiriúnigh" + +msgid "Password" +msgstr "Focal faire" + +msgid "Password confirmation" +msgstr "Focal faire deimhniú" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "Tá an cuntas seo neamhghníomhach." + +msgid "Email" +msgstr "Ríomhphost" + +msgid "New password" +msgstr "Focal faire nua" + +msgid "New password confirmation" +msgstr "Deimnhiú focal faire nua" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Cuireadh do sean-focal faire isteach go mícheart. Iontráil isteach é arís." + +msgid "Old password" +msgstr "Sean-focal faire " + +msgid "Password (again)" +msgstr "Focal faire (arís)" + +msgid "algorithm" +msgstr "algartam" + +msgid "iterations" +msgstr "atriallta" + +msgid "salt" +msgstr "salann" + +msgid "hash" +msgstr "haiseáil" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "fachtóir oibre" + +msgid "checksum" +msgstr "suim sheiceála" + +msgid "name" +msgstr "ainm" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "Ainm cód" + +msgid "permission" +msgstr "cead" + +msgid "permissions" +msgstr "ceada" + +msgid "group" +msgstr "grúpa" + +msgid "groups" +msgstr "grúpa" + +msgid "superuser status" +msgstr "stádas forúsáideoir" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Sainíonn go bhfuil gach ceada ag an úsáideoir seo gan iad a cur le go " +"díreach." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "ceada úsáideoira" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "Ainm úsáideoir" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "In ann do úsáideoir leis an ainm úsáideora." + +msgid "first name" +msgstr "ainm baiste" + +msgid "last name" +msgstr "sloinne" + +msgid "email address" +msgstr "seoladh r-phoist" + +msgid "staff status" +msgstr "stádas foirne" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Sainigh an bhfuil cead ag an úsáideoir logáil isteach go dtí an suíomh " +"riaracháin seo." + +msgid "active" +msgstr "gníomhach" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Sainíonn an bhfuil an úsáideoir gníomhach. Míroghnaigh seo in aineonn de " +"scriseadh cuntasí." + +msgid "date joined" +msgstr "Dáta teacht isteach" + +msgid "user" +msgstr "úsáideoir" + +msgid "users" +msgstr "úsáideora" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Athshocraigh focal faire ar %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "Logáilte amach" + +msgid "Password reset" +msgstr "Pasfhocal athshocrú" + +msgid "Password reset sent" +msgstr "Pasfhocal athshocrú sheoladh" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gd/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gd/LC_MESSAGES/django.po new file mode 100644 index 0000000..7155f24 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gd/LC_MESSAGES/django.po @@ -0,0 +1,333 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# GunChleoc, 2015-2017 +# GunChleoc, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-10-04 18:25+0000\n" +"Last-Translator: GunChleoc\n" +"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" +"language/gd/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gd\n" +"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" + +msgid "Personal info" +msgstr "Fiosrachadh pearsanta" + +msgid "Permissions" +msgstr "Ceadan" + +msgid "Important dates" +msgstr "Cinn-là chudromach" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Chan eil oibseact %(name)s air a bheil prìomh-iuchair %(key)r ann." + +msgid "Password changed successfully." +msgstr "Chaidh am facal-faire atharrachadh gu soirbheachail." + +#, python-format +msgid "Change password: %s" +msgstr "Atharraich am facal-faire: %s" + +msgid "Authentication and Authorization" +msgstr "Dearbhadh is ùghdarrachadh" + +msgid "password" +msgstr "facal-faire" + +msgid "last login" +msgstr "an clàradh a-steach mu dheireadh" + +msgid "No password set." +msgstr "Cha deach facal-faire a shuidheachadh." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" +"Tha fòrmat mì-dhligheach air an fhacal-fhaire no chan aithne dhuinn algairim " +"a’ hais." + +msgid "The two password fields didn't match." +msgstr "Cha robh an dà fhacal-faire co-ionnann." + +msgid "Password" +msgstr "Facal-faire" + +msgid "Password confirmation" +msgstr "Dearbhadh an fhacail-fhaire" + +msgid "Enter the same password as before, for verification." +msgstr "Cuir an t-aon fhacal-faire a-steach a-rithist gus a dhearbhadh." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Cha dèid faclan-faire amh a shàbhaladh ’s mar sin chan eil dòigh ann gus " +"facal-faire a’ chleachdaiche seo a shealltainn. ’S urrainn dhut am facal-" +"faire atharrachadh co-dhiù leis an fhoirm seo." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Cuir a-steach %(username)s agus facal-faire ceart. Thoir an aire gum bi aire " +"do litrichean mòra ’s beaga air an dà raon, ma dh’fhaoidte." + +msgid "This account is inactive." +msgstr "Chan eil an cunntas seo gnìomhach." + +msgid "Email" +msgstr "Post-d" + +msgid "New password" +msgstr "Facal-faire ùr" + +msgid "New password confirmation" +msgstr "Dearbhadh an fhacail-fhaire ùir" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Cha do chuir thu an seann fhacal-faire a-steach mar bu chòir. Cuir a-steach " +"e a-rithist." + +msgid "Old password" +msgstr "An seann fhacal-faire" + +msgid "Password (again)" +msgstr "Facal-faire (a-rithist)" + +msgid "algorithm" +msgstr "algairim" + +msgid "iterations" +msgstr "ath-thriallan" + +msgid "salt" +msgstr "salann" + +msgid "hash" +msgstr "hais" + +msgid "variety" +msgstr "eug-samhail" + +msgid "version" +msgstr "tionndadh" + +msgid "memory cost" +msgstr "cosgais cuimhne" + +msgid "time cost" +msgstr "cosgais ùine" + +msgid "parallelism" +msgstr "co-shìneadh" + +msgid "work factor" +msgstr "factar obrachaidh" + +msgid "checksum" +msgstr "àireamh dhearbhaidh" + +msgid "name" +msgstr "ainm" + +msgid "content type" +msgstr "seòrsa susbainte" + +msgid "codename" +msgstr "ainm-còd" + +msgid "permission" +msgstr "cead" + +msgid "permissions" +msgstr "ceadan" + +msgid "group" +msgstr "buidheann" + +msgid "groups" +msgstr "buidhnean" + +msgid "superuser status" +msgstr "staid superuser" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Iomruinidh seo gu bheil a h-uile aig a’ chleachdaiche seo gun a bhith ’gan " +"iomruineadh fa leth." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Am buidheann ris a bhuineas an cleachdaiche seo. Gheibh cleachdaiche a h-" +"uile cead a chaidh a thoirt dha ghin dhe na buidhnean aige." + +msgid "user permissions" +msgstr "ceadan a’ chleachdaiche" + +msgid "Specific permissions for this user." +msgstr "Ceadan sònraichte airson a’ chleachdaiche seo." + +msgid "username" +msgstr "ainm-cleachdaiche" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Riatanach. 150 caractar air a char as motha. Litrichean, àireamhan agus @/./" +"+/-/_ a-mhàin." + +msgid "A user with that username already exists." +msgstr "Tha cleachdaiche air a bheil an t-ainm-cleachdaiche seo ann mar-tha." + +msgid "first name" +msgstr "ainm" + +msgid "last name" +msgstr "sloinneadh" + +msgid "email address" +msgstr "seòladh puist-d" + +msgid "staff status" +msgstr "inbhe luchd-obrach" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Iomruinidh seo an urrainn dhan chleachdaiche seo clàradh a-steach gu làrach " +"nan rianairean gus nach urrainn." + +msgid "active" +msgstr "staid ghnìomhach" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Iomruinidh seo an dèid dèiligeadh ris a’ cleachdaiche seo mar fhear " +"gnìomhach gus nach dèid. Neo-thagh seo seach an cunntas a sguabadh às." + +msgid "date joined" +msgstr "fhuair e ballrachd" + +msgid "user" +msgstr "cleachdaiche" + +msgid "users" +msgstr "cleachdaichean" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Tha am facal-faire seo ro ghoirid. Feumaidh %(min_length)d charactar a bhith " +"ann air a char as lugha." +msgstr[1] "" +"Tha am facal-faire seo ro ghoirid. Feumaidh %(min_length)d charactar a bhith " +"ann air a char as lugha." +msgstr[2] "" +"Tha am facal-faire seo ro ghoirid. Feumaidh %(min_length)d caractaran a " +"bhith ann air a char as lugha." +msgstr[3] "" +"Tha am facal-faire seo ro ghoirid. Feumaidh %(min_length)d caractar a bhith " +"ann air a char as lugha." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +"Feumaidh %(min_length)d charactar a bhith san fhacal-fhaire agad air a char " +"as lugha." +msgstr[1] "" +"Feumaidh %(min_length)d charactar a bhith san fhacal-fhaire agad air a char " +"as lugha." +msgstr[2] "" +"Feumaidh %(min_length)d caractaran a bhith san fhacal-fhaire agad air a char " +"as lugha." +msgstr[3] "" +"Feumaidh %(min_length)d caractar a bhith san fhacal-fhaire agad air a char " +"as lugha." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Tha am facal-faire agad ro choltach ri %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Chan fhaod am facal-faire agad a bhith ro choltach ris an fhiosrachadh " +"phearsanta eile agad." + +msgid "This password is too common." +msgstr "Tha am facal-faire seo ro chumanta." + +msgid "Your password can't be a commonly used password." +msgstr "" +"Chan fhaod thu facal-faire a chleachdadh a chleachd mòran daoine mar-thà." + +msgid "This password is entirely numeric." +msgstr "Chan eil ach àireamhan san fhacal-fhaire seo.ac" + +msgid "Your password can't be entirely numeric." +msgstr "" +"Feumaidh caractaran a bhith san fhacal-fhaire agad nach eil ’nan àireamhan." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Ath-shuidheachadh an fhacail-fhaire air %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Cuir a-steach ainm-cleachdaiche dligheach. Chan fhaod ach litrichean gun " +"sràcan, àireamhan is caractaran @/./+/-/_ a bhith ’na bhroinn." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Cuir a-steach ainm-cleachdaiche dligheach. Chan fhaod ach litrichean, " +"àireamhan is caractaran @/./+/-/_ a bhith ’na bhroinn." + +msgid "Logged out" +msgstr "Air a clàradh a-mach" + +msgid "Password reset" +msgstr "Ath-shuidheachadh an fhacail-fhaire" + +msgid "Password reset sent" +msgstr "Chaidh ath-shuidheachadh an fhacail-fhaire a chur" + +msgid "Enter new password" +msgstr "Cuir a-steach facal-faire ùr" + +msgid "Password reset unsuccessful" +msgstr "Cha deach le ath-shuidheachadh an facail-faire" + +msgid "Password reset complete" +msgstr "Tha ath-shuidheachadh an fhacail-fhaire deiseil" + +msgid "Password change" +msgstr "Atharrachadh an facail-fhaire" + +msgid "Password change successful" +msgstr "Chaidh am facal-faire atharrachadh gu soirbheachail" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..770942b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7b376cb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..588ad7a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,312 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-27 20:07+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Personal info" +msgstr "Wosobinske informacije" + +msgid "Permissions" +msgstr "Prawa" + +msgid "Important dates" +msgstr "Wažne daty" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Objekt %(name)s z primarnym klučom %(key)r njeeksistuje." + +msgid "Password changed successfully." +msgstr "Hesło je so wuspěšnje změniło." + +#, python-format +msgid "Change password: %s" +msgstr "Hesło změnić: %s" + +msgid "Authentication and Authorization" +msgstr "Awtentifikacija a awtorizacija" + +msgid "password" +msgstr "hesło" + +msgid "last login" +msgstr "poslednje přizjewjenje" + +msgid "No password set." +msgstr "Žane hesło nastajene." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Njepłaćiwy hesłowy format abo njeznaty kontrolny algoritmus." + +msgid "The two password fields didn't match." +msgstr "Hesle jednak njejstej." + +msgid "Password" +msgstr "Hesło" + +msgid "Password confirmation" +msgstr "Hesłowe wobkrućenje" + +msgid "Enter the same password as before, for verification." +msgstr "Zapodajće samsne hesło kaž do toho, za přepruwowanje." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Hrube hesła so njeskładuja, tohodla njeje móžno, hesło wužiwarja widźeć, ale " +"móžeće hesło z pomocu tutoho formulara změnić." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Prošu zapodajće korektne %(username)s a hesło. Dźiwajće na to, zo wobě poli " +"móžetej mjez wulko- a małopisanjom rozeznawać." + +msgid "This account is inactive." +msgstr "Tute konto je inaktiwne." + +msgid "Email" +msgstr "E-mejl" + +msgid "New password" +msgstr "Nowe hesło" + +msgid "New password confirmation" +msgstr "Wobkrućenje noweho hesła" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Waše stare hesło je so wopak zapodało. Prošu zapodajće jo hišće raz." + +msgid "Old password" +msgstr "Stare hesło" + +msgid "Password (again)" +msgstr "Hesło (znowa)" + +msgid "algorithm" +msgstr "algoritmus" + +msgid "iterations" +msgstr "wospjetowanja" + +msgid "salt" +msgstr "sól" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "warianta" + +msgid "version" +msgstr "wersija" + +msgid "memory cost" +msgstr "Składowa přetrjeba" + +msgid "time cost" +msgstr "Časowa přetrjeba" + +msgid "parallelism" +msgstr "paralelizm" + +msgid "work factor" +msgstr "dźěłowy faktor" + +msgid "checksum" +msgstr "pruwowanska suma" + +msgid "name" +msgstr "mjeno" + +msgid "content type" +msgstr "wobsahowy typ" + +msgid "codename" +msgstr "kodowe mjeno" + +msgid "permission" +msgstr "prawo" + +msgid "permissions" +msgstr "prawa" + +msgid "group" +msgstr "skupina" + +msgid "groups" +msgstr "skupiny" + +msgid "superuser status" +msgstr "status superwužiwarja" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Woznamjenja, zo tutón wužiwar ma wšě prawa bjez toho, zo by móhł je " +"eksplicitnje připokazać." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Skupiny, ke kotrymž wužiwar słuša. Wužiwar dóstanje wšě prawa, kotrež jemu " +"skupiny dawaja." + +msgid "user permissions" +msgstr "wužiwarske prawa" + +msgid "Specific permissions for this user." +msgstr "Wěste prawa za tutoho wužiwarja." + +msgid "username" +msgstr "wužiwarske mjeno" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Trěbne. 150 znamješkow abo mjenje. Jenož pismiki, cyfry a @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Wužiwar z tutym mjenom hižo eksistuje." + +msgid "first name" +msgstr "předmjeno" + +msgid "last name" +msgstr "swójbne mjeno" + +msgid "email address" +msgstr "e-mejlowa adresa" + +msgid "staff status" +msgstr "personalny status" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Woznamjenja, hač wužiwar móže so pola administratoroweho sydła přizjewić." + +msgid "active" +msgstr "aktiwny" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Woznamjenja, hač maja z wužiwarjom jako aktiwnym wobchadźeć. Znjemóžńće to " +"město toho, zo byšće konto zhašał." + +msgid "date joined" +msgstr "čłon wot" + +msgid "user" +msgstr "wužiwar" + +msgid "users" +msgstr "wužiwarjo" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Tute hesło je překrótke. Dyrbi znajmjeńša %(min_length)d znamješko " +"wobsahować." +msgstr[1] "" +"Tute hesło je překrótke. Dyrbi znajmjeńša %(min_length)d znamješce " +"wobsahować." +msgstr[2] "" +"Tute hesło je překrótke. Dyrbi znajmjeńša %(min_length)d znamješka " +"wobsahować." +msgstr[3] "" +"Tute hesło je překrótke. Dyrbi znajmjeńša %(min_length)d znamješkow " +"wobsahować." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Waše hesło dyrbi znajmjeńša %(min_length)d znamješko měć." +msgstr[1] "Waše hesło dyrbi znajmjeńša %(min_length)d znamješce měć." +msgstr[2] "Waše hesło dyrbi znajmjeńša %(min_length)d znamješka měć." +msgstr[3] "Waše hesło dyrbi znajmjeńša %(min_length)d znamješkow měć." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Hesło je na %(verbose_name)s přepodobne." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Waše hesło njesmě wašim druhim wosobinskim datam podobne być." + +msgid "This password is too common." +msgstr "Tute hesło je přehuste," + +msgid "Your password can't be a commonly used password." +msgstr "Waše hesło njemóže husto wužiwane hesło być." + +msgid "This password is entirely numeric." +msgstr "Tute hesło je cyle numeriske." + +msgid "Your password can't be entirely numeric." +msgstr "Waše hesło njemóže cyle numeriske być." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Hesło je so na %(site_name)s wróćo stajiło." + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Zapodajće płaćiwe wužiwarske mjeno. Tuta hódnota smě jenož jendźelske " +"pismiki, ličby a znamješka @/./+/-/_ wobsahować." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Zapodajće płaćiwe wužiwarske mjeno. Tuta hódnota smě jenož pismiki, ličby a " +"znamješka @/./+/-/_ wobsahować." + +msgid "Logged out" +msgstr "Wotzjewjeny" + +msgid "Password reset" +msgstr "Wróćostajenje hesła" + +msgid "Password reset sent" +msgstr "Wróćostajenje hesła jo se wotpósłało." + +msgid "Enter new password" +msgstr "Zapodajće nowe hesło" + +msgid "Password reset unsuccessful" +msgstr "Wróćostajenje hesła njeje so poradźiło" + +msgid "Password reset complete" +msgstr "Wróćostajenje hesła je zakónčene" + +msgid "Password change" +msgstr "Změnjenje hesła" + +msgid "Password change successful" +msgstr "Hesło je so wuspěšnje změniło" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ee1161a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..1876370 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,308 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016-2017 +# Jannis Leidel , 2011 +# János R (Hangya), 2014 +# Szilveszter Farkas , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-24 13:37+0000\n" +"Last-Translator: András Veres-Szentkirályi\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Személyes információ" + +msgid "Permissions" +msgstr "Jogosultságok" + +msgid "Important dates" +msgstr "Fontos dátumok" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s objektum %(key)r elsődleges kulccsal nem létezik." + +msgid "Password changed successfully." +msgstr "Sikeres jelszóváltoztatás." + +#, python-format +msgid "Change password: %s" +msgstr "Jelszó megváltoztatása: %s" + +msgid "Authentication and Authorization" +msgstr "Hitelesítés és engedélyezés" + +msgid "password" +msgstr "jelszó" + +msgid "last login" +msgstr "utolsó bejelentkezés" + +msgid "No password set." +msgstr "Nincs jelszó beállítva." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Érvénytelen jelszóformátum vagy ismeretlen hash-algoritmus." + +msgid "The two password fields didn't match." +msgstr "A két jelszó mező tartalma nem egyezik meg." + +msgid "Password" +msgstr "Jelszó" + +msgid "Password confirmation" +msgstr "Jelszó megerősítése" + +msgid "Enter the same password as before, for verification." +msgstr "Írja be az előbb megadott jelszót, ellenőrzés céljából." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"A kódolatlan jelszavakat nem tároljuk, így a felhasználó jelszavát nem lehet " +"megtekinteni, azonban ezzel az űrlappal a jelszó " +"megváltoztatható." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Írjon be egy helyes %(username)s és jelszót. Mindkét mező kisbetű-nagybetű " +"érzékeny lehet." + +msgid "This account is inactive." +msgstr "Ez a fiók inaktív." + +msgid "Email" +msgstr "E-mail" + +msgid "New password" +msgstr "Új jelszó" + +msgid "New password confirmation" +msgstr "Új jelszó megerősítése" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "A régi jelszó hibásan lett megadva. Írja be újra." + +msgid "Old password" +msgstr "Régi jelszó" + +msgid "Password (again)" +msgstr "Jelszó újra" + +msgid "algorithm" +msgstr "algoritmus" + +msgid "iterations" +msgstr "iterációk" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "változat" + +msgid "version" +msgstr "verzió" + +msgid "memory cost" +msgstr "memória költség" + +msgid "time cost" +msgstr "idő költség" + +msgid "parallelism" +msgstr "párhuzamosság" + +msgid "work factor" +msgstr "erősség" + +msgid "checksum" +msgstr "ellenőrző összeg" + +msgid "name" +msgstr "név" + +msgid "content type" +msgstr "tartalom típusa" + +msgid "codename" +msgstr "kódnév" + +msgid "permission" +msgstr "jogosultság" + +msgid "permissions" +msgstr "jogosultságok" + +msgid "group" +msgstr "csoport" + +msgid "groups" +msgstr "csoportok" + +msgid "superuser status" +msgstr "rendszergazda státusz" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Megadja, hogy ez a felhasználó rendelkezik-e minden jogosultsággal anélkül, " +"hogy azt külön meg kellene adni." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"A csoportok, amelyekhez a felhasználó tartozik. A felhasználó minden egyes " +"csoportja jogosultságaival rendelkezni fog." + +msgid "user permissions" +msgstr "felhasználói jogosultságok" + +msgid "Specific permissions for this user." +msgstr "A felhasználó egyedi jogosultságai." + +msgid "username" +msgstr "felhasználónév" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Kötelező. Legfeljebb 150 karakter. Betűk, számok és @/./+/-/_ karakterek." + +msgid "A user with that username already exists." +msgstr "Létezik már egy felhasználó ezzel a névvel." + +msgid "first name" +msgstr "keresztnév" + +msgid "last name" +msgstr "vezetéknév" + +msgid "email address" +msgstr "e-mail cím" + +msgid "staff status" +msgstr "személyzet státusz" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Megadja, hogy a felhasználó bejelentkezhet-e erre az adminisztrációs oldalra." + +msgid "active" +msgstr "aktív" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Megadja, hogy a felhasználó aktív-e. Állítsa át ezt az értéket a fiók " +"törlése helyett." + +msgid "date joined" +msgstr "csatlakozás dátuma" + +msgid "user" +msgstr "felhasználó" + +msgid "users" +msgstr "felhasználók" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Ez a jelszó túl rövid. Legalább %(min_length)d karakter hosszú legyen." +msgstr[1] "" +"Ez a jelszó túl rövid. Legalább %(min_length)d karakter hosszú legyen." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +"A jelszavának legalább %(min_length)d karakter hosszúnak kell lennie." +msgstr[1] "" +"A jelszavának legalább %(min_length)d karakter hosszúnak kell lennie." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "A jelszava túlságosan hasonlít a következőhöz: %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "A jelszava nem lehet túlságosan hasonló egyéb személyes adataihoz." + +msgid "This password is too common." +msgstr "Ez a jelszó túlságosan gyakori." + +msgid "Your password can't be a commonly used password." +msgstr "A jelszava nem lehet gyakran használt jelszó." + +msgid "This password is entirely numeric." +msgstr "A jelszava kizárólag számjegyekből áll." + +msgid "Your password can't be entirely numeric." +msgstr "A jelszava nem állhat kizárólag számjegyekből." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Jelszó újragenerálása ezen az oldalon: %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Írjon be egy érvényes felhasználónevet, mely csak ékezetmentes betűket, " +"számokat és @/./+/-/_ karaktereket tartalmazhat." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Írjon be egy érvényes felhasználónevet, mely csak betűket, számokat és @/./" +"+/-/_ karaktereket tartalmazhat." + +msgid "Logged out" +msgstr "Kijelentkezve" + +msgid "Password reset" +msgstr "Jelszó újragenerálása" + +msgid "Password reset sent" +msgstr "Jelszó beállítás infók elküldve" + +msgid "Enter new password" +msgstr "Írja be az új jelszavát" + +msgid "Password reset unsuccessful" +msgstr "Jelszó beállítása sikertelen" + +msgid "Password reset complete" +msgstr "Jelszó beállítása kész" + +msgid "Password change" +msgstr "Jelszó megváltoztatása" + +msgid "Password change successful" +msgstr "Sikeres jelszóváltoztatás" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9ca530a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/hy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..818ec61 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..b014468 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,313 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Federico Capoano , 2011 +# Flavio Curella , 2013-2014 +# Jannis Leidel , 2011 +# Luciano De Falco Alfano, 2016 +# Marco Bonetti, 2014 +# palmux , 2015 +# Mattia Procopio , 2015 +# Stefano Brentegani , 2015,2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-16 13:37+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Informazioni personali" + +msgid "Permissions" +msgstr "Permessi" + +msgid "Important dates" +msgstr "Date importanti" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "L'oggetto %(name)s con chiave primaria %(key)r non esiste." + +msgid "Password changed successfully." +msgstr "La password è stata modificata correttamente." + +#, python-format +msgid "Change password: %s" +msgstr "Modifica la password: %s" + +msgid "Authentication and Authorization" +msgstr "Autenticazione e Autorizzazione " + +msgid "password" +msgstr "password" + +msgid "last login" +msgstr "ultimo accesso" + +msgid "No password set." +msgstr "Nessuna password impostata." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Formato di password non valido o algoritmo di hash sconosciuto." + +msgid "The two password fields didn't match." +msgstr "I due campi password non corrispondono." + +msgid "Password" +msgstr "Password" + +msgid "Password confirmation" +msgstr "Conferma password" + +msgid "Enter the same password as before, for verification." +msgstr "Inserisci la stessa password inserita sopra, come verifica." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Le password non vengono conservate nella forma originale, quindi non è " +"possibile visualizzare la password di questo utente, ma è possibile " +"cambiarla usando questo modulo." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Inserisci %(username)s e password corretti. In entrambi i campi le maiuscole " +"potrebbero essere significative." + +msgid "This account is inactive." +msgstr "Questo account non è attivo." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Nuova password" + +msgid "New password confirmation" +msgstr "Conferma nuova password" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"La password attuale non è stata inserita correttamente. Riprova per favore." + +msgid "Old password" +msgstr "Password attuale" + +msgid "Password (again)" +msgstr "Password (di nuovo)" + +msgid "algorithm" +msgstr "algoritmo" + +msgid "iterations" +msgstr "iterazioni" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "varietà" + +msgid "version" +msgstr "versione" + +msgid "memory cost" +msgstr "impegno di memoria" + +msgid "time cost" +msgstr "impiego di tempo" + +msgid "parallelism" +msgstr "parallelismo" + +msgid "work factor" +msgstr "work factor" + +msgid "checksum" +msgstr "checksum" + +msgid "name" +msgstr "nome" + +msgid "content type" +msgstr "content type" + +msgid "codename" +msgstr "nome in codice" + +msgid "permission" +msgstr "permesso" + +msgid "permissions" +msgstr "permessi" + +msgid "group" +msgstr "gruppo" + +msgid "groups" +msgstr "gruppi" + +msgid "superuser status" +msgstr "privilegi di superutente" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Attribuisce all'utente tutti i privilegi, senza che sia necessario " +"assegnarli esplicitamente." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"I gruppi a cui appartiene l'utente. L'utente eredita tutti i permessi " +"assegnati a ciascuno dei suoi gruppi." + +msgid "user permissions" +msgstr "privilegi utente" + +msgid "Specific permissions for this user." +msgstr "Permessi specifici per questo utente." + +msgid "username" +msgstr "nome utente" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Obbligatorio. 150 caratteri o meno.Solo lettere, cifre e @/./+/-/_" + +msgid "A user with that username already exists." +msgstr "Un utente con questo nome è già presente." + +msgid "first name" +msgstr "nome" + +msgid "last name" +msgstr "cognome" + +msgid "email address" +msgstr "indirizzo email" + +msgid "staff status" +msgstr "privilegi di staff" + +msgid "Designates whether the user can log into this admin site." +msgstr "Stabilisce se l'utente può accedere a questo sito di amministrazione." + +msgid "active" +msgstr "attivo" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Stabilisce se l'utente debba essere considerato attivo. Deseleziona qui, " +"piuttosto che cancellare gli account." + +msgid "date joined" +msgstr "iscritto in data" + +msgid "user" +msgstr "utente" + +msgid "users" +msgstr "utenti" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Questa password è troppo corta. Deve contenere almeno %(min_length)d " +"carattere." +msgstr[1] "" +"Questa password è troppo corta. Deve contenere almeno %(min_length)d " +"caratteri." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "La tua password deve contenere almeno %(min_length)d carattere." +msgstr[1] "La tua password deve contenere almeno %(min_length)d caratteri." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "La password è troppo simile a %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"La tua password non può essere troppo simile alle altre tue informazioni " +"personali." + +msgid "This password is too common." +msgstr "Questa password è troppo comune." + +msgid "Your password can't be a commonly used password." +msgstr "La tua password non può essere una password comunemente usata." + +msgid "This password is entirely numeric." +msgstr "Questa password è interamente numerica." + +msgid "Your password can't be entirely numeric." +msgstr "La tua password non può essere interamente numerica." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Password reset su %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Immetti un nome utente valido. Questo campo può contenere solo lettere " +"dell'alfabeto inglese, numeri e caratteri @/./+/-/_ ." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Immetti un nome utente valido. Questo campo può contenere solo lettere " +"dell'alfabeto inglese, numeri e caratteri @/./+/-/_ ." + +msgid "Logged out" +msgstr "Accesso annullato" + +msgid "Password reset" +msgstr "Reimposta la password" + +msgid "Password reset sent" +msgstr "Istruzioni per il recupero della password inviate" + +msgid "Enter new password" +msgstr "Inserisci la nuova password" + +msgid "Password reset unsuccessful" +msgstr "Password non reimpostata" + +msgid "Password reset complete" +msgstr "Password reimpostata" + +msgid "Password change" +msgstr "Modifica password" + +msgid "Password change successful" +msgstr "Password modificata correttamente" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..347ed66 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,300 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013-2015 +# Jannis Leidel , 2011 +# Tornike Beradze , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2018-02-07 12:11+0000\n" +"Last-Translator: Tornike Beradze \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Personal info" +msgstr "პირადი ინფორმაცია" + +msgid "Permissions" +msgstr "უფლებები" + +msgid "Important dates" +msgstr "მნიშვნელოვანი თარიღები" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s ობიექტი პირველადი გასაღებით %(key)r არ არსებობს." + +msgid "Password changed successfully." +msgstr "პაროლი წარმატებით შეიცვალა." + +#, python-format +msgid "Change password: %s" +msgstr "შევცვალოთ პაროლი: %s" + +msgid "Authentication and Authorization" +msgstr "იდენტიფიკაცია და ავტორიზაცია" + +msgid "password" +msgstr "პაროლი" + +msgid "last login" +msgstr "ბოლო შესვლა" + +msgid "No password set." +msgstr "არ არის დაყენებული პაროლი." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "არასწორი პაროლის ფორმატი ან უცნობი ჰეშირების ალგორითმი." + +msgid "The two password fields didn't match." +msgstr "პაროლის ორი ველი ერთმანეთს არ ემთხვევა." + +msgid "Password" +msgstr "პაროლი" + +msgid "Password confirmation" +msgstr "პაროლის დამოწმება" + +msgid "Enter the same password as before, for verification." +msgstr "გაიმეორეთ იგივე პაროლი ვერიფიკაციისთვის." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"მომხმარებლის პაროლი პირდაპ არ ინახება ბაზაში, ამიტომ მისი ნახვა შეუძლებელია, " +"მაგრამ შეგიძლიათ შეცვალოთ ამ ფორმით." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"გთხოვთ, შეიყვანოთ სწორი %(username)s და პაროლი. იქონიეთ მხედველობაში, რომ " +"ორივე ველი ითვალისწინებს მთავრულს." + +msgid "This account is inactive." +msgstr "თქვენი ანგარიში არააქტიურია." + +msgid "Email" +msgstr "ელ. ფოსტა" + +msgid "New password" +msgstr "ახალი პაროლი" + +msgid "New password confirmation" +msgstr "ახალი პაროლის დამოწმება" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "თქვენი ძველი პაროლი შეყვანილია არასწორად. გთხოვთ, შეიყვანოთ ხელახლა." + +msgid "Old password" +msgstr "ძველი პაროლი" + +msgid "Password (again)" +msgstr "პაროლი (განმეორებით)" + +msgid "algorithm" +msgstr "ალგორითმი" + +msgid "iterations" +msgstr "იტერაციები" + +msgid "salt" +msgstr "მარილი" + +msgid "hash" +msgstr "ჰეში" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "ვერსია" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "პარალელიზმი" + +msgid "work factor" +msgstr "სამუშაო ფაქტორი" + +msgid "checksum" +msgstr "საკონტროლო ჯამი" + +msgid "name" +msgstr "სახელი" + +msgid "content type" +msgstr "კონტენტის ტიპი" + +msgid "codename" +msgstr "კოდური სახელი" + +msgid "permission" +msgstr "უფლება" + +msgid "permissions" +msgstr "უფლებები" + +msgid "group" +msgstr "ჯგუფი" + +msgid "groups" +msgstr "ჯგუფები" + +msgid "superuser status" +msgstr "სუპერმომხმარებლის სტატუსი" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "განსაზღვრავს, რომ ამ მომხმარებელს აქვს ყველა უფლება." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"ჯგუფები, რომლებსაც მიეკუთვნება ეს მომხმარებელი. მომხმარებელი მიიღებს ყველა " +"უფლებას, რომელიც მინიჭებული აქვს მის თითოეულ ჯგუფს." + +msgid "user permissions" +msgstr "მომხმარებლის უფლებები" + +msgid "Specific permissions for this user." +msgstr "სპეციფიური უფლებები ამ მომხმარებლისთვის." + +msgid "username" +msgstr "მომხმარებლის სახელი" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"აუცილებელი. 150 სიმბოლ ან ნაკლები. მხოლოდ ასოები, ციფრები ან @/./+/-/_ ." + +msgid "A user with that username already exists." +msgstr "მომხმარებელი ამ სახელით უკვე არსებობს." + +msgid "first name" +msgstr "სახელი" + +msgid "last name" +msgstr "გვარი" + +msgid "email address" +msgstr "ელ. ფოსტის მისამართი" + +msgid "staff status" +msgstr "თანამშრომლობის სტატუსი" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"განსაზღვრავს, აქვს თუ არა მომხმარებელს ადმინისტრირების საიტზე შესვლის უფლება." + +msgid "active" +msgstr "აქტიურია" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"განსაზღვრავს, რომ მომხმარებელი გააქტიურებულია. მომხმარებლის წაშლის მაგივრად " +"გადანიშნეთ ეს დროშა." + +msgid "date joined" +msgstr "გაწევრიანების თარიღი" + +msgid "user" +msgstr "მომხმარებელი" + +msgid "users" +msgstr "მომხმარებლები" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"პაროლი ძალიან მოკლეა. მინიმუმ %(min_length)dსიმბოლოს უნდა შეიცავდეს." +msgstr[1] "" +"პაროლი ძალიან მოკლეა. მინიმუმ %(min_length)dსიმბოლოს უნდა შეიცავდეს." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +"პაროლი ძალიან მოკლეა. მინიმუმ %(min_length)d სიმბოლოს უნდა შეიცავდეს." +msgstr[1] "" +"პაროლი ძალიან მოკლეა. მინიმუმ %(min_length)d სიმბოლოს უნდა შეიცავდეს." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "პაროლი ძალიან გავს %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "პაროლი ძალიან გავს თქვენს პერსონალურ ინფორმაციას." + +msgid "This password is too common." +msgstr "ეს პაროლი ხშირად გამოიყენება." + +msgid "Your password can't be a commonly used password." +msgstr "თქვენი პაროლი არ უნდა იყოს ხშირად გამოყენებადი." + +msgid "This password is entirely numeric." +msgstr "პაროლი მხოლოდ ციფრებისგან შედგება." + +msgid "Your password can't be entirely numeric." +msgstr "თქვენი პაროლი არ შეიძლება შეიცავდეს მხოლოდ ციფრებს." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "პაროლის თავიდან დაყენება %(site_name)s-ზე" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "გამოსული ხართ" + +msgid "Password reset" +msgstr "პაროლის აღდგენა" + +msgid "Password reset sent" +msgstr "პაროლის აღდგენა გაგზავნილია" + +msgid "Enter new password" +msgstr "შეიყვანეთ ახალი პაროლი" + +msgid "Password reset unsuccessful" +msgstr "პაროლის აღდგენა წარუმატებლად დასრულდა" + +msgid "Password reset complete" +msgstr "პაროლის აღდგენა დასრულებულია" + +msgid "Password change" +msgstr "პაროლის შეცვლა" + +msgid "Password change successful" +msgstr "პაროლი წარმატებით შეიცვალა" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3333309 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..7456e93 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,287 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-10-06 11:56+0000\n" +"Last-Translator: Muḥend Belqasem \n" +"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" +"kab/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kab\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Talɣut tudmawant" + +msgid "Permissions" +msgstr "Tisirag" + +msgid "Important dates" +msgstr "Izemzen ixataren" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "Snifel awal uffir: %s" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "awal uffir" + +msgid "last login" +msgstr "tuqqna taneggarut" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "Awal n uɛeddi" + +msgid "Password confirmation" +msgstr "Asentem n wawal uffir" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "Amidan-agi ur yermid ara." + +msgid "Email" +msgstr "E-mail" + +msgid "New password" +msgstr "Awal uffir amaynut" + +msgid "New password confirmation" +msgstr "Asentem n wawal uffir amaynut" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "Awal uffir aqbuṛ" + +msgid "Password (again)" +msgstr "Mot de passe (bis)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "lqem" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "tasqamt n wakud" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "isem" + +msgid "content type" +msgstr "anaw n ugbur" + +msgid "codename" +msgstr "" + +msgid "permission" +msgstr "tasiregt" + +msgid "permissions" +msgstr "tisirag" + +msgid "group" +msgstr "agraw" + +msgid "groups" +msgstr "igrawen" + +msgid "superuser status" +msgstr "addad n unebdal" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Yemmal-d d akken aseqdac-agi ɣur-s akk tisirag war ma ttwanefkent-as s wudem " +"aflalay." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "tisirag n useqdac" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "isem n useqdac" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "Tansa-agi imayl tella yakan." + +msgid "first name" +msgstr "isem" + +msgid "last name" +msgstr "Isem aneggaru" + +msgid "email address" +msgstr "tansa imayl" + +msgid "staff status" +msgstr "" + +msgid "Designates whether the user can log into this admin site." +msgstr "" + +msgid "active" +msgstr "urmid" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Yettwag ma yella aseqdac-agi yezmer ad yettwammel d urmid neɣ ala. Kkes " +"afran deg umḍiq n tukksa n umiḍan." + +msgid "date joined" +msgstr "azemz n ujerred" + +msgid "user" +msgstr "aseqdac" + +msgid "users" +msgstr "Iseqdaceniseqdacen" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "Yeffeɣ" + +msgid "Password reset" +msgstr "Awennez n wawal uffir" + +msgid "Password reset sent" +msgstr "Tulsa n wennez n wawal uffir tettwazen" + +msgid "Enter new password" +msgstr "Sekcem awal n uffir amaynut" + +msgid "Password reset unsuccessful" +msgstr "tulsa n uwennez n wawal uffir tedda" + +msgid "Password reset complete" +msgstr "Awennez n wawal uffir yemmed" + +msgid "Password change" +msgstr "Abeddel n wawal uffir" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/km/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..26beb5a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,281 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Personal info" +msgstr "ព័ត៌មានផ្ទាល់ខ្លួន" + +msgid "Permissions" +msgstr "ការអនុញ្ញាត" + +msgid "Important dates" +msgstr "កាលបរិច្ឆេទសំខាន់" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "ពាក្យសំងាត់" + +msgid "last login" +msgstr "ការពិនិត្យចូលកន្លងមក" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "ពាក្យសំងាត់" + +msgid "Password confirmation" +msgstr "" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "ឈ្មោះសមាជិកនេះ​លែងដំណើរការ" + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "" + +msgid "New password confirmation" +msgstr "" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "" + +msgid "Password (again)" +msgstr "ពាក្យសំងាត់ (ម្តងទៀត)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "ឈ្មោះ" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "ឈ្មោះលេខកូត" + +msgid "permission" +msgstr "អនុញ្ញាត" + +msgid "permissions" +msgstr "អនុញ្ញាត" + +msgid "group" +msgstr "ក្រុម" + +msgid "groups" +msgstr "ក្រុម" + +msgid "superuser status" +msgstr "ស្ថានភាពអ្នកគ្រងគ្រង" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "កំណត់អោយសមាជិកនេះមានសិទ្ធិទាំងអស់។" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "ការអនុញ្ញាតអោយសមាជិក" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "ឈ្មោះជាសមាជិក" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "" + +msgid "first name" +msgstr "នាម" + +msgid "last name" +msgstr "គោត្តនាម" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "ស្ថានភាពបុគ្គលិក" + +msgid "Designates whether the user can log into this admin site." +msgstr "កំណត់អោយសមាជិកអាចចូលមកប្រើប្រាស់ទំព័រគ្រប់គ្រងនេះ។" + +msgid "active" +msgstr "សកម្ម" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "កាលបរិច្ឆេទចូលរួម" + +msgid "user" +msgstr "សមាជិក" + +msgid "users" +msgstr "សមាជិក" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "ចាកចេញ" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3adcc2c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..242ef23 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/lv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4909b20 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..a991af0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,308 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# dekomote , 2015 +# Jannis Leidel , 2011 +# Vasil Vangelovski , 2016-2017 +# Vasil Vangelovski , 2013-2015 +# Vasil Vangelovski , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" +"mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgid "Personal info" +msgstr "Лични информации" + +msgid "Permissions" +msgstr "Привилегии" + +msgid "Important dates" +msgstr "Важни датуми" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Не постои %(name)s објект со примарен клуч %(key)r." + +msgid "Password changed successfully." +msgstr "Успешна промена на лозинката." + +#, python-format +msgid "Change password: %s" +msgstr "Промени лозинка: %s" + +msgid "Authentication and Authorization" +msgstr "Автентикација и авторизација" + +msgid "password" +msgstr "лозинка" + +msgid "last login" +msgstr "последна најава" + +msgid "No password set." +msgstr "Нема зададена лозинка." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Невалиден формат на лозинка или непознат алгоритам за хеширање." + +msgid "The two password fields didn't match." +msgstr "Двете полиња со лозинките не се совпаѓаат." + +msgid "Password" +msgstr "Лозинка" + +msgid "Password confirmation" +msgstr "Потврда на лозинка" + +msgid "Enter the same password as before, for verification." +msgstr "Внесете ја истата лозинка како претходно, за верификација." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Ве молиме внесете ја точно %(username)s и лозинка. Имајте на ум дека двете " +"полиња може да бидат со мали букви." + +msgid "This account is inactive." +msgstr "Оваа сметка е неактивна." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Нова лозинка" + +msgid "New password confirmation" +msgstr "Потврда за нова лозинка" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно." + +msgid "Old password" +msgstr "Стара лозинка" + +msgid "Password (again)" +msgstr "Лозинка (повторно)" + +msgid "algorithm" +msgstr "алгоритам" + +msgid "iterations" +msgstr "повторувања" + +msgid "salt" +msgstr "случаен клуч" + +msgid "hash" +msgstr "хеш" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "верзија" + +msgid "memory cost" +msgstr "просторна (мемориска) комплексност" + +msgid "time cost" +msgstr "временска комплексност" + +msgid "parallelism" +msgstr "паралелизам" + +msgid "work factor" +msgstr "фактор на работа" + +msgid "checksum" +msgstr "проверка" + +msgid "name" +msgstr "име" + +msgid "content type" +msgstr "тип содржина" + +msgid "codename" +msgstr "кодно име" + +msgid "permission" +msgstr "привилегија" + +msgid "permissions" +msgstr "привилегии" + +msgid "group" +msgstr "група" + +msgid "groups" +msgstr "групи" + +msgid "superuser status" +msgstr "статус на суперкорисник" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Означува дека овој корисник ги има сите привилегии без експлицитно да се " +"доделуваат сите." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Групите на коишто припаѓа овој корисник. Корисникот ќе ги добие сите " +"пермисии на секоја од избраните групи." + +msgid "user permissions" +msgstr "кориснички привилегии" + +msgid "Specific permissions for this user." +msgstr "Специфични дозволи за овој корисник." + +msgid "username" +msgstr "корисничко име" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Задолжително. 150 или помалку знаци. Единствено букви, бројки и @/./+/-/_ ." + +msgid "A user with that username already exists." +msgstr "Веќе постои корисник со тоа корисничко име." + +msgid "first name" +msgstr "име" + +msgid "last name" +msgstr "презиме" + +msgid "email address" +msgstr "email адреса" + +msgid "staff status" +msgstr "статус на администраторите" + +msgid "Designates whether the user can log into this admin site." +msgstr "" +"Означува дали корисникот може да се логира во сајтот за администрација." + +msgid "active" +msgstr "активен" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Означува дали корисникот треба да биде активен. Одштиклирајте го ова наместо " +"да бришете корисници." + +msgid "date joined" +msgstr "датум на зачленување" + +msgid "user" +msgstr "корисник" + +msgid "users" +msgstr "корисници" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Оваа лозинка е премногу кратка. Мора да содржи најмалку %(min_length)d " +"карактер." +msgstr[1] "" +"Оваа лозинка е премногу кратка. Мора да содржи најмалку %(min_length)d " +"карактери." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Вашата лозинка мора да содржи најмалку %(min_length)d карактер." +msgstr[1] "Вашата лозинка мора да содржи најмалку %(min_length)d карактери." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Лозинката е премногу слична со %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Вашата лозинка не смее да биде премногу слична со други лични информации." + +msgid "This password is too common." +msgstr "Оваа лозинка е премногу често користена." + +msgid "Your password can't be a commonly used password." +msgstr "Вашата лозинка не смее да биде лозинка која се користи многу често." + +msgid "This password is entirely numeric." +msgstr "Оваа лозинка содржи само цифри." + +msgid "Your password can't be entirely numeric." +msgstr "Вашата лозинка не може да содржи само цифри." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Ресетирање на лозинка за %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Внесете валидно корисничко име. Оваа вредност може да содржи само латински " +"букви, бројки и @/./+/-/_ знаци." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Внесете валидно корисничко име. Оваа вредност може да содржи само букви, " +"бројки и @/./+/-/_ знаци." + +msgid "Logged out" +msgstr "Одјавен" + +msgid "Password reset" +msgstr "Ресетирање на лозинка" + +msgid "Password reset sent" +msgstr "Испратено информации за ресетирање лозинка" + +msgid "Enter new password" +msgstr "Внесете нова лозинка" + +msgid "Password reset unsuccessful" +msgstr "Неуспешно ресетирање на лозинка" + +msgid "Password reset complete" +msgstr "Ресетирањето на лозинката е завршено" + +msgid "Password change" +msgstr "Промена на лозинка" + +msgid "Password change successful" +msgstr "Успешна промена на лозинка" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ml/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d247f8e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ml/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..16b3e27 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,226 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 10:30+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "" + +msgid "Permissions" +msgstr "" + +msgid "Important dates" +msgstr "" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Password confirmation" +msgstr "" + +msgid "Enter the same password as above, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this " +"form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "" + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "" + +msgid "New password confirmation" +msgstr "" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "" + +msgid "Password (again)" +msgstr "" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "" + +msgid "codename" +msgstr "" + +msgid "permission" +msgstr "" + +msgid "permissions" +msgstr "" + +msgid "group" +msgstr "" + +msgid "groups" +msgstr "" + +msgid "password" +msgstr "" + +msgid "last login" +msgstr "" + +msgid "superuser status" +msgstr "" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "" + +msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers and @/./" +"+/-/_ characters." +msgstr "" + +msgid "A user with that username already exists." +msgstr "" + +msgid "first name" +msgstr "" + +msgid "last name" +msgstr "" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "" + +msgid "Designates whether the user can log into this admin site." +msgstr "" + +msgid "active" +msgstr "" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "" + +msgid "user" +msgstr "" + +msgid "users" +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "Logged out" +msgstr "" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a08a819 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..400768c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,282 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Yhal Htet Aung , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Burmese (http://www.transifex.com/django/django/language/" +"my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Personal info" +msgstr "ကိုယ်ရေးအချက်အလက်" + +msgid "Permissions" +msgstr "ခွင့်ပြုချက်များ" + +msgid "Important dates" +msgstr "အရေးကြီးနေ့စွဲများ" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "" + +msgid "last login" +msgstr "" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "စကားဝှက်" + +msgid "Password confirmation" +msgstr "" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "" + +msgid "Email" +msgstr "အီးမေးလ်" + +msgid "New password" +msgstr "" + +msgid "New password confirmation" +msgstr "" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "" + +msgid "Password (again)" +msgstr "" + +msgid "algorithm" +msgstr "ပံုသေနည်း" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "နာမည်" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "" + +msgid "permission" +msgstr "" + +msgid "permissions" +msgstr "" + +msgid "group" +msgstr "အုပ်စု" + +msgid "groups" +msgstr "အုပ်စုများ" + +msgid "superuser status" +msgstr "" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "" + +msgid "first name" +msgstr "" + +msgid "last name" +msgstr "" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "" + +msgid "Designates whether the user can log into this admin site." +msgstr "" + +msgid "active" +msgstr "" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "" + +msgid "user" +msgstr "" + +msgid "users" +msgstr "" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f2ac314 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..febc7ee --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" +"language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Personleg informasjon" + +msgid "Permissions" +msgstr "Løyve" + +msgid "Important dates" +msgstr "Viktige datoar" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "Passordet er endra." + +#, python-format +msgid "Change password: %s" +msgstr "Endre passord: %s" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "passord" + +msgid "last login" +msgstr "siste innlogging" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "Dei to passordfelta er ikkje like." + +msgid "Password" +msgstr "Passord" + +msgid "Password confirmation" +msgstr "Stadfesting av passord" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "Denne kontoen er inaktiv." + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "Nytt passord" + +msgid "New password confirmation" +msgstr "Stadfest nytt passord" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Det gamle passordet er feil. Prøv omatt." + +msgid "Old password" +msgstr "Gammalt passord" + +msgid "Password (again)" +msgstr "Passord (gjenta)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "namn" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "kodenamn" + +msgid "permission" +msgstr "løyve" + +msgid "permissions" +msgstr "løyve" + +msgid "group" +msgstr "gruppe" + +msgid "groups" +msgstr "grupper" + +msgid "superuser status" +msgstr "superbrukar" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "Angir at denne brukaren har alle løyve utan å eksplisitt sette dei." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "Brukerløyve" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "brukarnamn" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "Det eksisterar allereie ein brukar med dette brukernamnet." + +msgid "first name" +msgstr "fornamn" + +msgid "last name" +msgstr "etternamn" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "administrasjonsstatus" + +msgid "Designates whether the user can log into this admin site." +msgstr "Angir at brukaren kan logge inn på denne administrasjonssida." + +msgid "active" +msgstr "aktiv" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Angir at denne brukaren er aktiv. Avmerk denne i staden for å slette kontoen." + +msgid "date joined" +msgstr "registrert" + +msgid "user" +msgstr "brukar" + +msgid "users" +msgstr "brukarar" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "Logga ut" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..1254932 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,313 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2017 +# Jannis Leidel , 2011 +# jorgecarleitao , 2015 +# Nuno Mariz , 2013,2015,2017 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-30 23:58+0000\n" +"Last-Translator: Nuno Mariz \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Informação pessoal" + +msgid "Permissions" +msgstr "Permissões" + +msgid "Important dates" +msgstr "Datas importantes" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "O objecto %(name)s com a chave primária %(key)r não existe." + +msgid "Password changed successfully." +msgstr "Palavra-passe modificada com sucesso." + +#, python-format +msgid "Change password: %s" +msgstr "Modificar a palavra-passe: %s" + +msgid "Authentication and Authorization" +msgstr "Autenticação e Autorização" + +msgid "password" +msgstr "palavra-passe" + +msgid "last login" +msgstr "última entrada" + +msgid "No password set." +msgstr "Nenhuma palavra-chave definida." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Formato de palavra-chave inválido ou função de mistura desconhecida." + +msgid "The two password fields didn't match." +msgstr "Os dois campos da palavra-passe não coincidem." + +msgid "Password" +msgstr "Palavra-passe" + +msgid "Password confirmation" +msgstr "Confirmação da palavra-passe" + +msgid "Enter the same password as before, for verification." +msgstr "Introduza a palavra-passe como acima, para verificação." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Não são guardadas palavras-passe sem encriptação, portanto não é possível " +"visualizar a password deste utilizador, mas poderá modificar a palavra-passe " +"através deste formulário." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Por favor introduza o %(username)s e password corretos. Tenha em atenção às " +"maiúsculas e minúsculas." + +msgid "This account is inactive." +msgstr "Esta conta não está activa." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Nova palavra-passe" + +msgid "New password confirmation" +msgstr "Confirmação da nova palavra-passe" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"A sua palavra-passe antiga foi introduzida incorretamente. Por favor tente " +"novamente." + +msgid "Old password" +msgstr "Palavra-passe antiga" + +msgid "Password (again)" +msgstr "Palavra-passe (novamente)" + +msgid "algorithm" +msgstr "algoritmo" + +msgid "iterations" +msgstr "iterações" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "variedade" + +msgid "version" +msgstr "versão" + +msgid "memory cost" +msgstr "custo da memória" + +msgid "time cost" +msgstr "custo de tempo" + +msgid "parallelism" +msgstr "paralelismo" + +msgid "work factor" +msgstr "fator trabalho" + +msgid "checksum" +msgstr "verificação" + +msgid "name" +msgstr "nome" + +msgid "content type" +msgstr "tipo de conteúdo" + +msgid "codename" +msgstr "nome de código" + +msgid "permission" +msgstr "permissão" + +msgid "permissions" +msgstr "permissões" + +msgid "group" +msgstr "grupo" + +msgid "groups" +msgstr "grupos" + +msgid "superuser status" +msgstr "Status de superuser" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Define se este utilizador tem todas as permissões sem explicitamente as " +"atribuir." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Os grupos que este utilizador pertence. Um utilizador terá todas as " +"permissões concedidas a cada um dos seus grupos." + +msgid "user permissions" +msgstr "permissões do utilizador" + +msgid "Specific permissions for this user." +msgstr "Permissões específicas para este utilizador." + +msgid "username" +msgstr "utilizador" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Obrigatório. 150 carateres ou menos. Apenas letras, dígitos @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Já existe um utilizador com esse nome." + +msgid "first name" +msgstr "primeiro nome" + +msgid "last name" +msgstr "último nome" + +msgid "email address" +msgstr "endereço de email" + +msgid "staff status" +msgstr "status de equipa" + +msgid "Designates whether the user can log into this admin site." +msgstr "Define se o utilizador pode usar a administração do site." + +msgid "active" +msgstr "ativo" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Defina se este utilizador deva ser tratado como ativo. Não selecione em vez " +"de remover as contas." + +msgid "date joined" +msgstr "data de registo" + +msgid "user" +msgstr "utilizador" + +msgid "users" +msgstr "utilizadores" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Esta palavra-passe é muito curta. Deve conter pelo menos %(min_length)d " +"caractere." +msgstr[1] "" +"Esta palavra-passe é muito curta. Deve conter pelo menos %(min_length)d " +"caracteres." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +"A sua palavra-passe deve conter pelo menos %(min_length)d caractere." +msgstr[1] "" +"A sua palavra-passe deve conter pelo menos %(min_length)d caracteres." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "A palavra-passe é muito semelhante ao %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "" +"Sua palavra-passe não pode ser muito semelhante a outras informações " +"pessoais." + +msgid "This password is too common." +msgstr "Esta palavra-passe é muito comum." + +msgid "Your password can't be a commonly used password." +msgstr "A sua palavra-passe não pode ser uma palavra-passe comum." + +msgid "This password is entirely numeric." +msgstr "Esta palavra-passe é inteiramente numérica." + +msgid "Your password can't be entirely numeric." +msgstr "Sua palavra-passe não pode ser inteiramente numérica." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Redefinição de palavra-passe em %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Insira um nome de utilizador válido. Este valor apenas deverá conter letras, " +"números e carateres @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Insira um nome de utilizador válido. Este valor apenas deverá conter letras, " +"números e carateres @/./+/-/_." + +msgid "Logged out" +msgstr "Saiu" + +msgid "Password reset" +msgstr "Gerar nova palavra-passe" + +msgid "Password reset sent" +msgstr "Redefinição de palavra-passe enviada" + +msgid "Enter new password" +msgstr "Introduza nova palavra-passe" + +msgid "Password reset unsuccessful" +msgstr "A mudança da palavra-passe não foi bem sucedida" + +msgid "Password reset complete" +msgstr "Geração de nova palavra-passe completa" + +msgid "Password change" +msgstr "Mudança de palavra-passe" + +msgid "Password change successful" +msgstr "Mudança de palavra-passe bem sucedida" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..f5d824c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,308 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Jure Cuhalev , 2012 +# Primož Verdnik , 2017 +# zejn , 2013,2016-2017 +# zejn , 2011-2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-12-03 15:49+0000\n" +"Last-Translator: zejn \n" +"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Personal info" +msgstr "Osebni podatki" + +msgid "Permissions" +msgstr "Dovoljenja" + +msgid "Important dates" +msgstr "Pomembni datumi" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "Objekt %(name)s z glavnim ključem %(key)r ne obstaja." + +msgid "Password changed successfully." +msgstr "Geslo je uspešno spremenjeno." + +#, python-format +msgid "Change password: %s" +msgstr "Spremeni geslo: %s" + +msgid "Authentication and Authorization" +msgstr "Avtentikacija in avtorizacija" + +msgid "password" +msgstr "geslo" + +msgid "last login" +msgstr "zadnja prijava" + +msgid "No password set." +msgstr "Geslo ni nastavljeno." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Neveljavna oblika gesla ali neznan algoritem razpršila." + +msgid "The two password fields didn't match." +msgstr "Gesli se ne ujemata." + +msgid "Password" +msgstr "Geslo" + +msgid "Password confirmation" +msgstr "Potrditev gesla" + +msgid "Enter the same password as before, for verification." +msgstr "Vnesite isto geslo kot prej, za preverjanje." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Čitljiva gesla se ne shranjujejo, tako da ni možno videti gesla tega " +"uporabnika, lahko pa geslo spremenite z uporabo tega obrazca." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Vnesite veljavno %(username)s in geslo. Opomba: obe polji upoštevata " +"velikost črk." + +msgid "This account is inactive." +msgstr "Ta uporabniški račun ni dejaven." + +msgid "Email" +msgstr "Elektronski naslov" + +msgid "New password" +msgstr "Novo geslo" + +msgid "New password confirmation" +msgstr "Potrditev novega gesla" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Vaše staro geslo ni vneseno pravilno. Poskusite znova." + +msgid "Old password" +msgstr "Staro geslo" + +msgid "Password (again)" +msgstr "Geslo (znova)" + +msgid "algorithm" +msgstr "algoritem" + +msgid "iterations" +msgstr "ponovitev" + +msgid "salt" +msgstr "naključna vrednost" + +msgid "hash" +msgstr "razpršilo" + +msgid "variety" +msgstr "pestrost" + +msgid "version" +msgstr "različica" + +msgid "memory cost" +msgstr "pomnilniška zahtevnost" + +msgid "time cost" +msgstr "časovna zahtevnost" + +msgid "parallelism" +msgstr "paralelnost" + +msgid "work factor" +msgstr "faktor obremenitve" + +msgid "checksum" +msgstr "nadzorna vsota" + +msgid "name" +msgstr "ime" + +msgid "content type" +msgstr "vrsta vsebine" + +msgid "codename" +msgstr "kodno ime" + +msgid "permission" +msgstr "dovoljenje" + +msgid "permissions" +msgstr "dovoljenja" + +msgid "group" +msgstr "skupina" + +msgid "groups" +msgstr "skupine" + +msgid "superuser status" +msgstr "stanje skrbnika" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Določi, da bo uporabnik imel vsa dovoljenja, ne da bi mu jih posebej " +"dodelili." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Skupine, katerih član je ta uporabnik. Uporabnik pridobi vsa dovoljenja, " +"povezana z vsako izmed skupin." + +msgid "user permissions" +msgstr "uporabniška dovoljenja" + +msgid "Specific permissions for this user." +msgstr "Dovoljenja specifična za tega uporabnika." + +msgid "username" +msgstr "uporabniško ime" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "Zahtevano. 150 znakov ali manj. Le črke, števke in znaki @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Uporabnik s tem uporabniškim imenom že obstaja." + +msgid "first name" +msgstr "ime" + +msgid "last name" +msgstr "priimek" + +msgid "email address" +msgstr "elektronski naslov" + +msgid "staff status" +msgstr "stanje osebja" + +msgid "Designates whether the user can log into this admin site." +msgstr "Določi, ali se sme uporabnik prijaviti kot skrbnik." + +msgid "active" +msgstr "dejaven" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Določi, ali je uporabnik dejaven. Možnost je priročna in preprečuje brisanje " +"računov." + +msgid "date joined" +msgstr "vpisan od" + +msgid "user" +msgstr "uporabnik" + +msgid "users" +msgstr "uporabniki" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "To geslo je prekratko. Imeti mora vsaj %(min_length)d znak." +msgstr[1] "To geslo je prekratko. Imeti mora vsaj %(min_length)d znaka." +msgstr[2] "To geslo je prekratko. Imeti mora vsaj %(min_length)d znake." +msgstr[3] "To geslo je prekratko. Imeti mora vsaj %(min_length)d znakov." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Vaše geslo mora imeti vsaj %(min_length)d znak." +msgstr[1] "Vaše geslo mora imeti vsaj %(min_length)d znaka." +msgstr[2] "Vaše geslo mora imeti vsaj %(min_length)d znake." +msgstr[3] "Vaše geslo mora imeti vsaj %(min_length)d znakov." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Geslo je preveč podobno %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Geslo ne sme biti preveč podobno ostalim vašim osebnim podatkom." + +msgid "This password is too common." +msgstr "Geslo je eno izmed preveč pogosto uporabljanih." + +msgid "Your password can't be a commonly used password." +msgstr "Vaše geslo ne sme biti eno izmed pogosto uporabljanih gesel." + +msgid "This password is entirely numeric." +msgstr "Vaše geslo je sestavljeno samo iz števk." + +msgid "Your password can't be entirely numeric." +msgstr "Vaše geslo ne sme biti sestavljeno samo iz števk." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Geslo na %(site_name)s je ponastavljeno." + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Vnesite veljavno uporabniško ime. Ta vrednost sme vsebovati le angleške " +"črke, števke in znake @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Vnesite veljavno uporabniško ime. Ta vrednost sme vsebovati le črke, števke " +"in znake @/./+/-/_." + +msgid "Logged out" +msgstr "Odjavljen" + +msgid "Password reset" +msgstr "Ponastavi geslo" + +msgid "Password reset sent" +msgstr "Navodila za ponastavitev gesla so bila poslana" + +msgid "Enter new password" +msgstr "Vnesite novo geslo" + +msgid "Password reset unsuccessful" +msgstr "Ponastavitev gesla ni uspela" + +msgid "Password reset complete" +msgstr "Ponastavitev gesla zaključena" + +msgid "Password change" +msgstr "Sprememba gesla" + +msgid "Password change successful" +msgstr "Sprememba gesla je uspela" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..a51c3b9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,309 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Janos Guljas , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-10-19 14:35+0000\n" +"Last-Translator: mPyth \n" +"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Personal info" +msgstr "Лични подаци" + +msgid "Permissions" +msgstr "Дозволе" + +msgid "Important dates" +msgstr "Важни датуми" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s објекат са примарним кључем %(key)r не постоји." + +msgid "Password changed successfully." +msgstr "Лозинка успешно измењена." + +#, python-format +msgid "Change password: %s" +msgstr "Измени лозинку: %s" + +msgid "Authentication and Authorization" +msgstr "Аутентикација и Ауторизација" + +msgid "password" +msgstr "лозинка" + +msgid "last login" +msgstr "последња пријава" + +msgid "No password set." +msgstr "Лозинка није унета." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Инвалидан формат лозинке или непознат hashing алгоритам." + +msgid "The two password fields didn't match." +msgstr "Два поља за лозинке се нису поклопила." + +msgid "Password" +msgstr "Лозинка" + +msgid "Password confirmation" +msgstr "Потврда лозинке" + +msgid "Enter the same password as before, for verification." +msgstr "Унесите исту лозинку као малопре ради верификације." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Лозинке се не чувају у изворном облику па не постоји могућност приказа " +"лозинке овог корисника, али можете променити лозинку коришћењем ове форме." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Молим вас унесите исправно %(username)s и лозинку. Обратите пажњу да мала и " +"велика слова представљају различите карактере." + +msgid "This account is inactive." +msgstr "Овај налог је неактиван." + +msgid "Email" +msgstr "И-мејл" + +msgid "New password" +msgstr "Нова лозинка" + +msgid "New password confirmation" +msgstr "Потврда нове лозинке" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Ваша стара лознка није правилно унесена. Унесите је поново." + +msgid "Old password" +msgstr "Стара лозинка" + +msgid "Password (again)" +msgstr "Лозинка (поновите)" + +msgid "algorithm" +msgstr "алгоритам" + +msgid "iterations" +msgstr "итерације" + +msgid "salt" +msgstr "зачин" + +msgid "hash" +msgstr "хеш" + +msgid "variety" +msgstr "варијанта" + +msgid "version" +msgstr "верзија" + +msgid "memory cost" +msgstr "меморијска захтевност" + +msgid "time cost" +msgstr "временска захтевност" + +msgid "parallelism" +msgstr "паралелизам" + +msgid "work factor" +msgstr "фактор сложености" + +msgid "checksum" +msgstr "сума за проверу" + +msgid "name" +msgstr "име" + +msgid "content type" +msgstr "тип садржаја" + +msgid "codename" +msgstr "шифра дозволе" + +msgid "permission" +msgstr "дозвола" + +msgid "permissions" +msgstr "дозволе" + +msgid "group" +msgstr "група" + +msgid "groups" +msgstr "групе" + +msgid "superuser status" +msgstr "статус администратора" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Указује да корисник има све дозволе без додељивања појединачних дозвола." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Групе којима припада овај корисник. Корисник ће добити све дозволе које су " +"дате групама којима припада." + +msgid "user permissions" +msgstr "корисникове дозволе" + +msgid "Specific permissions for this user." +msgstr "Дозволе које се односе на овог корисника." + +msgid "username" +msgstr "корисничко име" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Обавезан податак. 150 карактера или мање. Дозвољена су само слова, цифре и " +"карактери @/./+/-/_ ." + +msgid "A user with that username already exists." +msgstr "Корисник са тим корисничким именом већ постоји." + +msgid "first name" +msgstr "име" + +msgid "last name" +msgstr "презиме" + +msgid "email address" +msgstr "и-мејл адреса" + +msgid "staff status" +msgstr "статус члана посаде" + +msgid "Designates whether the user can log into this admin site." +msgstr "Указује да корисник може да се пријави на овај сајт за администрацију." + +msgid "active" +msgstr "активан" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Означава да ли се корисник сматра активним. Деселектујте ово уместо да " +"бришете налог." + +msgid "date joined" +msgstr "датум регистрације" + +msgid "user" +msgstr "корисник" + +msgid "users" +msgstr "корисници" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Ова лозинка је превише кратка, мора садржати најмање %(min_length)d карактер." +msgstr[1] "" +"Ова лозинка је превише кратка, мора садржати најмање %(min_length)d " +"карактера." +msgstr[2] "" +"Ова лозинка је превише кратка, мора садржати најмање %(min_length)d " +"карактера." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Ваша лозинка мора садржати најмање %(min_length)d карактер." +msgstr[1] "Ваша лозинка мора садржати најмање %(min_length)d карактера." +msgstr[2] "Ваша лозинка мора садржати најмање %(min_length)d карактера." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Лозинка је превише слична пољу '%(verbose_name)s'." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Ваша лозинка не може бити слична вашим личним подацима." + +msgid "This password is too common." +msgstr "Ова лозинка је међу најчешће коришћеним лозинкама." + +msgid "Your password can't be a commonly used password." +msgstr "Ваша лозинка не може бити међу најчешће коришћеним лозинкама." + +msgid "This password is entirely numeric." +msgstr "Ова лозинка садржи само цифре." + +msgid "Your password can't be entirely numeric." +msgstr "Ваша лозинка не може садржати само цифре." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Ресетовање лозинке на сајту %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Унесите исправно корисничко име. Оно може садржати само слова енглеске " +"абецеде, цифре и карактере @/./+/-/_ ." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Унесите исправно корисничко име. Оно може садржати само слова, цифре и " +"карактере @/./+/-/_ ." + +msgid "Logged out" +msgstr "Одјављен" + +msgid "Password reset" +msgstr "Ресет лозинке" + +msgid "Password reset sent" +msgstr "Захтев за ресет лозинке је послат" + +msgid "Enter new password" +msgstr "Унесите нову лозинку" + +msgid "Password reset unsuccessful" +msgstr "Неуспешан ресет лозинке" + +msgid "Password reset complete" +msgstr "Ресет лозинке је завршен" + +msgid "Password change" +msgstr "Промена лозинке" + +msgid "Password change successful" +msgstr "Лозинка је успешно промењена" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9608759 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d202498 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 0000000..d824ec2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,311 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alex Nordlund , 2012 +# Cybjit , 2012 +# Jannis Leidel , 2011 +# Jonathan Lindén, 2015 +# Jonathan Lindén, 2014 +# Mattias Hansson , 2016 +# nip3o , 2014 +# Petter Strandmark , 2019 +# Samuel Linde , 2011 +# Thomas Lundqvist, 2013,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2019-01-28 13:46+0000\n" +"Last-Translator: Petter Strandmark \n" +"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "Personlig information" + +msgid "Permissions" +msgstr "Rättigheter" + +msgid "Important dates" +msgstr "Viktiga datum" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s-objekt med primärnyckel %(key)r finns inte." + +msgid "Password changed successfully." +msgstr "Lösenordet ändrades." + +#, python-format +msgid "Change password: %s" +msgstr "Ändra lösenord: %s" + +msgid "Authentication and Authorization" +msgstr "Autentisering och auktorisering" + +msgid "password" +msgstr "lösenord" + +msgid "last login" +msgstr "senaste inloggning" + +msgid "No password set." +msgstr "Inget lösenord angivet." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Ogiltigt lösenordsformat eller okänd hashalgoritm." + +msgid "The two password fields didn't match." +msgstr "De två lösenordsfälten stämde inte överens." + +msgid "Password" +msgstr "Lösenord" + +msgid "Password confirmation" +msgstr "Lösenordsbekräftelse" + +msgid "Enter the same password as before, for verification." +msgstr "Fyll i samma lösenord som tidigare för verifiering." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Lösenord lagras inte direkt, så det finns inget sätt att se denna användares " +"lösenord, men du kan ändra lösenorden med detta formulär." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Ange ett korrekt %(username)s och lösenord. Observera att båda fälten är " +"skiftlägeskänsliga." + +msgid "This account is inactive." +msgstr "Detta konto är inaktivt." + +msgid "Email" +msgstr "E-postadress" + +msgid "New password" +msgstr "Nytt lösenord" + +msgid "New password confirmation" +msgstr "Bekräfta nytt lösenord" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Ditt gamla lösenord var felaktigt ifyllt. Var vänlig fyll i det igen." + +msgid "Old password" +msgstr "Gammalt lösenord" + +msgid "Password (again)" +msgstr "Lösenord (igen)" + +msgid "algorithm" +msgstr "algoritm" + +msgid "iterations" +msgstr "iterationer" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "variation" + +msgid "version" +msgstr "version" + +msgid "memory cost" +msgstr "minneskostnad" + +msgid "time cost" +msgstr "tidskostnad" + +msgid "parallelism" +msgstr "parallellism" + +msgid "work factor" +msgstr "arbetsfaktor" + +msgid "checksum" +msgstr "kontrollsumma" + +msgid "name" +msgstr "namn" + +msgid "content type" +msgstr "innehållstyp" + +msgid "codename" +msgstr "kodnamn" + +msgid "permission" +msgstr "rättighet" + +msgid "permissions" +msgstr "rättigheter" + +msgid "group" +msgstr "grupp" + +msgid "groups" +msgstr "grupper" + +msgid "superuser status" +msgstr "superanvändare" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Anger att denna användare har alla rättigheter utan att uttryckligen " +"tilldela dem." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"De grupper som användaren är medlem i. Användare får tillgång till alla " +"rättigheter som deras grupper har." + +msgid "user permissions" +msgstr "användarättigheter" + +msgid "Specific permissions for this user." +msgstr "Specifika rättigheter för denna användare." + +msgid "username" +msgstr "användarnamn" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Obligatoriskt. 150 tecken eller färre. Endast bokstäver, siffror och @/./+/-/" +"_." + +msgid "A user with that username already exists." +msgstr "En användare med det användarnamnet finns redan." + +msgid "first name" +msgstr "förnamn" + +msgid "last name" +msgstr "efternamn" + +msgid "email address" +msgstr "e-postadress" + +msgid "staff status" +msgstr "personalstatus" + +msgid "Designates whether the user can log into this admin site." +msgstr "Avgör om användaren kan logga in på denna adminsida." + +msgid "active" +msgstr "aktiv" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Anger om användaren skall betraktas som aktiv. Avmarkera detta istället för " +"att ta bort konton." + +msgid "date joined" +msgstr "registreringsdatum" + +msgid "user" +msgstr "användare" + +msgid "users" +msgstr "användare" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Detta lösenord är för kort. Det måste innehålla minst %(min_length)d tecken." +msgstr[1] "" +"Detta lösenord är för kort. Det måste innehålla minst %(min_length)d tecken." + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Ditt lösenord måste innehålla minst %(min_length)d tecken." +msgstr[1] "Ditt lösenord måste innehålla minst %(min_length)d tecken." + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Ditt lösenord är alltför likt %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Ditt lösenord kan inte vara alltför lik din personliga information." + +msgid "This password is too common." +msgstr "Detta lösenord är alldeles för vanligt." + +msgid "Your password can't be a commonly used password." +msgstr "Ditt lösenord kan inte vara ett allmänt använt lösenord." + +msgid "This password is entirely numeric." +msgstr "Detta lösenord är enbart numeriskt." + +msgid "Your password can't be entirely numeric." +msgstr "Ditt lösenord kan inte bara vara numeriskt." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Lösenord nollställt på %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Fyll i ett giltigt användarnamn. Detta värde får endast innehålla bokstäver " +"a-z, siffror och @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Fyll i ett giltigt användarnamn. Detta värde får endast innehålla bokstäver, " +"siffror och @/./+/-/_." + +msgid "Logged out" +msgstr "Utloggad" + +msgid "Password reset" +msgstr "Nollställ lösenord" + +msgid "Password reset sent" +msgstr "Lösenordsnollställning skickad" + +msgid "Enter new password" +msgstr "Nytt lösenord" + +msgid "Password reset unsuccessful" +msgstr "Lösenordsnollställning misslyckad" + +msgid "Password reset complete" +msgstr "Nollställning av lösenord klar" + +msgid "Password change" +msgstr "Ändra lösenord" + +msgid "Password change successful" +msgstr "Lösenordet ändrades" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ta/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..3e89f57 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,283 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "தனிப்பட்ட விவரம்" + +msgid "Permissions" +msgstr "அனுமதிகள்" + +msgid "Important dates" +msgstr "முக்கியமான தேதிகள்" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "கடவுச்சொல்" + +msgid "last login" +msgstr "கடைசி உள்நுழைவு" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "கடவுச்சொல்" + +msgid "Password confirmation" +msgstr "" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "இந்த கணக்கு செயல்பட துவங்கவில்லை" + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "" + +msgid "New password confirmation" +msgstr "" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "" + +msgid "Password (again)" +msgstr "கடவுச்சொல்(மறுபடியும்)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "பெயர்" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "குறிமுறை பெயர்" + +msgid "permission" +msgstr "அனுமதி" + +msgid "permissions" +msgstr "அனுமதிகள்" + +msgid "group" +msgstr "குழு" + +msgid "groups" +msgstr "குழுக்கள்" + +msgid "superuser status" +msgstr "மேலாளர் இருப்பு நிலை" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "இந்த பயனருக்கு எல்லா அங்கீகாரங்களும் வழங்கப்படவில்லை." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "பயனர் அனுமதிகள்" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "பயனர் பெயர்" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "" + +msgid "first name" +msgstr "முதல் பெயர்" + +msgid "last name" +msgstr "கடைசி பெயர்" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "பணியாளர் நிலை" + +msgid "Designates whether the user can log into this admin site." +msgstr "பயனர், 'மேலாளலர்' பக்கத்தில் நுழைவதை முடிவு செய்கிறது" + +msgid "active" +msgstr "செயல்படும்" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "சேர்ந்த தேதி" + +msgid "user" +msgstr "பயனர்" + +msgid "users" +msgstr "பயனர்கள்" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "வெளியே வந்துவீட்டீர்" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4aad473 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..d50487c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,285 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# bhaskar teja yerneni , 2011 +# Jannis Leidel , 2011 +# వీవెన్ , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "వ్యక్తిగత సమాచారం " + +msgid "Permissions" +msgstr "అనుమతులు" + +msgid "Important dates" +msgstr "ముఖ్యమైన తేదీలు" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "సంకేతపదాన్ని విజయవంతంగా మార్చారు." + +#, python-format +msgid "Change password: %s" +msgstr "సంకేతపదాన్ని మార్చుకోండి: %s" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "సంకేతపదం" + +msgid "last login" +msgstr "చివరి ప్రవేశం" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "ఈ రెండు అనుమతి పదాలు అసమానమైనంగ ఉన్నాయి" + +msgid "Password" +msgstr "సంకేతపదం" + +msgid "Password confirmation" +msgstr "సంకేపదపు నిర్ధారణ" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "ఈ ఖాతా అచేతనమైనది" + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "కొత్త సంకేతపదం" + +msgid "New password confirmation" +msgstr "కొత్త సంకేతపదపు నిర్ధారణ" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "పాత సంకేతపదం" + +msgid "Password (again)" +msgstr "సంకేతపదం (మళ్ళీ)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "పేరు" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "సంహితనామము" + +msgid "permission" +msgstr "అనుమతి" + +msgid "permissions" +msgstr "అనుమతులు" + +msgid "group" +msgstr "గుంపు" + +msgid "groups" +msgstr "గుంపులు" + +msgid "superuser status" +msgstr "" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "వాడుకరి అనుమతులు" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "వాడుకరిపేరు" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "ఈ నామముతొ ఇంకొ వినియొగదారి ఉన్నరు" + +msgid "first name" +msgstr "మొదటి పేరు" + +msgid "last name" +msgstr "ఇంటి పేరు" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "ఉద్యోగస్తుల స్థితి" + +msgid "Designates whether the user can log into this admin site." +msgstr "" + +msgid "active" +msgstr "క్రియాశీలం" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "చేరిన తేదీ" + +msgid "user" +msgstr "వాడుకరి" + +msgid "users" +msgstr "వాడుకరులు" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "నిష్క్రమించారు" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/th/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..79da789 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,282 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kowit Charoenratchatabhan , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-29 04:33+0000\n" +"Last-Translator: Kowit Charoenratchatabhan \n" +"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Personal info" +msgstr "ข้อมูลส่วนตัว" + +msgid "Permissions" +msgstr "สิทธิ์" + +msgid "Important dates" +msgstr "วันที่ที่สำคัญ" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "เปลี่ยนรหัสผ่านสำเร็จแล้ว" + +#, python-format +msgid "Change password: %s" +msgstr "เปลี่ยนรหัสผ่าน: %s " + +msgid "Authentication and Authorization" +msgstr "การตรวจสอบและอนุมัติ" + +msgid "password" +msgstr "รหัสผ่าน" + +msgid "last login" +msgstr "เข้าสู่ระบบครั้งสุดท้าย" + +msgid "No password set." +msgstr "ไม่ได้ตั้งค่ารหัสผ่าน" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "รูปแบบรหัสผ่านไม่ถูกต้อง หรือไม่รู้จักแฮชอัลกอริทึมนี้" + +msgid "The two password fields didn't match." +msgstr "รหัสผ่านไม่ตรงกัน" + +msgid "Password" +msgstr "รหัสผ่าน" + +msgid "Password confirmation" +msgstr "ยืนยันรหัสผ่าน" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "กรุณาใส่ %(username)s และรหัสผ่านที่ถูกต้อง มีการแยกแยะตัวพิมพ์ใหญ่-เล็ก" + +msgid "This account is inactive." +msgstr "บัญชีนี้ไม่ทำงาน" + +msgid "Email" +msgstr "อีเมล" + +msgid "New password" +msgstr "รหัสผ่านใหม่" + +msgid "New password confirmation" +msgstr "ยืนยันการตั้งรหัสผ่านใหม่" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "ใส่รหัสผ่านเก่าผิด กรุณาใส่รหัสผ่านอีกครั้ง" + +msgid "Old password" +msgstr "รหัสผ่านเก่า" + +msgid "Password (again)" +msgstr "รหัสผ่าน (อีกครั้ง)" + +msgid "algorithm" +msgstr "algorithm" + +msgid "iterations" +msgstr "iterations" + +msgid "salt" +msgstr "salt" + +msgid "hash" +msgstr "hash" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "ปัจจัยการทำงาน" + +msgid "checksum" +msgstr "checksum" + +msgid "name" +msgstr "ชื่อ" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "รหัสชื่อ" + +msgid "permission" +msgstr "สิทธิ์" + +msgid "permissions" +msgstr "สิทธิ์" + +msgid "group" +msgstr "กลุ่ม" + +msgid "groups" +msgstr "กลุ่ม" + +msgid "superuser status" +msgstr "สถานะผู้ใช้พิเศษ" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "กำหนดสิทธิ์ทุกอย่างให้ผู้ใช้ โดยไม่ต้องการมอบหมายอย่างเป็นทางการ" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "สิทธิ์ของผู้ใช้" + +msgid "Specific permissions for this user." +msgstr "สิทธิ์ที่เฉพาะเจาะจงสำหรับผู้ใช้นี้" + +msgid "username" +msgstr "ชื่อผู้ใช้" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "ชื่อผู้ใช้นั้นได้ถูกใช้ไปแล้ว" + +msgid "first name" +msgstr "ชื่อ" + +msgid "last name" +msgstr "นามสกุล" + +msgid "email address" +msgstr "ที่อยู่อีเมล" + +msgid "staff status" +msgstr "สถานะของพนักงาน" + +msgid "Designates whether the user can log into this admin site." +msgstr "กำหนดผู้ที่จะเข้ามาใช้งานในส่วนของผู้ดูแลระบบ" + +msgid "active" +msgstr "ใช้งานได้" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "กำหนดให้ผู้ใช้มีสถานะที่สามารถเข้ามาใช้งานได้ เลือกออกแทนที่จะลบชื่อผู้ใช้ทิ้งไป " + +msgid "date joined" +msgstr "วันที่เข้าร่วม" + +msgid "user" +msgstr "ผู้ใช้" + +msgid "users" +msgstr "ผู้ใช้" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "รีเซ็ตรหัสผ่านบน %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "ออกจากระบบ" + +msgid "Password reset" +msgstr "รีเซ็ตรหัสผ่าน" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "ป้อนรหัสผ่านใหม่" + +msgid "Password reset unsuccessful" +msgstr "ตั้งรหัสผ่านใหม่ไม่สำเร็จ" + +msgid "Password reset complete" +msgstr "รีเซ็ตรหัสผ่านเสร็จสมบูรณ์" + +msgid "Password change" +msgstr "เปลี่ยนรหัสผ่าน" + +msgid "Password change successful" +msgstr "เปลี่ยนรหัสผ่านสำเร็จ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/uk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000..5d98e5f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,319 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# captain_m4l , 2012 +# Igor Melnyk, 2014-2015 +# Jannis Leidel , 2011 +# Kirill Gagarski , 2015 +# Max V. Stotsky , 2014 +# captain_m4l , 2012 +# Mykola Zamkovoi , 2014 +# Alex Bolotov , 2013 +# Vitaliy Kozlovskyi , 2015 +# Zoriana Zaiats, 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-11-08 15:37+0000\n" +"Last-Translator: Zoriana Zaiats\n" +"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" +"uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " +"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " +"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " +"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgid "Personal info" +msgstr "Персональна інформація" + +msgid "Permissions" +msgstr "Дозволи" + +msgid "Important dates" +msgstr "Важливі дати" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "%(name)s об'єкт з первинним ключем %(key)r не існує." + +msgid "Password changed successfully." +msgstr "Пароль успішно змінено." + +#, python-format +msgid "Change password: %s" +msgstr "Змінити пароль: %s" + +msgid "Authentication and Authorization" +msgstr "Аутентифікація та авторизація" + +msgid "password" +msgstr "пароль" + +msgid "last login" +msgstr "останній вхід" + +msgid "No password set." +msgstr "Пароль не встановлено." + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "Невірний формат пароля або невідомий алгоритм хешування." + +msgid "The two password fields didn't match." +msgstr "Паролі у двох полях не співпадають." + +msgid "Password" +msgstr "Пароль" + +msgid "Password confirmation" +msgstr "Підтвердження пароля" + +msgid "Enter the same password as before, for verification." +msgstr "Введіть той же пароль, що і раніше, для підтвердження." + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"Паролі не зберігаються у відкритому вигляді, тому немає можливості " +"переглянути пароль цього користувача, але ви можете змінити пароль за " +"допомогою цієї форми." + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" +"Будь ласка, введіть правильні %(username)s та пароль. Зауважте, що обидва " +"поля чутливі до регістру." + +msgid "This account is inactive." +msgstr "Цей запис користувача не активний." + +msgid "Email" +msgstr "Email" + +msgid "New password" +msgstr "Новий пароль" + +msgid "New password confirmation" +msgstr "Новий пароль (підтвердження)" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" +"Старий пароль було введено неправильно. Будь ласка, введіть його знову." + +msgid "Old password" +msgstr "Старий пароль" + +msgid "Password (again)" +msgstr "Пароль (ще раз)" + +msgid "algorithm" +msgstr "алгоритм" + +msgid "iterations" +msgstr "ітерації" + +msgid "salt" +msgstr "сіль" + +msgid "hash" +msgstr "хеш" + +msgid "variety" +msgstr "різноманітність" + +msgid "version" +msgstr "версія" + +msgid "memory cost" +msgstr "витрати пам’яті" + +msgid "time cost" +msgstr "витрати часу" + +msgid "parallelism" +msgstr "паралелізм" + +msgid "work factor" +msgstr "робочий фактор" + +msgid "checksum" +msgstr "контрольна сума" + +msgid "name" +msgstr "ім'я" + +msgid "content type" +msgstr "тип вмісту" + +msgid "codename" +msgstr "код" + +msgid "permission" +msgstr "дозвіл" + +msgid "permissions" +msgstr "дозволи" + +msgid "group" +msgstr "група" + +msgid "groups" +msgstr "групи" + +msgid "superuser status" +msgstr "статус суперкористувача" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "Визначає, що цей користувач має всі дозволи без їх точного зазначення." + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" +"Групи, до яких належить користувач. Користувач отримає всі дозволи, що " +"вказані в кожній з його груп." + +msgid "user permissions" +msgstr "дозволи користувача" + +msgid "Specific permissions for this user." +msgstr "Особливі права доступу для цього користувача." + +msgid "username" +msgstr "ім'я користувача" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" +"Необхідно: 150 або менше символів. тільки букви, цифри та знаки @/./+/-/_." + +msgid "A user with that username already exists." +msgstr "Користувач з таким ім'ям вже існує." + +msgid "first name" +msgstr "ім'я" + +msgid "last name" +msgstr "прізвище" + +msgid "email address" +msgstr "email адреса" + +msgid "staff status" +msgstr "статус персоналу" + +msgid "Designates whether the user can log into this admin site." +msgstr "Визначає, чи може користувач увійти до цього сайту адміністрування." + +msgid "active" +msgstr "активний" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Визначає, чи можна цього користувача вважати діючим. Заберіть галочку, " +"замість видалення запису користувача." + +msgid "date joined" +msgstr "дата приєднання" + +msgid "user" +msgstr "користувач" + +msgid "users" +msgstr "користувачі" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +"Пароль надто короткий. Він повинен містити як мінімум %(min_length)d символ" +msgstr[1] "" +"Пароль надто короткий. Він повинен містити як мінімум %(min_length)d символи" +msgstr[2] "" +"Пароль надто короткий. Він повинен містити як мінімум %(min_length)d символів" +msgstr[3] "" +"Пароль надто короткий. Він повинен містити як мінімум %(min_length)d символів" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "Ваш пароль повинен містити як мінімум %(min_length)d символ" +msgstr[1] "Ваш пароль повинен містити як мінімум %(min_length)d символи" +msgstr[2] "Ваш пароль повинен містити як мінімум %(min_length)d символів" +msgstr[3] "Ваш пароль повинен містити як мінімум %(min_length)d символів" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "Пароль надто схожий на %(verbose_name)s." + +msgid "Your password can't be too similar to your other personal information." +msgstr "Пароль не повинен бути надто схожим на іншу персональну інформацію." + +msgid "This password is too common." +msgstr "Пароль надто відомий." + +msgid "Your password can't be a commonly used password." +msgstr "Ваш пароль не повинен бути загальновідомим." + +msgid "This password is entirely numeric." +msgstr "Цей пароль повністю складається із цифр." + +msgid "Your password can't be entirely numeric." +msgstr "Ваш пароль не може складається лише із цифр." + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Скидання пароля на %(site_name)s" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" +"Введіть коректне ім'я користувача. Значення цього поля може складатися лише " +"з англійських літер, цифр, а також з символів: @/./+/-/_." + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" +"Введіть коректне ім'я користувача. Значення цього поля може складатися лише " +"з літер, цифр, а також з символів: @/./+/-/_." + +msgid "Logged out" +msgstr "Вихід" + +msgid "Password reset" +msgstr "Перевстановлення паролю" + +msgid "Password reset sent" +msgstr "Скидання пароля відправлено" + +msgid "Enter new password" +msgstr "Введіть новий пароль" + +msgid "Password reset unsuccessful" +msgstr "Пароль не перевстановлено" + +msgid "Password reset complete" +msgstr "Пароль перевстановлено" + +msgid "Password change" +msgstr "Зміна паролю" + +msgid "Password change successful" +msgstr "Пароль успішно змінено" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cfa37da Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..241f7b2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,282 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2017-09-24 14:24+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Personal info" +msgstr "" + +msgid "Permissions" +msgstr "" + +msgid "Important dates" +msgstr "" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "" + +msgid "Password changed successfully." +msgstr "" + +#, python-format +msgid "Change password: %s" +msgstr "" + +msgid "Authentication and Authorization" +msgstr "" + +msgid "password" +msgstr "" + +msgid "last login" +msgstr "" + +msgid "No password set." +msgstr "" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "" + +msgid "The two password fields didn't match." +msgstr "" + +msgid "Password" +msgstr "لفظ اجازت" + +msgid "Password confirmation" +msgstr "" + +msgid "Enter the same password as before, for verification." +msgstr "" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "" + +msgid "This account is inactive." +msgstr "" + +msgid "Email" +msgstr "" + +msgid "New password" +msgstr "نیا لفظ اجازت" + +msgid "New password confirmation" +msgstr "" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "" + +msgid "Old password" +msgstr "پرانا لفظ اجازت" + +msgid "Password (again)" +msgstr "لفظ اجازت (دوبارہ)" + +msgid "algorithm" +msgstr "" + +msgid "iterations" +msgstr "" + +msgid "salt" +msgstr "" + +msgid "hash" +msgstr "" + +msgid "variety" +msgstr "" + +msgid "version" +msgstr "" + +msgid "memory cost" +msgstr "" + +msgid "time cost" +msgstr "" + +msgid "parallelism" +msgstr "" + +msgid "work factor" +msgstr "" + +msgid "checksum" +msgstr "" + +msgid "name" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "codename" +msgstr "" + +msgid "permission" +msgstr "" + +msgid "permissions" +msgstr "" + +msgid "group" +msgstr "" + +msgid "groups" +msgstr "" + +msgid "superuser status" +msgstr "" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "" + +msgid "user permissions" +msgstr "" + +msgid "Specific permissions for this user." +msgstr "" + +msgid "username" +msgstr "" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "" + +msgid "A user with that username already exists." +msgstr "" + +msgid "first name" +msgstr "" + +msgid "last name" +msgstr "" + +msgid "email address" +msgstr "" + +msgid "staff status" +msgstr "" + +msgid "Designates whether the user can log into this admin site." +msgstr "" + +msgid "active" +msgstr "" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" + +msgid "date joined" +msgstr "" + +msgid "user" +msgstr "" + +msgid "users" +msgstr "" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "" + +msgid "Your password can't be too similar to your other personal information." +msgstr "" + +msgid "This password is too common." +msgstr "" + +msgid "Your password can't be a commonly used password." +msgstr "" + +msgid "This password is entirely numeric." +msgstr "" + +msgid "Your password can't be entirely numeric." +msgstr "" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "" + +msgid "Logged out" +msgstr "" + +msgid "Password reset" +msgstr "" + +msgid "Password reset sent" +msgstr "" + +msgid "Enter new password" +msgstr "" + +msgid "Password reset unsuccessful" +msgstr "" + +msgid "Password reset complete" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Password change successful" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..207a858 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,295 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# David , 2019 +# ausaki , 2017 +# jamin M , 2019 +# Jannis Leidel , 2011 +# Kevin Sze , 2012 +# Lele Long , 2011,2015 +# Liping Wang , 2016-2017 +# mozillazg , 2016 +# pylemon , 2012-2013 +# hizyn , 2016 +# ced773123cfad7b4e8b79ca80f736af9, 2011 +# Kevin Sze , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-09-24 13:46+0200\n" +"PO-Revision-Date: 2019-05-26 10:59+0000\n" +"Last-Translator: jamin M \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Personal info" +msgstr "个人信息" + +msgid "Permissions" +msgstr "权限" + +msgid "Important dates" +msgstr "重要日期" + +#, python-format +msgid "%(name)s object with primary key %(key)r does not exist." +msgstr "具有主键 %(key)r 的对象 %(name)s 不存在。" + +msgid "Password changed successfully." +msgstr "密码修改成功。" + +#, python-format +msgid "Change password: %s" +msgstr "修改密码:%s" + +msgid "Authentication and Authorization" +msgstr "认证和授权" + +msgid "password" +msgstr "密码" + +msgid "last login" +msgstr "上次登录" + +msgid "No password set." +msgstr "密码未设置。" + +msgid "Invalid password format or unknown hashing algorithm." +msgstr "不可用的密码格式或未知的哈希算法。" + +msgid "The two password fields didn't match." +msgstr "两个密码字段不一致。" + +msgid "Password" +msgstr "密码" + +msgid "Password confirmation" +msgstr "密码确认" + +msgid "Enter the same password as before, for verification." +msgstr "为了校验,请输入与上面相同的密码。" + +msgid "" +"Raw passwords are not stored, so there is no way to see this user's " +"password, but you can change the password using this form." +msgstr "" +"由于没有存储明文密码,所以无法查看该用户的密码,但是可以通过这个表单修改密码。" + +#, python-format +msgid "" +"Please enter a correct %(username)s and password. Note that both fields may " +"be case-sensitive." +msgstr "请输入一个正确的 %(username)s 和密码. 注意他们都是大区分大小写的." + +msgid "This account is inactive." +msgstr "该帐号未激活。" + +msgid "Email" +msgstr "电子邮件" + +msgid "New password" +msgstr "新密码" + +msgid "New password confirmation" +msgstr "新密码确认" + +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "你的旧密码不正确。请重新输入。" + +msgid "Old password" +msgstr "旧密码" + +msgid "Password (again)" +msgstr "密码(重复)" + +msgid "algorithm" +msgstr "算法" + +msgid "iterations" +msgstr "迭代次数" + +msgid "salt" +msgstr "盐" + +msgid "hash" +msgstr "哈希" + +msgid "variety" +msgstr "多样性" + +msgid "version" +msgstr "版本" + +msgid "memory cost" +msgstr "内存花销" + +msgid "time cost" +msgstr "时间花销" + +msgid "parallelism" +msgstr "对比" + +msgid "work factor" +msgstr "加密因子" + +msgid "checksum" +msgstr "校验和" + +msgid "name" +msgstr "名称" + +msgid "content type" +msgstr "内容类型" + +msgid "codename" +msgstr "代码名称" + +msgid "permission" +msgstr "权限" + +msgid "permissions" +msgstr "权限" + +msgid "group" +msgstr "组" + +msgid "groups" +msgstr "组" + +msgid "superuser status" +msgstr "超级用户状态" + +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "指明该用户缺省拥有所有权限。" + +msgid "" +"The groups this user belongs to. A user will get all permissions granted to " +"each of their groups." +msgstr "该用户归属的组。一个用户将得到其归属的组的所有权限。" + +msgid "user permissions" +msgstr "用户权限" + +msgid "Specific permissions for this user." +msgstr "这个用户的特定权限。" + +msgid "username" +msgstr "用户名" + +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "必填。150个字符或者更少。包含字母,数字和仅有的@/./+/-/_符号。" + +msgid "A user with that username already exists." +msgstr "已存在一位使用该名字的用户。" + +msgid "first name" +msgstr "名字" + +msgid "last name" +msgstr "姓氏" + +msgid "email address" +msgstr "电子邮件地址" + +msgid "staff status" +msgstr "人员状态" + +msgid "Designates whether the user can log into this admin site." +msgstr "指明用户是否可以登录到这个管理站点。" + +msgid "active" +msgstr "有效" + +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "指明用户是否被认为是活跃的。以反选代替删除帐号。" + +msgid "date joined" +msgstr "加入日期" + +msgid "user" +msgstr "用户" + +msgid "users" +msgstr "用户" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "密码长度太短。密码必须包含至少 %(min_length)d 个字符。" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "你的密码必须包含至少 %(min_length)d 个字符。" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "密码跟 %(verbose_name)s 太相似了。" + +msgid "Your password can't be too similar to your other personal information." +msgstr "你的密码不能与你的其他个人信息太相似。" + +msgid "This password is too common." +msgstr "这个密码太常见了。" + +msgid "Your password can't be a commonly used password." +msgstr "你的密码不能是大家都爱用的常见密码。" + +msgid "This password is entirely numeric." +msgstr "密码只包含数字。" + +msgid "Your password can't be entirely numeric." +msgstr "你的密码不能全部为数字。" + +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "重置 %(site_name)s 的密码" + +msgid "" +"Enter a valid username. This value may contain only English letters, " +"numbers, and @/./+/-/_ characters." +msgstr "请输入合法的用户名。只能包含英文字母,数字和@/./+/-/_字符。" + +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." +msgstr "请输入合法用户名。只能包含字母,数字和@/./+/-/_ 字符。" + +msgid "Logged out" +msgstr "登出" + +msgid "Password reset" +msgstr "重置密码" + +msgid "Password reset sent" +msgstr "密码重置链接已经发送。" + +msgid "Enter new password" +msgstr "输入新密码" + +msgid "Password reset unsuccessful" +msgstr "密码重置失败" + +msgid "Password reset complete" +msgstr "密码重置完成" + +msgid "Password change" +msgstr "密码更改" + +msgid "Password change successful" +msgstr "密码更改成功" diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d2ed911 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/auth/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0002_alter_permission_name_max_length.py b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0002_alter_permission_name_max_length.py new file mode 100644 index 0000000..556c320 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0002_alter_permission_name_max_length.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='permission', + name='name', + field=models.CharField(max_length=255, verbose_name='name'), + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0004_alter_user_username_opts.py b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0004_alter_user_username_opts.py new file mode 100644 index 0000000..a16083e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0004_alter_user_username_opts.py @@ -0,0 +1,23 @@ +from django.contrib.auth import validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0003_alter_user_email_max_length'), + ] + + # No database changes; modifies validators and error_messages (#13147). + operations = [ + migrations.AlterField( + model_name='user', + name='username', + field=models.CharField( + error_messages={'unique': 'A user with that username already exists.'}, max_length=30, + validators=[validators.UnicodeUsernameValidator()], + help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', + unique=True, verbose_name='username' + ), + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0005_alter_user_last_login_null.py b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0005_alter_user_last_login_null.py new file mode 100644 index 0000000..97cd105 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0005_alter_user_last_login_null.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0004_alter_user_username_opts'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='last_login', + field=models.DateTimeField(null=True, verbose_name='last login', blank=True), + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0010_alter_group_name_max_length.py b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0010_alter_group_name_max_length.py new file mode 100644 index 0000000..67ea061 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/0010_alter_group_name_max_length.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ] + + operations = [ + migrations.AlterField( + model_name='group', + name='name', + field=models.CharField(max_length=150, unique=True, verbose_name='name'), + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/auth/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/password_validation.py b/venv/lib/python3.7/site-packages/django/contrib/auth/password_validation.py new file mode 100644 index 0000000..948ded6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/password_validation.py @@ -0,0 +1,205 @@ +import functools +import gzip +import re +from difflib import SequenceMatcher +from pathlib import Path + +from django.conf import settings +from django.core.exceptions import ( + FieldDoesNotExist, ImproperlyConfigured, ValidationError, +) +from django.utils.functional import lazy +from django.utils.html import format_html, format_html_join +from django.utils.module_loading import import_string +from django.utils.translation import gettext as _, ngettext + + +@functools.lru_cache(maxsize=None) +def get_default_password_validators(): + return get_password_validators(settings.AUTH_PASSWORD_VALIDATORS) + + +def get_password_validators(validator_config): + validators = [] + for validator in validator_config: + try: + klass = import_string(validator['NAME']) + except ImportError: + msg = "The module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting." + raise ImproperlyConfigured(msg % validator['NAME']) + validators.append(klass(**validator.get('OPTIONS', {}))) + + return validators + + +def validate_password(password, user=None, password_validators=None): + """ + Validate whether the password meets all validator requirements. + + If the password is valid, return ``None``. + If the password is invalid, raise ValidationError with all error messages. + """ + errors = [] + if password_validators is None: + password_validators = get_default_password_validators() + for validator in password_validators: + try: + validator.validate(password, user) + except ValidationError as error: + errors.append(error) + if errors: + raise ValidationError(errors) + + +def password_changed(password, user=None, password_validators=None): + """ + Inform all validators that have implemented a password_changed() method + that the password has been changed. + """ + if password_validators is None: + password_validators = get_default_password_validators() + for validator in password_validators: + password_changed = getattr(validator, 'password_changed', lambda *a: None) + password_changed(password, user) + + +def password_validators_help_texts(password_validators=None): + """ + Return a list of all help texts of all configured validators. + """ + help_texts = [] + if password_validators is None: + password_validators = get_default_password_validators() + for validator in password_validators: + help_texts.append(validator.get_help_text()) + return help_texts + + +def _password_validators_help_text_html(password_validators=None): + """ + Return an HTML string with all help texts of all configured validators + in an
      . + """ + help_texts = password_validators_help_texts(password_validators) + help_items = format_html_join('', '
    • {}
    • ', ((help_text,) for help_text in help_texts)) + return format_html('
        {}
      ', help_items) if help_items else '' + + +password_validators_help_text_html = lazy(_password_validators_help_text_html, str) + + +class MinimumLengthValidator: + """ + Validate whether the password is of a minimum length. + """ + def __init__(self, min_length=8): + self.min_length = min_length + + def validate(self, password, user=None): + if len(password) < self.min_length: + raise ValidationError( + ngettext( + "This password is too short. It must contain at least %(min_length)d character.", + "This password is too short. It must contain at least %(min_length)d characters.", + self.min_length + ), + code='password_too_short', + params={'min_length': self.min_length}, + ) + + def get_help_text(self): + return ngettext( + "Your password must contain at least %(min_length)d character.", + "Your password must contain at least %(min_length)d characters.", + self.min_length + ) % {'min_length': self.min_length} + + +class UserAttributeSimilarityValidator: + """ + Validate whether the password is sufficiently different from the user's + attributes. + + If no specific attributes are provided, look at a sensible list of + defaults. Attributes that don't exist are ignored. Comparison is made to + not only the full attribute value, but also its components, so that, for + example, a password is validated against either part of an email address, + as well as the full address. + """ + DEFAULT_USER_ATTRIBUTES = ('username', 'first_name', 'last_name', 'email') + + def __init__(self, user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7): + self.user_attributes = user_attributes + self.max_similarity = max_similarity + + def validate(self, password, user=None): + if not user: + return + + for attribute_name in self.user_attributes: + value = getattr(user, attribute_name, None) + if not value or not isinstance(value, str): + continue + value_parts = re.split(r'\W+', value) + [value] + for value_part in value_parts: + if SequenceMatcher(a=password.lower(), b=value_part.lower()).quick_ratio() >= self.max_similarity: + try: + verbose_name = str(user._meta.get_field(attribute_name).verbose_name) + except FieldDoesNotExist: + verbose_name = attribute_name + raise ValidationError( + _("The password is too similar to the %(verbose_name)s."), + code='password_too_similar', + params={'verbose_name': verbose_name}, + ) + + def get_help_text(self): + return _("Your password can't be too similar to your other personal information.") + + +class CommonPasswordValidator: + """ + Validate whether the password is a common password. + + The password is rejected if it occurs in a provided list of passwords, + which may be gzipped. The list Django ships with contains 20000 common + passwords (lowercased and deduplicated), created by Royce Williams: + https://gist.github.com/roycewilliams/281ce539915a947a23db17137d91aeb7 + The password list must be lowercased to match the comparison in validate(). + """ + DEFAULT_PASSWORD_LIST_PATH = Path(__file__).resolve().parent / 'common-passwords.txt.gz' + + def __init__(self, password_list_path=DEFAULT_PASSWORD_LIST_PATH): + try: + with gzip.open(str(password_list_path)) as f: + common_passwords_lines = f.read().decode().splitlines() + except IOError: + with open(str(password_list_path)) as f: + common_passwords_lines = f.readlines() + + self.passwords = {p.strip() for p in common_passwords_lines} + + def validate(self, password, user=None): + if password.lower().strip() in self.passwords: + raise ValidationError( + _("This password is too common."), + code='password_too_common', + ) + + def get_help_text(self): + return _("Your password can't be a commonly used password.") + + +class NumericPasswordValidator: + """ + Validate whether the password is alphanumeric. + """ + def validate(self, password, user=None): + if password.isdigit(): + raise ValidationError( + _("This password is entirely numeric."), + code='password_entirely_numeric', + ) + + def get_help_text(self): + return _("Your password can't be entirely numeric.") diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/signals.py b/venv/lib/python3.7/site-packages/django/contrib/auth/signals.py new file mode 100644 index 0000000..6415da4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/signals.py @@ -0,0 +1,5 @@ +from django.dispatch import Signal + +user_logged_in = Signal(providing_args=['request', 'user']) +user_login_failed = Signal(providing_args=['credentials', 'request']) +user_logged_out = Signal(providing_args=['request', 'user']) diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/urls.py b/venv/lib/python3.7/site-packages/django/contrib/auth/urls.py new file mode 100644 index 0000000..c330680 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/urls.py @@ -0,0 +1,20 @@ +# The views used below are normally mapped in django.contrib.admin.urls.py +# This URLs file is used to provide a reliable view deployment for test purposes. +# It is also provided as a convenience to those who want to deploy these URLs +# elsewhere. + +from django.contrib.auth import views +from django.urls import path + +urlpatterns = [ + path('login/', views.LoginView.as_view(), name='login'), + path('logout/', views.LogoutView.as_view(), name='logout'), + + path('password_change/', views.PasswordChangeView.as_view(), name='password_change'), + path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'), + + path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'), + path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'), + path('reset///', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), + path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), +] diff --git a/venv/lib/python3.7/site-packages/django/contrib/auth/validators.py b/venv/lib/python3.7/site-packages/django/contrib/auth/validators.py new file mode 100644 index 0000000..b4878cf --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/auth/validators.py @@ -0,0 +1,25 @@ +import re + +from django.core import validators +from django.utils.deconstruct import deconstructible +from django.utils.translation import gettext_lazy as _ + + +@deconstructible +class ASCIIUsernameValidator(validators.RegexValidator): + regex = r'^[\w.@+-]+$' + message = _( + 'Enter a valid username. This value may contain only English letters, ' + 'numbers, and @/./+/-/_ characters.' + ) + flags = re.ASCII + + +@deconstructible +class UnicodeUsernameValidator(validators.RegexValidator): + regex = r'^[\w.@+-]+$' + message = _( + 'Enter a valid username. This value may contain only letters, ' + 'numbers, and @/./+/-/_ characters.' + ) + flags = 0 diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7165259 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ar/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po new file mode 100644 index 0000000..9e00e7b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ast/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ḷḷumex03 , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-20 02:41+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Asturian (http://www.transifex.com/django/django/language/" +"ast/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "nome de modelu de clas python" + +msgid "content type" +msgstr "triba de conteníu" + +msgid "content types" +msgstr "tribes de conteníu" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a861e2f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..ac56556 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Boris Chervenkov , 2012 +# Georgi Kostadinov , 2012 +# Jannis Leidel , 2011 +# vestimir , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Типове съдържание" + +msgid "python model class name" +msgstr "име на класа на модела в Python" + +msgid "content type" +msgstr "тип на съдържанието" + +msgid "content types" +msgstr "типове съдържание" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Обект с тип на съдържанието %(ct_id)s няма асоцииран модел." + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Обект %(obj_id)s с тип на съдържанието %(ct_id)s не съществува." + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s обекти нямат метода get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4a2a89a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..d8a69a5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "ime python klase modela" + +msgid "content type" +msgstr "tip sadržaja" + +msgid "content types" +msgstr "tipovi sadržaja" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1a5059b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..a65cd70 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Vláďa Macek , 2012,2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " +"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgid "Content Types" +msgstr "Typy obsahu" + +msgid "python model class name" +msgstr "název třídy modelu v Pythonu" + +msgid "content type" +msgstr "typ obsahu" + +msgid "content types" +msgstr "typy obsahu" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Typ obsahu %(ct_id)s nemá přidružený model." + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Objekt %(obj_id)s typu obsahu %(ct_id)s neexistuje." + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Objektům %(ct_name)s chybí metoda get_absolute_url()." diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9b70a06 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d0df270 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/el/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..7c42dd4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/contenttypes/apps.py:12 +msgid "Content Types" +msgstr "" + +#: contrib/contenttypes/models.py:160 +msgid "python model class name" +msgstr "" + +#: contrib/contenttypes/models.py:164 +msgid "content type" +msgstr "" + +#: contrib/contenttypes/models.py:165 +msgid "content types" +msgstr "" + +#: contrib/contenttypes/views.py:19 +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#: contrib/contenttypes/views.py:23 +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#: contrib/contenttypes/views.py:29 +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a209db2 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po new file mode 100644 index 0000000..17c9e15 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/eo/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Baptiste Darthenay , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" +"eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Enhavaj tipoj" + +msgid "python model class name" +msgstr "klasa nomo de pitona modelo" + +msgid "content type" +msgstr "enhava tipo" + +msgid "content types" +msgstr "enhavaj tipoj" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Objekto kun enhava tipo %(ct_id)s ne havas asociitaj modeloj" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Objekto %(obj_id)s kun enhava tipo %(ct_id)s ne ekzistas" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr " %(ct_name)s objektoj ne havas metodon get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..016cd05 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..c325a2e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abraham Estrada, 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" +"language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "nombre de la clase python del modelo" + +msgid "content type" +msgstr "tipo de contenido" + +msgid "content types" +msgstr "tipos de contenido" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" +"Los objetos con el tipo de contenido %(ct_id)s no tienen un modelo asociado" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Los objetos %(obj_id)s con el tipo de contenido %(ct_id)s no existen" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Los %(ct_name)s objetos no tienen el método get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9b0ec57 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..55b01eb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Nikneshan , 2012 +# Jannis Leidel , 2011 +# Reza Mohammadi , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Content Types" +msgstr "نوع‌های محتوا" + +msgid "python model class name" +msgstr "نام پایتونی کلاس مدل" + +msgid "content type" +msgstr "نوع محتوا" + +msgid "content types" +msgstr "نوع‌های محتوا" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "نوع محتوای %(ct_id)s به هیچ مدلی مرتبط نشده است" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "نوع محتوای %(ct_id)s شیی %(obj_id)s وجود ندارد" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr " اشیای %(ct_name)s متد get_absolute_url()‎ را ندارند" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..a79773d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014 +# Claude Paroz , 2012 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Content Types" +msgstr "Types de contenus" + +msgid "python model class name" +msgstr "nom de la classe python du modèle" + +msgid "content type" +msgstr "type de contenu" + +msgid "content types" +msgstr "types de contenu" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "L'objet type de contenu %(ct_id)s n'a pas de modèle associé" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "L'objet %(obj_id)s du type de contenu %(ct_id)s n'existe pas" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Les objets %(ct_name)s n'ont pas de méthode get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..489bbab Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/fy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6b0363a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ga/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po new file mode 100644 index 0000000..bbd7c91 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gd/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# GunChleoc, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-22 17:29+0000\n" +"Last-Translator: GunChleoc\n" +"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" +"language/gd/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gd\n" +"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" + +msgid "Content Types" +msgstr "Seòrsaichean susbainte" + +msgid "python model class name" +msgstr "ainm clas air modail python" + +msgid "content type" +msgstr "seòrsa susbainte" + +msgid "content types" +msgstr "seòrsaichean susbainte" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" +"Chan eil modail co-cheangailte ris an oibseact le seòrsa susbaint %(ct_id)s" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Chan eil an oibseact %(obj_id)s le seòrsa susbaint %(ct_id)s ann" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Chan eil am modh get_absolute_url() aig na h-oibseactan %(ct_name)s" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e26ac69 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7443445 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..444787e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016 +# Attila Nagy <>, 2012 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: János R (Hangya)\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Tartalom típusok" + +msgid "python model class name" +msgstr "python modell osztály neve" + +msgid "content type" +msgstr "tartalom típusa" + +msgid "content types" +msgstr "tartalom típusok" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "A %(ct_id)s tartalomtípus-objektumhoz nincsenek modellek hozzárendelve" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "%(ct_id)s tartalomtípus-objektum %(obj_id)s nem található" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s objektumoknak nincs get_absolute_url() metódusuk" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a62ddff Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/hy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fa1a9e4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..c66c3a0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Marco Bonetti, 2014 +# Nicola Larosa , 2012 +# Stefano Brentegani , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: palmux \n" +"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Content Type" + +msgid "python model class name" +msgstr "nome della classe del modello Python" + +msgid "content type" +msgstr "content type" + +msgid "content types" +msgstr "content type" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "L'oggetto con content type %(ct_id)s non ha alcun modello associato" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "L'oggetto %(obj_id)s con content type %(ct_id)s non esiste" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Gli oggetti %(ct_name)s non hanno un metodo get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..6c5c821 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013,2015 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: André Bouatchidzé \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "კონტენტის ტიპები" + +msgid "python model class name" +msgstr "python-ის მოდელის კლასის სახელი" + +msgid "content type" +msgstr "კონტენტის ტიპი" + +msgid "content types" +msgstr "კონტენტის ტიპები" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "კონტენტის ტიპის %(ct_id)s ობიექტს არ გააჩნია ასოცირებული მოდელი" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "კონტენტის ტიპის %(ct_id)s ობიექტი %(obj_id)s არ არსებობს" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s ობიექტებს არ გააჩნიათ მეთოდი get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..674077a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Khmer (http://www.transifex.com/django/django/language/km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "ឈ្មោះ python model class" + +msgid "content type" +msgstr "ប្រភេទអត្ថន័យ" + +msgid "content types" +msgstr "ប្រភេទអត្ថន័យ" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5b7937f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9a241d6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/lv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ca4d926 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..e8a455b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Vasil Vangelovski , 2014 +# Vasil Vangelovski , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: dekomote \n" +"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" +"mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgid "Content Types" +msgstr "Типови содржини" + +msgid "python model class name" +msgstr "име на класата за python моделoт" + +msgid "content type" +msgstr "тип на содржина" + +msgid "content types" +msgstr "типови содржини" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Типот на содржина %(ct_id)s објект нема асоциран модел" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Типот на содржина %(ct_id)s објект %(obj_id)s не постои" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s објекти немаат get_absolute_url() метод" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000..70458b6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ml/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..822bd2e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "content types" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..03d84f2 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..e5fc0fc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Yhal Htet Aung , 2013,2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Yhal Htet Aung \n" +"Language-Team: Burmese (http://www.transifex.com/django/django/language/" +"my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "အကြောင်းအရာအမျိုးအစားများ" + +msgid "python model class name" +msgstr "စပါးကြီးမော်ဒယ်အမျိုးအစားနာမည်" + +msgid "content type" +msgstr "အကြောင်းအရာအမျိုးအစား" + +msgid "content types" +msgstr "အကြောင်းအရာအမျိုးအစားများ" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "အကြောင်းအရာအမျိုးအစား %(ct_id)s အရာဝတ္ထုမှာဆက်နွယ်သောမော်ဒယ်မရှိ" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "အကြောင်းအရာအမျိုးအစား %(ct_id)s အရာဝတ္ထု %(obj_id)s မတည်ရှိနေ" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s အရာဝတ္ထုများ get_absolute_url() နည်းလမ်းမရှိ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..77f05f4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..bfcaea4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,43 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# jensadne , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" +"language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "python-modell klassenamn" + +msgid "content type" +msgstr "innhaldstype" + +msgid "content types" +msgstr "innhaldstypar" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Innhaldstype %(ct_id)s-objektet har ingen modell knytta til seg" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Innhaldstype %(ct_id)s-objektet med id %(obj_id)s finst ikkje" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s-objekt har ingen get_absolute_url()-metode" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..95e193d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Nuno Mariz , 2011-2012 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Tipos de Conteúdo" + +msgid "python model class name" +msgstr "nome da classe do model em python" + +msgid "content type" +msgstr "tipo de conteúdo" + +msgid "content types" +msgstr "tipos de conteúdos" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Objeto do tipo de conteúdo %(ct_id)s não tem nenhum model associado" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Objeto %(obj_id)s do tipo de conteúdo %(ct_id)s não existe" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Objetos %(ct_name)s não tem um método get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..bc9b33b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,44 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Marian Andre , 2012 +# Martin Tóth , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Martin Tóth \n" +"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " +">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgid "Content Types" +msgstr "Typy Obsahu" + +msgid "python model class name" +msgstr "pythonovské meno triedy modelu" + +msgid "content type" +msgstr "typ obsahu" + +msgid "content types" +msgstr "typy obsahu" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Objekt typu obsahu %(ct_id)s nemá pridružený model" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Objekt %(obj_id)s typu obsahu %(ct_id)s neexistuje" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr " Objekty %(ct_name)s neobsahujú metódu get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..d13e0dc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# zejn , 2016 +# zejn , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Content Types" +msgstr "vrste vsebine" + +msgid "python model class name" +msgstr "ime razreda modela python" + +msgid "content type" +msgstr "vrsta vsebine" + +msgid "content types" +msgstr "vrste vsebine" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Predmet vrste vsebine %(ct_id)s nima določenega povezanega modela" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Predmet %(obj_id)s vrste %(ct_id)s ne obstaja" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Predmeti vrste %(ct_name)s nimajo določila get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..197458d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +# Jannis Leidel , 2011 +# Janos Guljas , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-01-30 10:08+0000\n" +"Last-Translator: Branko Kokanovic \n" +"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Content Types" +msgstr "Типови садржаја" + +msgid "python model class name" +msgstr "име python класе модела" + +msgid "content type" +msgstr "тип садржаја" + +msgid "content types" +msgstr "типови садржаја" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Тип садржаја %(ct_id)s нема асоцирани модел" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Тип садржаја %(ct_id)s објекта %(obj_id)s не постоји" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Објекти %(ct_name)s немају метод get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a2afb6b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a9b9575 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 0000000..15d1a1b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Andreas Pelme , 2012 +# Jannis Leidel , 2011 +# Jonathan Lindén, 2014 +# Thomas Lundqvist, 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2019-02-26 11:20+0000\n" +"Last-Translator: Thomas Lundqvist\n" +"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "Innehållstyper" + +msgid "python model class name" +msgstr "klassnamn för Python-modell" + +msgid "content type" +msgstr "innehållstyp" + +msgid "content types" +msgstr "innehållstyper" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Innehållstypens %(ct_id)s har ingen associerad modell." + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "Innehållstypens %(ct_id)s objekt %(obj_id)s finns inte" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s objekt har inte en get_absolute_url()-metod" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..4f9d8bc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "" + +msgid "content type" +msgstr "aina ya maudhui" + +msgid "content types" +msgstr "aina ya maudhui" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..5a524c3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "python model class name" + +msgid "content type" +msgstr "பொருளடக்க வகை" + +msgid "content types" +msgstr "பொருளடக்க வகைகள்" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo new file mode 100644 index 0000000..732d4e9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..ca476cd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "పైతాన్ మొడల్ క్లాస్ పేరు" + +msgid "content type" +msgstr "సూచన రకం" + +msgid "content types" +msgstr "సూచన రకాలు" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..8ab409e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kowit Charoenratchatabhan , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "python model class name" + +msgid "content type" +msgstr "content type" + +msgid "content types" +msgstr "content types" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "ประเภทของเนื้อหา %(ct_id)s ไม่มีอ็อบเจ็กที่มีรูปแบบที่เกี่ยวข้อง" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "ไม่มีประเภทของเนื้อหา %(ct_id)s วัตถุ %(obj_id)s" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s ไม่มีเมธอด get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po new file mode 100644 index 0000000..a8f7e88 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/udm/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" +"udm/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: udm\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "" + +msgid "content type" +msgstr "" + +msgid "content types" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po new file mode 100644 index 0000000..d7af4ce --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/uk/LC_MESSAGES/django.po @@ -0,0 +1,48 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Oleksandr Chernihov , 2014 +# Jannis Leidel , 2011 +# Sergey Lysach , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" +"uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != " +"11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % " +"100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " +"(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +msgid "Content Types" +msgstr "Content Types" + +msgid "python model class name" +msgstr "ім'я класу моделі" + +msgid "content type" +msgstr "тип вмісту" + +msgid "content types" +msgstr "типи вмісту" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "Тип вмісту %(ct_id)s не має пов'язанної моделі" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" +"Об'єкт з ідентифікатором %(ct_id)s, що має тип вмісту %(obj_id)s не існує" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "Об'єкт типу %(ct_name)s не має методу get_absolute_url()" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f6ff919 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..075af1f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,41 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mansoorulhaq Mansoor , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Content Types" +msgstr "" + +msgid "python model class name" +msgstr "پائثان کے ماڈل کی کلاس کا نام" + +msgid "content type" +msgstr "مضمون کی قسم" + +msgid "content types" +msgstr "مضمون کی اقسام" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..b6f4f7d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Ronald White , 2014 +# slene , 2011 +# Kevin Sze , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Content Types" +msgstr "内容类型" + +msgid "python model class name" +msgstr "python 模型类名" + +msgid "content type" +msgstr "内容类型" + +msgid "content types" +msgstr "内容类型" + +#, python-format +msgid "Content type %(ct_id)s object has no associated model" +msgstr "内容类型 %(ct_id)s 对象没有关联的模型" + +#, python-format +msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgstr "内容类型 %(ct_id)s 对象 %(obj_id)s 不存在" + +#, python-format +msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgstr "%(ct_name)s 对象没有 a get_absolute_url() 方法" diff --git a/venv/lib/python3.7/site-packages/django/contrib/contenttypes/views.py b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/views.py new file mode 100644 index 0000000..8c19483 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/contenttypes/views.py @@ -0,0 +1,88 @@ +from django.apps import apps +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.shortcuts import get_current_site +from django.core.exceptions import ObjectDoesNotExist +from django.http import Http404, HttpResponseRedirect +from django.utils.translation import gettext as _ + + +def shortcut(request, content_type_id, object_id): + """ + Redirect to an object's page based on a content-type ID and an object ID. + """ + # Look up the object, making sure it's got a get_absolute_url() function. + try: + content_type = ContentType.objects.get(pk=content_type_id) + if not content_type.model_class(): + raise Http404( + _("Content type %(ct_id)s object has no associated model") % + {'ct_id': content_type_id} + ) + obj = content_type.get_object_for_this_type(pk=object_id) + except (ObjectDoesNotExist, ValueError): + raise Http404( + _("Content type %(ct_id)s object %(obj_id)s doesn't exist") % + {'ct_id': content_type_id, 'obj_id': object_id} + ) + + try: + get_absolute_url = obj.get_absolute_url + except AttributeError: + raise Http404( + _("%(ct_name)s objects don't have a get_absolute_url() method") % + {'ct_name': content_type.name} + ) + absurl = get_absolute_url() + + # Try to figure out the object's domain, so we can do a cross-site redirect + # if necessary. + + # If the object actually defines a domain, we're done. + if absurl.startswith(('http://', 'https://', '//')): + return HttpResponseRedirect(absurl) + + # Otherwise, we need to introspect the object's relationships for a + # relation to the Site object + try: + object_domain = get_current_site(request).domain + except ObjectDoesNotExist: + object_domain = None + + if apps.is_installed('django.contrib.sites'): + Site = apps.get_model('sites.Site') + opts = obj._meta + + for field in opts.many_to_many: + # Look for a many-to-many relationship to Site. + if field.remote_field.model is Site: + site_qs = getattr(obj, field.name).all() + if object_domain and site_qs.filter(domain=object_domain).exists(): + # The current site's domain matches a site attached to the + # object. + break + # Caveat: In the case of multiple related Sites, this just + # selects the *first* one, which is arbitrary. + site = site_qs.first() + if site: + object_domain = site.domain + break + else: + # No many-to-many relationship to Site found. Look for a + # many-to-one relationship to Site. + for field in obj._meta.fields: + if field.remote_field and field.remote_field.model is Site: + try: + site = getattr(obj, field.name) + except Site.DoesNotExist: + continue + if site is not None: + object_domain = site.domain + break + + # If all that malarkey found an object domain, use it. Otherwise, fall back + # to whatever get_absolute_url() returned. + if object_domain is not None: + protocol = request.scheme + return HttpResponseRedirect('%s://%s%s' % (protocol, object_domain, absurl)) + else: + return HttpResponseRedirect(absurl) diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/forms.py b/venv/lib/python3.7/site-packages/django/contrib/flatpages/forms.py new file mode 100644 index 0000000..4d4b5c8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/forms.py @@ -0,0 +1,69 @@ +from django import forms +from django.conf import settings +from django.contrib.flatpages.models import FlatPage +from django.utils.translation import gettext, gettext_lazy as _ + + +class FlatpageForm(forms.ModelForm): + url = forms.RegexField( + label=_("URL"), + max_length=100, + regex=r'^[-\w/\.~]+$', + help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."), + error_messages={ + "invalid": _( + "This value must contain only letters, numbers, dots, " + "underscores, dashes, slashes or tildes." + ), + }, + ) + + class Meta: + model = FlatPage + fields = '__all__' + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not self._trailing_slash_required(): + self.fields['url'].help_text = _( + "Example: '/about/contact'. Make sure to have a leading slash." + ) + + def _trailing_slash_required(self): + return ( + settings.APPEND_SLASH and + 'django.middleware.common.CommonMiddleware' in settings.MIDDLEWARE + ) + + def clean_url(self): + url = self.cleaned_data['url'] + if not url.startswith('/'): + raise forms.ValidationError( + gettext("URL is missing a leading slash."), + code='missing_leading_slash', + ) + if self._trailing_slash_required() and not url.endswith('/'): + raise forms.ValidationError( + gettext("URL is missing a trailing slash."), + code='missing_trailing_slash', + ) + return url + + def clean(self): + url = self.cleaned_data.get('url') + sites = self.cleaned_data.get('sites') + + same_url = FlatPage.objects.filter(url=url) + if self.instance.pk: + same_url = same_url.exclude(pk=self.instance.pk) + + if sites and same_url.filter(sites__in=sites).exists(): + for site in sites: + if same_url.filter(sites=site).exists(): + raise forms.ValidationError( + _('Flatpage with url %(url)s already exists for site %(site)s'), + code='duplicate_url', + params={'url': url, 'site': site}, + ) + + return super().clean() diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..412d640 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po new file mode 100644 index 0000000..8a49be2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# F Wolff , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 05:25+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"af/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Gevorderde keuses" + +msgid "Flat Pages" +msgstr "Plat bladsye" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Voorbeeld: “/about/contact/”. Maak seker dat daar skuinsstrepe voor en agter " +"staan." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Hierdie waarde moet slegs letters, syfers, punte, onderstrepies, " +"koppeltekens, skuinsstrepe of tildes bevat." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Voorbeeld: “/about/contact”. Maak seker daar is ’n skuinsstreep vooraan." + +msgid "URL is missing a leading slash." +msgstr "’n Skuinsstreep ontbreek vooraan URL." + +msgid "URL is missing a trailing slash." +msgstr "’n Skuinsstreep ontbreek agteraan URL." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Plat bladsy met URL %(url)s bestaan reeds vir die werf %(site)s" + +msgid "title" +msgstr "titel" + +msgid "content" +msgstr "inhoud" + +msgid "enable comments" +msgstr "aktiveer opmerkings" + +msgid "template name" +msgstr "sjabloonnaam" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Voorbeeld: “flatpages/contact_page.html”. As hierdie nie verskaf word nie " +"sal die stelsel “flatpages/default.html” gebruik." + +msgid "registration required" +msgstr "registrasie benodig" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"As hierdie gemerk is, sal slegs aangemelde gebruikers die bladsy kan bekyk." + +msgid "sites" +msgstr "werwe" + +msgid "flat page" +msgstr "plat bladsy" + +msgid "flat pages" +msgstr "plat bladsye" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fb86fac Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..acafa96 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Ismayilov , 2011 +# Dimitris Glezos , 2012 +# Emin Mastizada , 2018 +# Emin Mastizada , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2018-04-27 13:20+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Əlavə imkanlar" + +msgid "Flat Pages" +msgstr "Flat Səhifələr" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Məsələn, \"/about/contact/\". Əvvəldə və sondakı kəsr xəttinin olmasına " +"diqqət edin." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Burada yalnız hərf, rəqəm, nöqtə, altdan xətt, defis, kəsr xətti və ya " +"tildadan istifadə etmək olar." + +msgid "URL is missing a leading slash." +msgstr "Ünvan başlanğıcında çəp xətt əksikdir." + +msgid "URL is missing a trailing slash." +msgstr "Ünvan sonunda çəp xətt əksikdir." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "%(site)s saytı üçün artıq %(url)s ünvanlı Flatpage mövcuddur" + +msgid "title" +msgstr "başlıq" + +msgid "content" +msgstr "məzmun" + +msgid "enable comments" +msgstr "şərhlər olsun" + +msgid "template name" +msgstr "şablonun adı" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Məsələn, \"flatpages/contact_page.html\". Əgər göstərməsəniz, biz " +"\"flatpages/default.html\" şablonundan istifadə edəcəyik." + +msgid "registration required" +msgstr "ancaq qeydiyyatlılar üçün" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Əgər bura quş qoysanız, ancaq qeydiyyatdan keçib sayta daxil olmuş " +"istifadəçilər bu səhifəni görə biləcəklər." + +msgid "sites" +msgstr "saytlar" + +msgid "flat page" +msgstr "adi səhifə" + +msgid "flat pages" +msgstr "adi səhifələr" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8904a62 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/be/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo new file mode 100644 index 0000000..48e491e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..8fb6f1f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,95 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fulup , 2012 +# Irriep Nala Novram , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-12 14:19+0000\n" +"Last-Translator: Irriep Nala Novram \n" +"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: br\n" +"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" +"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" +"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " +"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " +"&& n % 1000000 == 0) ? 3 : 4);\n" + +msgid "Advanced options" +msgstr "Dibarzhioù araokaet" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Da skouer: '/diwar-benn/darempred/'. Bezit sur da gaout beskellioù \"/\" e " +"penn-kentañ hag e fin ar chadenn." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"An dalvoudegezh-mañ a c'hall enderc'hel lizherennoù hepken, sifroù, pikoù, " +"barrennigoù islinennañ, beskellioù pe tildeoù c'hoazh." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" + +msgid "URL is missing a leading slash." +msgstr "An URL a vank enni ur veskell \"/\" en he fenn-kentañ." + +msgid "URL is missing a trailing slash." +msgstr "An URL a vank enni ur veskell \"/\" en he dilost." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" +"Ar bajenn difiñv d'an URL %(url)s a zo anezhi e-barzh al lec'hienn %(site)s " +"endeo" + +msgid "title" +msgstr "titl" + +msgid "content" +msgstr "danvez" + +msgid "enable comments" +msgstr "aotren an evezhiadennoù" + +msgid "template name" +msgstr "anv patrom" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Da skouer : 'flatpages/contact_page.html'. Ma neket pourvezet, ar sistem a " +"raio gant 'flatpages/default.html'." + +msgid "registration required" +msgstr "enskrivadur rekiset" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Ma vez kochet, ar bajenn a c'hallo bezañ gwelet gant an implijerien kevreet " +"hepken." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "pajenn difiñv" + +msgid "flat pages" +msgstr "pajennoù difiñv" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..752f8f3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..3a75b89 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2011 +# Carles Barrobés , 2012,2014 +# Gil Obradors Via , 2019 +# Jannis Leidel , 2011 +# Roger Pons , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-29 07:52+0000\n" +"Last-Translator: Gil Obradors Via \n" +"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Opcions avançades" + +msgid "Flat Pages" +msgstr "Pàgines Estàtiques" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Exemple: '/about/contact/'. Assegureu-vos de posar les barres al principi i " +"al final." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Aquest valor sols pot contenir lletres, nombres, punts, subratllats, guions, " +"barres o accents." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Exemple: '/quanta/contacte'. Assegura l'última barra inversa" + +msgid "URL is missing a leading slash." +msgstr "La URL no comença amb \"/\"." + +msgid "URL is missing a trailing slash." +msgstr "La URL no acaba amb \"/\"." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Ja hi ha una pàgina estàtica amb la URL %(url)s per al lloc %(site)s" + +msgid "title" +msgstr "títol" + +msgid "content" +msgstr "contingut" + +msgid "enable comments" +msgstr "habilitar comentaris" + +msgid "template name" +msgstr "nom de la plantilla" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Exemple: 'flatpages/contact_page.html'. Si no es proporciona, el sistema " +"utilitzarà 'flatpages/default.html'." + +msgid "registration required" +msgstr "cal estar registrat" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Si està marcat, només els usuaris registrats podran veure la pàgina." + +msgid "sites" +msgstr "llocs" + +msgid "flat page" +msgstr "pàgina estàtica" + +msgid "flat pages" +msgstr "pàgines estàtiques" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..b910e11 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Maredudd ap Gwyndaf , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " +"11) ? 2 : 3;\n" + +msgid "Advanced options" +msgstr "Opsiynau uwch" + +msgid "Flat Pages" +msgstr "Tudalennau Fflat" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Enghraifft: '/amdanom/cyswllt/'. Sicrhewch fod gennych slaesau ar y dechrau " +"a'r diwedd." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Gall y gwerth hwn ond gynnwys llythrennau, rhifau, dotiau, tanlinellau, " +"llinellau doriad, slaesau neu tildeau." + +msgid "URL is missing a leading slash." +msgstr "Mae'r slaes ar goll ar ddechrau'r URL." + +msgid "URL is missing a trailing slash." +msgstr "Mae slaes ar goll ar ddiwedd yr URL." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" +"Mae flatpage gyda'r url %(url)s yn bodoli yn barod am y safle %(site)s" + +msgid "title" +msgstr "teitl" + +msgid "content" +msgstr "cynnwys" + +msgid "enable comments" +msgstr "galluogi sylwadau" + +msgid "template name" +msgstr "enw'r templed" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Enghraifft: 'flatpages/tudalen_cyswllt.html'. Os na ddarparir hyn, bydd y " +"system yn defnyddio 'flatpages/default.html'." + +msgid "registration required" +msgstr "cofrestriad gofynnol" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Os ticir hwn, dim ond defnyddwyr sydd wedi mewngofnodi bydd yn gallu gweld y " +"dudalen." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "tudalen fflat" + +msgid "flat pages" +msgstr "tudalennau fflat" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b17376a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..458c544 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christian Joergensen , 2012 +# Erik Wognsen , 2012,2014-2015,2019 +# Finn Gruwier Larsen, 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 07:25+0000\n" +"Last-Translator: Erik Wognsen \n" +"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Avancerede muligheder" + +msgid "Flat Pages" +msgstr "Flade sider" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Eksempel: '/om/kontakt/'. Vær opmærksom på, at der skal være skråstreg både " +"først og sidst." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Denne værdi må kun indeholde bogstaver, tal, punktum, understreger, " +"bindestreger, skråstreger eller tilder." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Eksempel: '/om/kontakt/'. Vær opmærksom på, at der skal være skråstreg først." + +msgid "URL is missing a leading slash." +msgstr "URL mangler en skråstreg i starten." + +msgid "URL is missing a trailing slash." +msgstr "URL mangler en afsluttende skråstreg." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "En flad side med URL'en %(url)s eksisterer allerede for siden %(site)s" + +msgid "title" +msgstr "titel" + +msgid "content" +msgstr "indhold" + +msgid "enable comments" +msgstr "tillad kommentarer" + +msgid "template name" +msgstr "skabelonnavn" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Eksempel: 'flatpages/kontaktside'. Hvis dette ikke tilbydes, bruger systemet " +"'flatpages/default'." + +msgid "registration required" +msgstr "registrering påkrævet" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Hvis denne boks er markeret, vil kun brugere der er logget ind, kunne se " +"siden." + +msgid "sites" +msgstr "websider" + +msgid "flat page" +msgstr "flad side" + +msgid "flat pages" +msgstr "flade sider" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..3467bd6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,96 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/flatpages/admin.py:12 +msgid "Advanced options" +msgstr "" + +#: contrib/flatpages/apps.py:7 +msgid "Flat Pages" +msgstr "" + +#: contrib/flatpages/forms.py:9 contrib/flatpages/models.py:9 +msgid "URL" +msgstr "" + +#: contrib/flatpages/forms.py:12 +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" + +#: contrib/flatpages/forms.py:15 +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" + +#: contrib/flatpages/forms.py:29 +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" + +#: contrib/flatpages/forms.py:42 +msgid "URL is missing a leading slash." +msgstr "" + +#: contrib/flatpages/forms.py:47 +msgid "URL is missing a trailing slash." +msgstr "" + +#: contrib/flatpages/forms.py:64 +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +#: contrib/flatpages/models.py:10 +msgid "title" +msgstr "" + +#: contrib/flatpages/models.py:11 +msgid "content" +msgstr "" + +#: contrib/flatpages/models.py:12 +msgid "enable comments" +msgstr "" + +#: contrib/flatpages/models.py:14 +msgid "template name" +msgstr "" + +#: contrib/flatpages/models.py:18 +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" + +#: contrib/flatpages/models.py:23 +msgid "registration required" +msgstr "" + +#: contrib/flatpages/models.py:24 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" + +#: contrib/flatpages/models.py:27 +msgid "sites" +msgstr "" + +#: contrib/flatpages/models.py:31 +msgid "flat page" +msgstr "" + +#: contrib/flatpages/models.py:32 +msgid "flat pages" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..c977035 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,86 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ernesto Avilés Vázquez , 2014-2015 +# Jannis Leidel , 2011 +# Veronicabh , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-20 03:01+0000\n" +"Last-Translator: Carlos Muñoz \n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" +"language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Opciones avanzadas" + +msgid "Flat Pages" +msgstr "Páginas estáticas" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al " +"final." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Este valor solo puede contener letras, números, puntos, guiones bajos o " +"medios, barras o tildes." + +msgid "URL is missing a leading slash." +msgstr "A la URL le falta la barra inicial." + +msgid "URL is missing a trailing slash." +msgstr "A la URL le falta la barra final." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr " En el sitio %(site)s ya hay un Flatpage con la url %(url)s" + +msgid "title" +msgstr "título" + +msgid "content" +msgstr "contenido" + +msgid "enable comments" +msgstr "habilitar comentarios" + +msgid "template name" +msgstr "nombre de plantilla" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Ejemplo: 'flatpages/contact_page.html'. Si no se proporciona uno, el sistema " +"usará 'flatpages/default.html'." + +msgid "registration required" +msgstr "debe estar registrado" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página." + +msgid "sites" +msgstr "sitios" + +msgid "flat page" +msgstr "página estática" + +msgid "flat pages" +msgstr "páginas estáticas" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9b3ce53 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fb86c09 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..0e1c7c5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,85 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Janno Liivak , 2013-2015 +# madisvain , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Janno Liivak \n" +"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Lisavalikud" + +msgid "Flat Pages" +msgstr "Sisulehed" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Näide: '/about/contact/'. Veenduge, et URL algaks ja lõppeks kaldkriipsuga." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"See väärtus peab sisaldama ainult tähti, numbreid, punkte, alakriipse, " +"kriipse, kaldkriipse või tildeseid." + +msgid "URL is missing a leading slash." +msgstr "Internetiaadressil puudub alustav kaldkriips" + +msgid "URL is missing a trailing slash." +msgstr "Internetiaadressil puudub lõpetav kaldkriips" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Saidil %(site)s on sisuleht aadressiga %(url)s juba olemas" + +msgid "title" +msgstr "pealkiri" + +msgid "content" +msgstr "sisu" + +msgid "enable comments" +msgstr "võimalda kommentaarid" + +msgid "template name" +msgstr "mall" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Näide: 'flatpages/contact_page.html'. Kui mall on määramata, kasutatakse " +"vaikimisi malli 'flatpages/default.html'." + +msgid "registration required" +msgstr "registreerumine nõutav" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Kui see on valitud, näevad lehte ainult sisselogitud kasutajad" + +msgid "sites" +msgstr "saidid" + +msgid "flat page" +msgstr "sisuleht" + +msgid "flat pages" +msgstr "sisulehed" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b49fd45 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/eu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..091b0af Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..df95fb4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015 +# Jannis Leidel , 2011 +# Klaus Dahlén , 2012 +# Ville Säävuori , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Lisäasetukset" + +msgid "Flat Pages" +msgstr "Tekstisivut" + +msgid "URL" +msgstr "URL-osoite" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Esimerkki: '/tietoja/yhteystiedot/'. Varmista, että sekä alussa että lopussa " +"on kauttaviiva." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Tämä arvo saa sisältää vain kirjaimia, numeroita, pisteitä sekä ala-, tavu-, " +"kautta- ja aaltoviivoja." + +msgid "URL is missing a leading slash." +msgstr "URL:n alusta puuttuu kauttaviiva." + +msgid "URL is missing a trailing slash." +msgstr "URL:n lopusta puuttuu kauttaviiva." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Sivustolla %(site)s on jo sivu, jonka URL on %(url)s" + +msgid "title" +msgstr "otsikko" + +msgid "content" +msgstr "sisältö" + +msgid "enable comments" +msgstr "salli kommentit" + +msgid "template name" +msgstr "mallipohjan nimi" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Esimerkiksi: 'flatpages/yhteydenotto.html'. Jos tämä jätetään tyhjäksi, " +"käytetään oletuspohjaa 'flatpages/default.html'." + +msgid "registration required" +msgstr "vaaditaan rekisteröityminen" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Jos tämä kohta on valittu, vain sisäänkirjautuneet käyttäjät näkevät sivun." + +msgid "sites" +msgstr "sivustot" + +msgid "flat page" +msgstr "tekstisivu" + +msgid "flat pages" +msgstr "tekstisivut" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e5812c5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/fr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po new file mode 100644 index 0000000..1851834 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hi/LC_MESSAGES/django.po @@ -0,0 +1,81 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chandan kumar , 2012 +# Jannis Leidel , 2011 +# Sandeep Satavlekar , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "उन्नत विकल्प" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "अग्रणी है और अनुगामी स्लैश का होना सुनिश्चित करें. उदाहरण: '/about/contact/'" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "इस मूल्य में सिर्फ वर्णाक्षर, अंक, बिंदु, रेखांकन, डैश, स्लैश और टिल्ड्स ही होने चाहिए" + +msgid "URL is missing a leading slash." +msgstr "यूआरएल से प्रमुख स्लैश गायब है." + +msgid "URL is missing a trailing slash." +msgstr "यूआरएल से अनुगामी स्लैश गायब है." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "%(site)s साइट के लिए %(url)s यूआरएल के साथ चपटापृष्ट मौजूद है." + +msgid "title" +msgstr "शीर्षक" + +msgid "content" +msgstr "विषय सूची" + +msgid "enable comments" +msgstr "टिप्पणियां सक्षम करें" + +msgid "template name" +msgstr "सांचे का नाम" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"उदाहरण: 'flatpages/contact_page.html'. यदि यह जिक्र नहीं किया तो यह प्रणाली " +"'flatpages/default.html' का प्रयोग करेगी. ." + +msgid "registration required" +msgstr "पंजीकरण आवश्यक" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "अगर इस जाँच की है, केवल लॉग इन करने वालों के लिए पृष्ठ देखने में सक्षम हो जाएगा." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "चपटा पृष्ट" + +msgid "flat pages" +msgstr "चपटे पृष्ट" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..7e7c163 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# aljosa , 2011-2012 +# Jannis Leidel , 2011 +# Mislav Cimperšak , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Mislav Cimperšak \n" +"Language-Team: Croatian (http://www.transifex.com/django/django/language/" +"hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgid "Advanced options" +msgstr "Napredne opcije" + +msgid "Flat Pages" +msgstr "Statične stranice" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Primjer: '/about/contact/'. Provjerite ako imate prvi i preostale slash-eve " +"(/)." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Ova vrijednost može sadržavati samo slova, brojeve, točke, podvlake, crtice, " +"kose crte ili tilde." + +msgid "URL is missing a leading slash." +msgstr "URL-u nedostaje početni /." + +msgid "URL is missing a trailing slash." +msgstr "URL-u nedostaje / na kraju." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Stranica sa URL-om %(url)s već postoji za web %(site)s" + +msgid "title" +msgstr "naslov" + +msgid "content" +msgstr "sadržaj" + +msgid "enable comments" +msgstr "uključi komentare" + +msgid "template name" +msgstr "ime template-a" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Primjer: 'flatpages/contact_page.html'. Ako navedeno nije definirano sistem " +"će koristiti 'flatpages/default.html'." + +msgid "registration required" +msgstr "registracija obavezna" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Ako je ovo selektirano samo logirani korisnici moći će vidjeti ovu stranicu." + +msgid "sites" +msgstr "stranice" + +msgid "flat page" +msgstr "statična stranica" + +msgid "flat pages" +msgstr "statične stranice" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..91678ca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016,2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-04 13:53+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Advanced options" +msgstr "Rozšěrjene nastajenja" + +msgid "Flat Pages" +msgstr "Statiske strony" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Přikład: '/about/contact/'. Přeswědčće so, zo sće wočinjace a začinjace " +"nakósne smužki podał." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Tuta hódnota smě jenož pismiki, ličby, dypki, podsmužki, wjazawki, nakósne " +"smužki abo tildy wobsahować." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Přikład: 'about/contact'. Zawěsćće, zo maće nawodnu nakósnu smužku." + +msgid "URL is missing a leading slash." +msgstr "URL wočinjacu nakósnu smužku nima." + +msgid "URL is missing a trailing slash." +msgstr "URL začinjacu nakósnu smužku nima." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Statiska strona z url %(url)s hižo za sydło %(site)s eksistuje" + +msgid "title" +msgstr "titul" + +msgid "content" +msgstr "wobsah" + +msgid "enable comments" +msgstr "komentary zmóžnić" + +msgid "template name" +msgstr "mjeno předłohi" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Přikład: 'flatpages/contact_page.html'. Jeli to njeje podate, budźe system " +"'flatpages/default.html' wužiwać." + +msgid "registration required" +msgstr "registrowanje trěbne" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Jeli to je zmóžnjene, móža sej jenož přizjewjeni wužiwarjo stronu wobhladać." + +msgid "sites" +msgstr "sydła" + +msgid "flat page" +msgstr "statiska strona" + +msgid "flat pages" +msgstr "statiske strony" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..3df229d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,77 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" + +msgid "URL is missing a leading slash." +msgstr "" + +msgid "URL is missing a trailing slash." +msgstr "" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +msgid "title" +msgstr "" + +msgid "content" +msgstr "" + +msgid "enable comments" +msgstr "" + +msgid "template name" +msgstr "" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" + +msgid "registration required" +msgstr "" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "" + +msgid "flat pages" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..78e3fd0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,74 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:34+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ido (http://www.transifex.com/projects/p/django/language/" +"io/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: io\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" + +msgid "URL is missing a leading slash." +msgstr "" + +msgid "URL is missing a trailing slash." +msgstr "" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +msgid "title" +msgstr "" + +msgid "content" +msgstr "" + +msgid "enable comments" +msgstr "" + +msgid "template name" +msgstr "" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" + +msgid "registration required" +msgstr "" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" + +msgid "flat page" +msgstr "" + +msgid "flat pages" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9e6c8e0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..dc297e2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,87 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Hafsteinn Einarsson , 2011-2012 +# Jannis Leidel , 2011 +# Thordur Sigurdsson , 2016,2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 15:42+0000\n" +"Last-Translator: Thordur Sigurdsson \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +msgid "Advanced options" +msgstr "Ítarlegar stillingar" + +msgid "Flat Pages" +msgstr "Flatskrár" + +msgid "URL" +msgstr "Veffang" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "Dæmi: '/about/contact/'. Passaðu að hafa skástrik fremst og aftast." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Þessi reitur má aðeins innihalda bókstafi (ekki broddstafi), tölustafi og " +"táknin . / - _ og ~." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Dæmi: '/about/contact'. Passaðu að hafa skástrik fremst." + +msgid "URL is missing a leading slash." +msgstr "Skástrik vantar fremst í slóð" + +msgid "URL is missing a trailing slash." +msgstr "Skástrik vantar aftast í slóð" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "'Flatpage' með slóðina %(url)s er þegar til fyrir síðuna %(site)s" + +msgid "title" +msgstr "titill" + +msgid "content" +msgstr "innihald" + +msgid "enable comments" +msgstr "virkja athugasemdir" + +msgid "template name" +msgstr "nafn sniðmáts" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Dæmi: 'flatpages/contact_page.html'. Ef ekkert er gefið upp mun kerfið nota " +"'flatpages/default.html'." + +msgid "registration required" +msgstr "skráning nauðsynleg" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Ef þetta er valið geta eingöngu innskráðir notendur séð síðuna." + +msgid "sites" +msgstr "vefir" + +msgid "flat page" +msgstr "flatskrá" + +msgid "flat pages" +msgstr "flatskrár" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..61e4b03 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..cd18b2a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Shinichi Katsumata , 2019 +# Shinya Okano , 2012,2014-2015 +# Tetsuya Morimoto , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-19 06:54+0000\n" +"Last-Translator: Shinichi Katsumata \n" +"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "詳細設定" + +msgid "Flat Pages" +msgstr "フラットページ" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"例: '/about/contact/'. 先頭と最後にスラッシュがあるか確認してください。" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"この値は文字、数字、ドット、アンダースコア、ダッシュ、スラッシュかチルダのみ" +"でなければいけません。" + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"例: '/about/contact/'. 先頭と最後にスラッシュがあるか確認してください。" + +msgid "URL is missing a leading slash." +msgstr "URLの先頭はスラッシュが必要です。" + +msgid "URL is missing a trailing slash." +msgstr "URLの末尾はスラッシュが必要です。" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "URL %(url)s のフラットページは %(site)s のサイトに既に存在しています。" + +msgid "title" +msgstr "タイトル" + +msgid "content" +msgstr "内容" + +msgid "enable comments" +msgstr "コメントを有効にする" + +msgid "template name" +msgstr "テンプレート名" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"例: 'flatpages/contact_page.html'. 指定しなければ、デフォルト設定" +"の'flatpages/default.html' を使います。" + +msgid "registration required" +msgstr "登録が必要です" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "チェックした場合、ログインしたユーザーだけがページを参照できます。" + +msgid "sites" +msgstr "サイト" + +msgid "flat page" +msgstr "フラットページ" + +msgid "flat pages" +msgstr "フラットページ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9b20adf Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..12dcb14 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2013 +# avsd05 , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "დამატებითი პარამეტრები" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"მაგალითი: '/about/contact/'. ყურადღება მიაქციეთ დახრილ ხაზებს თავში და " +"ბოლოში." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"ეს მნიშვნელობა უნდა შეიცავდეს მხოლოდ ლათინურ ასოებს, ციფრებს, წერტილებს, " +"ხაზგასმის ნიშნებს, დეფისებს, დახრილ ხაზებს და ტილდებს." + +msgid "URL is missing a leading slash." +msgstr "URL-ს დასაწყისში აკლია დახრილი ხაზი." + +msgid "URL is missing a trailing slash." +msgstr "URL-ს ბოლოში აკლია დახრილი ხაზი." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "უბრალო გვერდი url-ით %(url)s უკვე არსებობს საიტისთვის %(site)s" + +msgid "title" +msgstr "სათაური" + +msgid "content" +msgstr "კონტენტი" + +msgid "enable comments" +msgstr "ჩავრთოთ კომენტარები" + +msgid "template name" +msgstr "შაბლონის სახელი" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"მაგალითი: 'flatpages/contact_page.html'. თუ იგი მითითებული არ არის, " +"გამოყენებული იქნება 'flatpages/default.html'." + +msgid "registration required" +msgstr "რეგისტრაცია აუცილებელია" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"თუ ეს დროშა ჩართულია, მხოლო შემოსულ მომხმარებლებს ექნებათ გვერდის " +"დათვალიერების საშუალება." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "უბრალო გვერდი" + +msgid "flat pages" +msgstr "უბრალო გვერდები" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f8ef043 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ed64a6b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po new file mode 100644 index 0000000..9d86fb9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/kn/LC_MESSAGES/django.po @@ -0,0 +1,82 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Kannada (http://www.transifex.com/django/django/language/" +"kn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kn\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"ಉದಾ:'/about/contact/'. ಮೊದಲು ಮತ್ತು ಕೊನೆಯಲ್ಲಿ ಓರೆಗೆರೆ (/) ಇರುವಂತೆ ನೋಡಿಕೊಳ್ಳಿ." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" + +msgid "URL is missing a leading slash." +msgstr "" + +msgid "URL is missing a trailing slash." +msgstr "" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +msgid "title" +msgstr "ಶೀರ್ಷಿಕೆ" + +msgid "content" +msgstr "ಒಳವಿಷಯ" + +msgid "enable comments" +msgstr "ಟಿಪ್ಪಣಿಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ" + +msgid "template name" +msgstr "ಟೆಂಪ್ಲೇಟಿನ ಹೆಸರು" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"ಉದಾ:'flatpages/contact_page.html'. ಇದನ್ನು ಕೊಡದಿದ್ದರೆ ಗಣಕವ್ಯವಸ್ಥೆಯು 'flatpages/" +"default.html' ಅನ್ನು ಬಳಸುವದು." + +msgid "registration required" +msgstr "ನೋಂದಾವಣೆ ಅಗತ್ಯವಿದೆ." + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"ಇದರಲ್ಲಿ ಗುರುತು ಮಾಡಿದರೆ, ಒಳಬಂದ (ಲಾಗಿನ್ ಆದ) ಬಳಕೆದಾರರು ಮಾತ್ರ ಪುಟವನ್ನು ನೋಡಬಹುದು." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "ಚಪ್ಪಟೆ ಪುಟ" + +msgid "flat pages" +msgstr "ಚಪ್ಪಟೆ ಪುಟಗಳು" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..4054297 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jiyoon, Ha , 2016 +# Ian Y. Choi , 2015 +# Jaehong Kim , 2011 +# Jannis Leidel , 2011 +# Le Tartuffe , 2014 +# Jonghwa Seo , 2019 +# JunGu Kang , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-04-28 14:37+0000\n" +"Last-Translator: Jonghwa Seo \n" +"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "고급 옵션" + +msgid "Flat Pages" +msgstr "플랫 페이지" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "앞, 뒤에 슬래시(/)를 넣으세요. 예:'/about/contact/' " + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"이 문자열은 문자, 숫자, 점, 언더스코어, 대쉬, 슬래시, 틸드만 사용해야 합니다." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "맨앞에 슬래시(/)를 반드시 넣으세요. 예: '/about/contact'" + +msgid "URL is missing a leading slash." +msgstr "URL 맨 앞의 슬래시가 없습니다." + +msgid "URL is missing a trailing slash." +msgstr "URL 맨 뒤의 슬래시가 없습니다." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "%(site)s 사이트에 %(url)s 을/를 사용한 플랫 페이지가 이미 존재합니다." + +msgid "title" +msgstr "제목" + +msgid "content" +msgstr "내용" + +msgid "enable comments" +msgstr "사용 가능한 코멘트" + +msgid "template name" +msgstr "템플릿 이름" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"예: 'flatpages/contact_page.html' 를 사용할 수 없는 경우 시스템이 'flatpages/" +"default.html' 을/를 사용합니다." + +msgid "registration required" +msgstr "등록이 필요합니다" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "체크할 경우, 로그인한 사용자만 해당 페이지를 볼 수 있습니다." + +msgid "sites" +msgstr "사이트" + +msgid "flat page" +msgstr "플랫 페이지" + +msgid "flat pages" +msgstr "플랫 페이지들" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..16e75aa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,94 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kostas , 2011 +# Matas Dailyda , 2015,2019 +# Simonas Kazlauskas , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 10:34+0000\n" +"Last-Translator: Matas Dailyda \n" +"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" +"lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +msgid "Advanced options" +msgstr "Sudėtingesni nustatymai" + +msgid "Flat Pages" +msgstr "Paprasti puslapiai" + +msgid "URL" +msgstr "Nuoroda" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Pavyzdžiui: '/about/contact/'. Įsitikink, kad yra pasvirieji brūkšniai " +"pradžioj ir gale." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Ši reikšmė gali būti sudaryta tik iš raidžių, skaičių, pabraukimų, brūkšnių " +"ir/arba pasvirų brūkšnių." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Pavizdys: '/apie/kontaktai'. Įsitikinkite kad pradžioje būtų pasvirasis " +"brūkšnys." + +msgid "URL is missing a leading slash." +msgstr "Nuorodos pradžioje trūksta pasvirojo brūkšnio." + +msgid "URL is missing a trailing slash." +msgstr "Nuorodos pabaigoje trūksta pasvirojo brūkšnio." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Paprastas puslapis su adresu %(url)s %(site)s puslapyje jau egzistuoja" + +msgid "title" +msgstr "pavadinimas" + +msgid "content" +msgstr "turinys" + +msgid "enable comments" +msgstr "įjungti komentavimą" + +msgid "template name" +msgstr "šablono vardas" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Pavyzdžiui: 'flatpages/contact_page.html'. Jeigu bus nenurodytas, sistema " +"naudos 'flatpages/default.html'." + +msgid "registration required" +msgstr "registracija privaloma" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Jeigu pažymėta, tik prisijungę vartotojai galės matyti šį puslapį." + +msgid "sites" +msgstr "tinklalapiai" + +msgid "flat page" +msgstr "paprastas puslapis" + +msgid "flat pages" +msgstr "paprasti puslapiai" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..68d4a8b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a9c8f09 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7d4393d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..ed0bb3d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# jensadne , 2014 +# Jon , 2015 +# Jon , 2019 +# Jon , 2011-2012 +# Sigurd Gartmann , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-05-06 13:03+0000\n" +"Last-Translator: Jon \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Avanserte innstillinger" + +msgid "Flat Pages" +msgstr "Flatsider" + +msgid "URL" +msgstr "Nettadresse" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Eksempel: «/om/kontakt/». Kontroller at det er en skråstrek foran og bak." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Dette feltet kan kun inneholde bokstaver, nummer, skilletegn, understreker, " +"bindestreker, skråstreker eller tilder." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Eksempel: '/om/kontakt'. Kontroller at det er en skråstrek foran." + +msgid "URL is missing a leading slash." +msgstr "URL mangler innledende skråstrek." + +msgid "URL is missing a trailing slash." +msgstr "URL mangler avsluttende skråstrek." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Flatside med URL-en %(url)s finnes allerede for siden %(site)s" + +msgid "title" +msgstr "tittel" + +msgid "content" +msgstr "innhold" + +msgid "enable comments" +msgstr "tillat kommentarer" + +msgid "template name" +msgstr "malnavn" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Eksempel: «flatpages/kontakt_side.html». Hvis denne ikke er gitt, vil " +"«flatpages/default.html» bli brukt." + +msgid "registration required" +msgstr "krever registrering" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Hvis denne er krysset av, kan kun innloggede brukere se siden." + +msgid "sites" +msgstr "nettsteder" + +msgid "flat page" +msgstr "flatside" + +msgid "flat pages" +msgstr "flatsider" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..54ec75f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,77 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Sagar Chalise , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Sagar Chalise \n" +"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "उदाहरणका लागि: '/about/contact/' । अगाडि र पछाडि '/' राख्न नभुल्नुहोला ।" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "यो मानमा अंक, वर्ण, थोप्लो, अन्डरस्कोर, ड्यास, स्ल्यास र टिल्ड मात्र हुनुपर्दछ ।" + +msgid "URL is missing a leading slash." +msgstr "" + +msgid "URL is missing a trailing slash." +msgstr "" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +msgid "title" +msgstr "शीर्षक" + +msgid "content" +msgstr "विषय" + +msgid "enable comments" +msgstr "प्रतिकृयाको लागि मञ्जुरी दिनुहोस" + +msgid "template name" +msgstr "टेम्प्लेटको नाम" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" + +msgid "registration required" +msgstr "दर्ता अनिवार्य छ ।" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" + +msgid "sites" +msgstr "साइटहरु" + +msgid "flat page" +msgstr "" + +msgid "flat pages" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..aaa9895 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,86 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Флдӕр фадӕттӕ" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Цӕвиттон: '/about/contact/'. Дӕ хъус дар цӕмӕ дзы сӕйраг ӕмӕ хицӕнгӕнаг " +"слӕштӕ уой." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Ам хъуамӕ ӕрмӕст дамгъӕтӕ, стъӕлфытӕ, бынылхӕххытӕ, дефистӕ, слӕштӕ ӕмӕ " +"тильдӕтӕ уой." + +msgid "URL is missing a leading slash." +msgstr "URL-ы сӕйраг слӕш нӕй." + +msgid "URL is missing a trailing slash." +msgstr "URL-ы хицӕнгӕнаг слӕш нӕй." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "%(url)s url-имӕ тъӕпӕнфарс нырид ис %(site)s сайтӕн" + +msgid "title" +msgstr "сӕр" + +msgid "content" +msgstr "мидис" + +msgid "enable comments" +msgstr "хъуыдытӕ баиу кӕнын" + +msgid "template name" +msgstr "хуызӕгы ном" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Цӕвиттон: 'flatpages/contact_page.html'. Кӕд ай лӕвӕрд нӕу, уӕд системӕ " +"сӕвӕрдзӕн 'flatpages/default.html'." + +msgid "registration required" +msgstr "регистраци хъӕуы" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Кӕд ай нысангонд у, уӕд ацы фарс ӕрмӕст системӕмӕ хызт архайджытӕн уыдзӕнис " +"бар уынын." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "тъӕпӕн фарс" + +msgid "flat pages" +msgstr "тъӕпӕн фӕрстӕ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6c86472 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..38f2fe9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,96 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# angularcircle, 2012 +# angularcircle, 2012 +# Jannis Leidel , 2011 +# Janusz Harkot , 2015 +# m_aciek , 2019 +# Tomasz Kajtoch , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-26 20:46+0000\n" +"Last-Translator: m_aciek \n" +"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" +"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" +"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgid "Advanced options" +msgstr "Opcje zaawansowane" + +msgid "Flat Pages" +msgstr "Strony statyczne" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Przykład: '/about/contact/'. Upewnij się, że wpisałeś początkowy i końcowy " +"ukośnik." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"To pole może zawierać jedynie litery, cyfry, kropki, podkreślenia, myślniki, " +"ukośniki i tyldy." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Przykład: '/about/contact'. Upewnij się, że wpisałeś początkowy ukośnik." + +msgid "URL is missing a leading slash." +msgstr "W URL-u brakuje początkowego ukośnika." + +msgid "URL is missing a trailing slash." +msgstr "W URL-u brakuje końcowego ukośnika." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" +"Strona statyczna o adresie %(url)s została już utworzona dla strony %(site)s" + +msgid "title" +msgstr "tytuł" + +msgid "content" +msgstr "zawartość" + +msgid "enable comments" +msgstr "włącz komentarze" + +msgid "template name" +msgstr "nazwa szablonu" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Przykład: 'flatpages/contact_page.html'. Jeżeli nie zostanie podane, system " +"użyje 'flatpages/default.html'." + +msgid "registration required" +msgstr "wymagana rejestracja" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę." + +msgid "sites" +msgstr "strony" + +msgid "flat page" +msgstr "strona statyczna" + +msgid "flat pages" +msgstr "strony statyczne" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ffc8ef0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..556ca89 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,95 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# andrewsmedina , 2013 +# dudanogueira , 2019 +# Eduardo Cereto Carvalho, 2011 +# Fábio C. Barrionuevo da Luz , 2013 +# semente, 2012-2013 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +# Sergio Oliveira , 2013 +# Thiago Avelino , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-18 17:14+0000\n" +"Last-Translator: dudanogueira \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Advanced options" +msgstr "Opções avançadas" + +msgid "Flat Pages" +msgstr "Páginas Planas" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Este valor deve conter apenas letras, números, pontos, sublinhados, traços, " +"barras ou til." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Exemplo: '/sobre/contato'. Certifique-se de ter a barra no início." + +msgid "URL is missing a leading slash." +msgstr "Está faltando uma barra no início da URL." + +msgid "URL is missing a trailing slash." +msgstr "Está faltando uma barra no final da URL." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Uma flatpage com a URL %(url)s já existe para o site %(site)s" + +msgid "title" +msgstr "título" + +msgid "content" +msgstr "conteúdo" + +msgid "enable comments" +msgstr "habilitar comentários" + +msgid "template name" +msgstr "nome do template" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Exemplo: 'flatpages/contact_page.html'. Se não for informado, será utilizado " +"'flatpages/default.html'." + +msgid "registration required" +msgstr "registro obrigatório" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Se estiver assinalado, apenas usuários autenticados poderão ver a página." + +msgid "sites" +msgstr "sites" + +msgid "flat page" +msgstr "página plana" + +msgid "flat pages" +msgstr "páginas planas" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b8d7ae8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..6631911 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,96 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bogdan Mateescu, 2019 +# Daniel Ursache-Dogariu, 2011 +# Denis Darii , 2014 +# Jannis Leidel , 2011 +# Razvan Stefanescu , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 12:01+0000\n" +"Last-Translator: Bogdan Mateescu\n" +"Language-Team: Romanian (http://www.transifex.com/django/django/language/" +"ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +msgid "Advanced options" +msgstr "Opțiuni avansate" + +msgid "Flat Pages" +msgstr "Pagini Statice" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Exemplu: '/despre/contact/'. Asigurați-vă că sunt bare oblice la început și " +"la sfârșit." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Această valoare trebuie să conţină doar litere, numere, puncte, linii joase, " +"cratime, bare oblice sau tilde." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Exemplu: '/despre/contact'. Asigurați-vă că sunt bare oblice la început și " +"la sfârșit." + +msgid "URL is missing a leading slash." +msgstr "În URL lipseste slashul inițial." + +msgid "URL is missing a trailing slash." +msgstr "În URL lipseste slashul final." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Pagina Flat cu url-ul %(url)s există deja pentru saitul %(site)s" + +msgid "title" +msgstr "titlu" + +msgid "content" +msgstr "conținut" + +msgid "enable comments" +msgstr "permite comentarii" + +msgid "template name" +msgstr "nume șablon" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Exemplu: 'flatpages/contact_page.html'. Dacă aceasta nu există, sistemul va " +"folosi 'flatpages/default.html'." + +msgid "registration required" +msgstr "necesită înregistrare" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Dacă aceasta este bifată, numai utilizatorii autentificați vor putea vedea " +"pagina." + +msgid "sites" +msgstr "pagini" + +msgid "flat page" +msgstr "pagină statică" + +msgid "flat pages" +msgstr "pagini statice" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7b74bfa Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..c738eea --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,94 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Eugene , 2012 +# Jannis Leidel , 2011 +# Mike Yumatov , 2011 +# Алексей Борискин , 2012,2014-2015,2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-18 21:16+0000\n" +"Last-Translator: Алексей Борискин \n" +"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "Advanced options" +msgstr "Расширенные настройки" + +msgid "Flat Pages" +msgstr "Простые страницы" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Пример: '/about/contact/'. Убедитесь, что ввели начальную и конечную косые " +"черты." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Значение должно состоять только из букв, цифр и символов точки, " +"подчеркивания, тире, косой черты и тильды." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "" +"Например: '/about/contact'. Убедитесь, что в начале адреса находится косая " +"черта." + +msgid "URL is missing a leading slash." +msgstr "В начале URL отсутствует косая черта" + +msgid "URL is missing a trailing slash." +msgstr "В конце URL отсутствует косая черта" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Простая страница с адресом %(url)s уже существует для сайта %(site)s" + +msgid "title" +msgstr "заголовок" + +msgid "content" +msgstr "содержимое" + +msgid "enable comments" +msgstr "включить комментарии" + +msgid "template name" +msgstr "имя шаблона" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Пример: 'flatpages/contact_page.html'. Если не указано, система будет " +"использовать 'flatpages/default.html'." + +msgid "registration required" +msgstr "требуется регистрация" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "Если отмечено, только вошедшие пользователи смогут видеть страницу." + +msgid "sites" +msgstr "сайты" + +msgid "flat page" +msgstr "простая страница" + +msgid "flat pages" +msgstr "простые страницы" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a2e3552 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..e218351 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011,2015 +# Besnik , 2015,2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-18 11:07+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Advanced options" +msgstr "Mundësi të mëtejshme" + +msgid "Flat Pages" +msgstr "Faqe të Thjeshta" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Shembull: '/rreth/kontakt/'. Sigurohuni që vendosni pjerraket përkatëse." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Kjo vlerë duhet të përmbajë vetëm shkronja, numra, pika, nënvija, vija " +"ndarëse, pjerrake ose shenjën afërsisht." + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Shembull: '/mbi/kontakt'. Sigurohuni që keni pjerrake paraprirëse." + +msgid "URL is missing a leading slash." +msgstr "URL-së i mungon një pjerrake në krye." + +msgid "URL is missing a trailing slash." +msgstr "URL-së i mungon një pjerrake në fund." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "Ka tashmë një flatpage me url %(url)s për sajtin %(site)s" + +msgid "title" +msgstr "titull" + +msgid "content" +msgstr "lëndë" + +msgid "enable comments" +msgstr "aktivizo komente" + +msgid "template name" +msgstr "emër gjedheje" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Shembull: 'flatpages/contact_page.html'. Nëse nuk ka një të tillë, sistemi " +"do të përdorë 'flatpages/default.html'." + +msgid "registration required" +msgstr "lypset regjistrim" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Po iu vu shenjë kësaj, faqen do të jenë në gjendje ta shohin vetëm " +"përdoruesit që kanë bërë hyrjen." + +msgid "sites" +msgstr "sajte" + +msgid "flat page" +msgstr "faqe e thjeshtë" + +msgid "flat pages" +msgstr "faqe të thjeshta" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bf8dadf Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/ta/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b6eec7b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..0754d68 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,84 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Azat Khasanshin , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "Өстәмә көйләүләр" + +msgid "Flat Pages" +msgstr "" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"Үрнәк: '/about/contact/'. Алдынгы һәм арттагы авыш сызыкларын кертүне " +"тикшерегез." + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "" +"Бу кыйммәт тик хәрефләрдән, саннардан һәм нокта, астына сызу, тире, авыш " +"сызык, тильда билгеләреннән генә тора ала." + +msgid "URL is missing a leading slash." +msgstr "" + +msgid "URL is missing a trailing slash." +msgstr "" + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "" + +msgid "title" +msgstr "башлам" + +msgid "content" +msgstr "эчтәлек" + +msgid "enable comments" +msgstr "фикерләрне ялгарга" + +msgid "template name" +msgstr "шаблон исеме" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"Үрнәк: 'flatpages/contact_page.html'. Күрсәтелгән булмаса, система " +"'flatpages/defalut.html' кулланыр." + +msgid "registration required" +msgstr "теркәлү кирәк" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Билгеләнгән булса, фәкать кергән кулланучылар гына сәхифәне күрә алырлар." + +msgid "sites" +msgstr "" + +msgid "flat page" +msgstr "гади сәхифә" + +msgid "flat pages" +msgstr "гади сәхифәләр" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cbee5e4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/vi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7cf6a6f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..ac4adb2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Lele Long , 2011 +# mozillazg , 2016 +# Ronald White , 2014 +# Suntravel Chris , 2019 +# Kevin Sze , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-01 07:11+0000\n" +"Last-Translator: Suntravel Chris \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Advanced options" +msgstr "高级选项" + +msgid "Flat Pages" +msgstr "简单页面" + +msgid "URL" +msgstr "URL" + +msgid "" +"Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "例如:'/about/contact/'。请确保开始和结尾的斜杠。" + +msgid "" +"This value must contain only letters, numbers, dots, underscores, dashes, " +"slashes or tildes." +msgstr "该值必须只能包含字母,数字,点号,下划线,破折号,和" + +msgid "Example: '/about/contact'. Make sure to have a leading slash." +msgstr "Example: '/about/contact'. 请确保开头的正斜杠。" + +msgid "URL is missing a leading slash." +msgstr "URL头部缺失斜线." + +msgid "URL is missing a trailing slash." +msgstr "URL尾部缺失斜线." + +#, python-format +msgid "Flatpage with url %(url)s already exists for site %(site)s" +msgstr "带有url %(url)s的Flatpage已经存在于站点 %(site)s" + +msgid "title" +msgstr "标题" + +msgid "content" +msgstr "内容" + +msgid "enable comments" +msgstr "允许评论" + +msgid "template name" +msgstr "模板名称" + +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"例如:'flatpages/contact_page.html'。若未提供,系统将使用'flatpages/default." +"html'。" + +msgid "registration required" +msgstr "请先注册" + +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "如果被选中,仅登录用户才可以查看此页。" + +msgid "sites" +msgstr "站点" + +msgid "flat page" +msgstr "简单页面" + +msgid "flat pages" +msgstr "简单页面" diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000..24422f8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/flatpages/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/sitemaps.py b/venv/lib/python3.7/site-packages/django/contrib/flatpages/sitemaps.py new file mode 100644 index 0000000..a144023 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/sitemaps.py @@ -0,0 +1,12 @@ +from django.apps import apps as django_apps +from django.contrib.sitemaps import Sitemap +from django.core.exceptions import ImproperlyConfigured + + +class FlatPageSitemap(Sitemap): + def items(self): + if not django_apps.is_installed('django.contrib.sites'): + raise ImproperlyConfigured("FlatPageSitemap requires django.contrib.sites, which isn't installed.") + Site = django_apps.get_model('sites.Site') + current_site = Site.objects.get_current() + return current_site.flatpage_set.filter(registration_required=False) diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/templatetags/flatpages.py b/venv/lib/python3.7/site-packages/django/contrib/flatpages/templatetags/flatpages.py new file mode 100644 index 0000000..1d99104 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/templatetags/flatpages.py @@ -0,0 +1,99 @@ +from django import template +from django.conf import settings +from django.contrib.flatpages.models import FlatPage +from django.contrib.sites.shortcuts import get_current_site + +register = template.Library() + + +class FlatpageNode(template.Node): + def __init__(self, context_name, starts_with=None, user=None): + self.context_name = context_name + if starts_with: + self.starts_with = template.Variable(starts_with) + else: + self.starts_with = None + if user: + self.user = template.Variable(user) + else: + self.user = None + + def render(self, context): + if 'request' in context: + site_pk = get_current_site(context['request']).pk + else: + site_pk = settings.SITE_ID + flatpages = FlatPage.objects.filter(sites__id=site_pk) + # If a prefix was specified, add a filter + if self.starts_with: + flatpages = flatpages.filter( + url__startswith=self.starts_with.resolve(context)) + + # If the provided user is not authenticated, or no user + # was provided, filter the list to only public flatpages. + if self.user: + user = self.user.resolve(context) + if not user.is_authenticated: + flatpages = flatpages.filter(registration_required=False) + else: + flatpages = flatpages.filter(registration_required=False) + + context[self.context_name] = flatpages + return '' + + +@register.tag +def get_flatpages(parser, token): + """ + Retrieve all flatpage objects available for the current site and + visible to the specific user (or visible to all users if no user is + specified). Populate the template context with them in a variable + whose name is defined by the ``as`` clause. + + An optional ``for`` clause controls the user whose permissions are used in + determining which flatpages are visible. + + An optional argument, ``starts_with``, limits the returned flatpages to + those beginning with a particular base URL. This argument can be a variable + or a string, as it resolves from the template context. + + Syntax:: + + {% get_flatpages ['url_starts_with'] [for user] as context_name %} + + Example usage:: + + {% get_flatpages as flatpages %} + {% get_flatpages for someuser as flatpages %} + {% get_flatpages '/about/' as about_pages %} + {% get_flatpages prefix as about_pages %} + {% get_flatpages '/about/' for someuser as about_pages %} + """ + bits = token.split_contents() + syntax_message = ("%(tag_name)s expects a syntax of %(tag_name)s " + "['url_starts_with'] [for user] as context_name" % + {'tag_name': bits[0]}) + # Must have at 3-6 bits in the tag + if 3 <= len(bits) <= 6: + # If there's an even number of bits, there's no prefix + if len(bits) % 2 == 0: + prefix = bits[1] + else: + prefix = None + + # The very last bit must be the context name + if bits[-2] != 'as': + raise template.TemplateSyntaxError(syntax_message) + context_name = bits[-1] + + # If there are 5 or 6 bits, there is a user defined + if len(bits) >= 5: + if bits[-4] != 'for': + raise template.TemplateSyntaxError(syntax_message) + user = bits[-3] + else: + user = None + + return FlatpageNode(context_name, starts_with=prefix, user=user) + else: + raise template.TemplateSyntaxError(syntax_message) diff --git a/venv/lib/python3.7/site-packages/django/contrib/flatpages/urls.py b/venv/lib/python3.7/site-packages/django/contrib/flatpages/urls.py new file mode 100644 index 0000000..a087fe8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/flatpages/urls.py @@ -0,0 +1,6 @@ +from django.contrib.flatpages import views +from django.urls import path + +urlpatterns = [ + path('', views.flatpage, name='django.contrib.flatpages.views.flatpage'), +] diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/__init__.py new file mode 100644 index 0000000..458c90e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/__init__.py @@ -0,0 +1 @@ +default_app_config = 'django.contrib.gis.apps.GISConfig' diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/admin/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/admin/__init__.py new file mode 100644 index 0000000..e014f12 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/admin/__init__.py @@ -0,0 +1,12 @@ +from django.contrib.admin import ( + HORIZONTAL, VERTICAL, AdminSite, ModelAdmin, StackedInline, TabularInline, + autodiscover, register, site, +) +from django.contrib.gis.admin.options import GeoModelAdmin, OSMGeoAdmin +from django.contrib.gis.admin.widgets import OpenLayersWidget + +__all__ = [ + 'HORIZONTAL', 'VERTICAL', 'AdminSite', 'ModelAdmin', 'StackedInline', + 'TabularInline', 'autodiscover', 'register', 'site', + 'GeoModelAdmin', 'OSMGeoAdmin', 'OpenLayersWidget', +] diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/adapter.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/adapter.py new file mode 100644 index 0000000..604711e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/adapter.py @@ -0,0 +1,19 @@ +class WKTAdapter: + """ + An adaptor for Geometries sent to the MySQL and Oracle database backends. + """ + def __init__(self, geom): + self.wkt = geom.wkt + self.srid = geom.srid + + def __eq__(self, other): + return ( + isinstance(other, WKTAdapter) and + self.wkt == other.wkt and self.srid == other.srid + ) + + def __hash__(self): + return hash((self.wkt, self.srid)) + + def __str__(self): + return self.wkt diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/models.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/models.py new file mode 100644 index 0000000..c25c1cc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/base/models.py @@ -0,0 +1,136 @@ +from django.contrib.gis import gdal + + +class SpatialRefSysMixin: + """ + The SpatialRefSysMixin is a class used by the database-dependent + SpatialRefSys objects to reduce redundant code. + """ + @property + def srs(self): + """ + Return a GDAL SpatialReference object. + """ + # TODO: Is caching really necessary here? Is complexity worth it? + if hasattr(self, '_srs'): + # Returning a clone of the cached SpatialReference object. + return self._srs.clone() + else: + # Attempting to cache a SpatialReference object. + + # Trying to get from WKT first. + try: + self._srs = gdal.SpatialReference(self.wkt) + return self.srs + except Exception as e: + msg = e + + try: + self._srs = gdal.SpatialReference(self.proj4text) + return self.srs + except Exception as e: + msg = e + + raise Exception('Could not get OSR SpatialReference from WKT: %s\nError:\n%s' % (self.wkt, msg)) + + @property + def ellipsoid(self): + """ + Return a tuple of the ellipsoid parameters: + (semimajor axis, semiminor axis, and inverse flattening). + """ + return self.srs.ellipsoid + + @property + def name(self): + "Return the projection name." + return self.srs.name + + @property + def spheroid(self): + "Return the spheroid name for this spatial reference." + return self.srs['spheroid'] + + @property + def datum(self): + "Return the datum for this spatial reference." + return self.srs['datum'] + + @property + def projected(self): + "Is this Spatial Reference projected?" + return self.srs.projected + + @property + def local(self): + "Is this Spatial Reference local?" + return self.srs.local + + @property + def geographic(self): + "Is this Spatial Reference geographic?" + return self.srs.geographic + + @property + def linear_name(self): + "Return the linear units name." + return self.srs.linear_name + + @property + def linear_units(self): + "Return the linear units." + return self.srs.linear_units + + @property + def angular_name(self): + "Return the name of the angular units." + return self.srs.angular_name + + @property + def angular_units(self): + "Return the angular units." + return self.srs.angular_units + + @property + def units(self): + "Return a tuple of the units and the name." + if self.projected or self.local: + return (self.linear_units, self.linear_name) + elif self.geographic: + return (self.angular_units, self.angular_name) + else: + return (None, None) + + @classmethod + def get_units(cls, wkt): + """ + Return a tuple of (unit_value, unit_name) for the given WKT without + using any of the database fields. + """ + return gdal.SpatialReference(wkt).units + + @classmethod + def get_spheroid(cls, wkt, string=True): + """ + Class method used by GeometryField on initialization to + retrieve the `SPHEROID[..]` parameters from the given WKT. + """ + srs = gdal.SpatialReference(wkt) + sphere_params = srs.ellipsoid + sphere_name = srs['spheroid'] + + if not string: + return sphere_name, sphere_params + else: + # `string` parameter used to place in format acceptable by PostGIS + if len(sphere_params) == 3: + radius, flattening = sphere_params[0], sphere_params[2] + else: + radius, flattening = sphere_params + return 'SPHEROID["%s",%s,%s]' % (sphere_name, radius, flattening) + + def __str__(self): + """ + Return the string representation, a 'pretty' OGC WKT. + """ + return str(self.srs) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/base.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/base.py new file mode 100644 index 0000000..fccea59 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/base.py @@ -0,0 +1,16 @@ +from django.db.backends.mysql.base import ( + DatabaseWrapper as MySQLDatabaseWrapper, +) + +from .features import DatabaseFeatures +from .introspection import MySQLIntrospection +from .operations import MySQLOperations +from .schema import MySQLGISSchemaEditor + + +class DatabaseWrapper(MySQLDatabaseWrapper): + SchemaEditorClass = MySQLGISSchemaEditor + # Classes instantiated in __init__(). + features_class = DatabaseFeatures + introspection_class = MySQLIntrospection + ops_class = MySQLOperations diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/introspection.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/introspection.py new file mode 100644 index 0000000..9e19522 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/mysql/introspection.py @@ -0,0 +1,38 @@ +from MySQLdb.constants import FIELD_TYPE + +from django.contrib.gis.gdal import OGRGeomType +from django.db.backends.mysql.introspection import DatabaseIntrospection + + +class MySQLIntrospection(DatabaseIntrospection): + # Updating the data_types_reverse dictionary with the appropriate + # type for Geometry fields. + data_types_reverse = DatabaseIntrospection.data_types_reverse.copy() + data_types_reverse[FIELD_TYPE.GEOMETRY] = 'GeometryField' + + def get_geometry_type(self, table_name, geo_col): + with self.connection.cursor() as cursor: + # In order to get the specific geometry type of the field, + # we introspect on the table definition using `DESCRIBE`. + cursor.execute('DESCRIBE %s' % + self.connection.ops.quote_name(table_name)) + # Increment over description info until we get to the geometry + # column. + for column, typ, null, key, default, extra in cursor.fetchall(): + if column == geo_col: + # Using OGRGeomType to convert from OGC name to Django field. + # MySQL does not support 3D or SRIDs, so the field params + # are empty. + field_type = OGRGeomType(typ).django + field_params = {} + break + return field_type, field_params + + def supports_spatial_index(self, cursor, table_name): + # Supported with MyISAM/Aria, or InnoDB on MySQL 5.7.5+/MariaDB 10.2.2+ + storage_engine = self.get_storage_engine(cursor, table_name) + if storage_engine == 'InnoDB': + return self.connection.mysql_version >= ( + (10, 2, 2) if self.connection.mysql_is_mariadb else (5, 7, 5) + ) + return storage_engine in ('MyISAM', 'Aria') diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/oracle/introspection.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/oracle/introspection.py new file mode 100644 index 0000000..7f4f886 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/oracle/introspection.py @@ -0,0 +1,42 @@ +import cx_Oracle + +from django.db.backends.oracle.introspection import DatabaseIntrospection + + +class OracleIntrospection(DatabaseIntrospection): + # Associating any OBJECTVAR instances with GeometryField. Of course, + # this won't work right on Oracle objects that aren't MDSYS.SDO_GEOMETRY, + # but it is the only object type supported within Django anyways. + data_types_reverse = DatabaseIntrospection.data_types_reverse.copy() + data_types_reverse[cx_Oracle.OBJECT] = 'GeometryField' + + def get_geometry_type(self, table_name, geo_col): + with self.connection.cursor() as cursor: + # Querying USER_SDO_GEOM_METADATA to get the SRID and dimension information. + try: + cursor.execute( + 'SELECT "DIMINFO", "SRID" FROM "USER_SDO_GEOM_METADATA" ' + 'WHERE "TABLE_NAME"=%s AND "COLUMN_NAME"=%s', + (table_name.upper(), geo_col.upper()) + ) + row = cursor.fetchone() + except Exception as exc: + raise Exception( + 'Could not find entry in USER_SDO_GEOM_METADATA ' + 'corresponding to "%s"."%s"' % (table_name, geo_col) + ) from exc + + # TODO: Research way to find a more specific geometry field type for + # the column's contents. + field_type = 'GeometryField' + + # Getting the field parameters. + field_params = {} + dim, srid = row + if srid != 4326: + field_params['srid'] = srid + # Size of object array (SDO_DIM_ARRAY) is number of dimensions. + dim = dim.size() + if dim != 2: + field_params['dim'] = dim + return field_type, field_params diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/base.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/base.py new file mode 100644 index 0000000..5b93d7c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/base.py @@ -0,0 +1,26 @@ +from django.db.backends.base.base import NO_DB_ALIAS +from django.db.backends.postgresql.base import ( + DatabaseWrapper as Psycopg2DatabaseWrapper, +) + +from .features import DatabaseFeatures +from .introspection import PostGISIntrospection +from .operations import PostGISOperations +from .schema import PostGISSchemaEditor + + +class DatabaseWrapper(Psycopg2DatabaseWrapper): + SchemaEditorClass = PostGISSchemaEditor + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if kwargs.get('alias', '') != NO_DB_ALIAS: + self.features = DatabaseFeatures(self) + self.ops = PostGISOperations(self) + self.introspection = PostGISIntrospection(self) + + def prepare_database(self): + super().prepare_database() + # Check that postgis extension is installed. + with self.cursor() as cursor: + cursor.execute("CREATE EXTENSION IF NOT EXISTS postgis") diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py new file mode 100644 index 0000000..e6c1b22 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/postgis/pgraster.py @@ -0,0 +1,141 @@ +import struct + +from django.forms import ValidationError + +from .const import ( + GDAL_TO_POSTGIS, GDAL_TO_STRUCT, POSTGIS_HEADER_STRUCTURE, POSTGIS_TO_GDAL, + STRUCT_SIZE, +) + + +def pack(structure, data): + """ + Pack data into hex string with little endian format. + """ + return struct.pack('<' + structure, *data) + + +def unpack(structure, data): + """ + Unpack little endian hexlified binary string into a list. + """ + return struct.unpack('<' + structure, bytes.fromhex(data)) + + +def chunk(data, index): + """ + Split a string into two parts at the input index. + """ + return data[:index], data[index:] + + +def from_pgraster(data): + """ + Convert a PostGIS HEX String into a dictionary. + """ + if data is None: + return + + # Split raster header from data + header, data = chunk(data, 122) + header = unpack(POSTGIS_HEADER_STRUCTURE, header) + + # Parse band data + bands = [] + pixeltypes = [] + while data: + # Get pixel type for this band + pixeltype, data = chunk(data, 2) + pixeltype = unpack('B', pixeltype)[0] + + # Subtract nodata byte from band nodata value if it exists + has_nodata = pixeltype >= 64 + if has_nodata: + pixeltype -= 64 + + # Convert datatype from PostGIS to GDAL & get pack type and size + pixeltype = POSTGIS_TO_GDAL[pixeltype] + pack_type = GDAL_TO_STRUCT[pixeltype] + pack_size = 2 * STRUCT_SIZE[pack_type] + + # Parse band nodata value. The nodata value is part of the + # PGRaster string even if the nodata flag is True, so it always + # has to be chunked off the data string. + nodata, data = chunk(data, pack_size) + nodata = unpack(pack_type, nodata)[0] + + # Chunk and unpack band data (pack size times nr of pixels) + band, data = chunk(data, pack_size * header[10] * header[11]) + band_result = {'data': bytes.fromhex(band)} + + # If the nodata flag is True, set the nodata value. + if has_nodata: + band_result['nodata_value'] = nodata + + # Append band data to band list + bands.append(band_result) + + # Store pixeltype of this band in pixeltypes array + pixeltypes.append(pixeltype) + + # Check that all bands have the same pixeltype. + # This is required by GDAL. PostGIS rasters could have different pixeltypes + # for bands of the same raster. + if len(set(pixeltypes)) != 1: + raise ValidationError("Band pixeltypes are not all equal.") + + return { + 'srid': int(header[9]), + 'width': header[10], 'height': header[11], + 'datatype': pixeltypes[0], + 'origin': (header[5], header[6]), + 'scale': (header[3], header[4]), + 'skew': (header[7], header[8]), + 'bands': bands, + } + + +def to_pgraster(rast): + """ + Convert a GDALRaster into PostGIS Raster format. + """ + # Prepare the raster header data as a tuple. The first two numbers are + # the endianness and the PostGIS Raster Version, both are fixed by + # PostGIS at the moment. + rasterheader = ( + 1, 0, len(rast.bands), rast.scale.x, rast.scale.y, + rast.origin.x, rast.origin.y, rast.skew.x, rast.skew.y, + rast.srs.srid, rast.width, rast.height, + ) + + # Pack raster header. + result = pack(POSTGIS_HEADER_STRUCTURE, rasterheader) + + for band in rast.bands: + # The PostGIS raster band header has exactly two elements, a 8BUI byte + # and the nodata value. + # + # The 8BUI stores both the PostGIS pixel data type and a nodata flag. + # It is composed as the datatype integer plus 64 as a flag for existing + # nodata values: + # 8BUI_VALUE = PG_PIXEL_TYPE (0-11) + FLAG (0 or 64) + # + # For example, if the byte value is 71, then the datatype is + # 71-64 = 7 (32BSI) and the nodata value is True. + structure = 'B' + GDAL_TO_STRUCT[band.datatype()] + + # Get band pixel type in PostGIS notation + pixeltype = GDAL_TO_POSTGIS[band.datatype()] + + # Set the nodata flag + if band.nodata_value is not None: + pixeltype += 64 + + # Pack band header + bandheader = pack(structure, (pixeltype, band.nodata_value or 0)) + + # Add packed header and band data to result + result += bandheader + band.data(as_memoryview=True) + + # Convert raster to hex string before passing it to the DB. + return result.hex() diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/base.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/base.py new file mode 100644 index 0000000..1afba58 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/base.py @@ -0,0 +1,74 @@ +from ctypes.util import find_library + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.backends.sqlite3.base import ( + DatabaseWrapper as SQLiteDatabaseWrapper, +) + +from .client import SpatiaLiteClient +from .features import DatabaseFeatures +from .introspection import SpatiaLiteIntrospection +from .operations import SpatiaLiteOperations +from .schema import SpatialiteSchemaEditor + + +class DatabaseWrapper(SQLiteDatabaseWrapper): + SchemaEditorClass = SpatialiteSchemaEditor + # Classes instantiated in __init__(). + client_class = SpatiaLiteClient + features_class = DatabaseFeatures + introspection_class = SpatiaLiteIntrospection + ops_class = SpatiaLiteOperations + + def __init__(self, *args, **kwargs): + # Trying to find the location of the SpatiaLite library. + # Here we are figuring out the path to the SpatiaLite library + # (`libspatialite`). If it's not in the system library path (e.g., it + # cannot be found by `ctypes.util.find_library`), then it may be set + # manually in the settings via the `SPATIALITE_LIBRARY_PATH` setting. + self.lib_spatialite_paths = [name for name in [ + getattr(settings, 'SPATIALITE_LIBRARY_PATH', None), + 'mod_spatialite.so', + 'mod_spatialite', + find_library('spatialite'), + ] if name is not None] + super().__init__(*args, **kwargs) + + def get_new_connection(self, conn_params): + conn = super().get_new_connection(conn_params) + # Enabling extension loading on the SQLite connection. + try: + conn.enable_load_extension(True) + except AttributeError: + raise ImproperlyConfigured( + 'SpatiaLite requires SQLite to be configured to allow ' + 'extension loading.' + ) + # Load the SpatiaLite library extension on the connection. + for path in self.lib_spatialite_paths: + try: + conn.load_extension(path) + except Exception: + if getattr(settings, 'SPATIALITE_LIBRARY_PATH', None): + raise ImproperlyConfigured( + 'Unable to load the SpatiaLite library extension ' + 'as specified in your SPATIALITE_LIBRARY_PATH setting.' + ) + continue + else: + break + else: + raise ImproperlyConfigured( + 'Unable to load the SpatiaLite library extension. ' + 'Library names tried: %s' % ', '.join(self.lib_spatialite_paths) + ) + return conn + + def prepare_database(self): + super().prepare_database() + # Check if spatial metadata have been initialized in the database + with self.cursor() as cursor: + cursor.execute("PRAGMA table_info(geometry_columns);") + if cursor.fetchall() == []: + cursor.execute("SELECT InitSpatialMetaData(1)") diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/client.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/client.py new file mode 100644 index 0000000..c9dfd1a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/client.py @@ -0,0 +1,5 @@ +from django.db.backends.sqlite3.client import DatabaseClient + + +class SpatiaLiteClient(DatabaseClient): + executable_name = 'spatialite' diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/features.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/features.py new file mode 100644 index 0000000..d29e787 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/features.py @@ -0,0 +1,13 @@ +from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures +from django.db.backends.sqlite3.features import ( + DatabaseFeatures as SQLiteDatabaseFeatures, +) +from django.utils.functional import cached_property + + +class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures): + supports_3d_storage = True + + @cached_property + def supports_area_geodetic(self): + return bool(self.connection.ops.lwgeom_version()) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py new file mode 100644 index 0000000..9674486 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/backends/spatialite/introspection.py @@ -0,0 +1,73 @@ +from django.contrib.gis.gdal import OGRGeomType +from django.db.backends.sqlite3.introspection import ( + DatabaseIntrospection, FlexibleFieldLookupDict, +) + + +class GeoFlexibleFieldLookupDict(FlexibleFieldLookupDict): + """ + Sublcass that includes updates the `base_data_types_reverse` dict + for geometry field types. + """ + base_data_types_reverse = { + **FlexibleFieldLookupDict.base_data_types_reverse, + 'point': 'GeometryField', + 'linestring': 'GeometryField', + 'polygon': 'GeometryField', + 'multipoint': 'GeometryField', + 'multilinestring': 'GeometryField', + 'multipolygon': 'GeometryField', + 'geometrycollection': 'GeometryField', + } + + +class SpatiaLiteIntrospection(DatabaseIntrospection): + data_types_reverse = GeoFlexibleFieldLookupDict() + + def get_geometry_type(self, table_name, geo_col): + with self.connection.cursor() as cursor: + # Querying the `geometry_columns` table to get additional metadata. + cursor.execute('SELECT coord_dimension, srid, geometry_type ' + 'FROM geometry_columns ' + 'WHERE f_table_name=%s AND f_geometry_column=%s', + (table_name, geo_col)) + row = cursor.fetchone() + if not row: + raise Exception('Could not find a geometry column for "%s"."%s"' % + (table_name, geo_col)) + + # OGRGeomType does not require GDAL and makes it easy to convert + # from OGC geom type name to Django field. + ogr_type = row[2] + if isinstance(ogr_type, int) and ogr_type > 1000: + # SpatiaLite uses SFSQL 1.2 offsets 1000 (Z), 2000 (M), and + # 3000 (ZM) to indicate the presence of higher dimensional + # coordinates (M not yet supported by Django). + ogr_type = ogr_type % 1000 + OGRGeomType.wkb25bit + field_type = OGRGeomType(ogr_type).django + + # Getting any GeometryField keyword arguments that are not the default. + dim = row[0] + srid = row[1] + field_params = {} + if srid != 4326: + field_params['srid'] = srid + if (isinstance(dim, str) and 'Z' in dim) or dim == 3: + field_params['dim'] = 3 + return field_type, field_params + + def get_constraints(self, cursor, table_name): + constraints = super().get_constraints(cursor, table_name) + cursor.execute('SELECT f_geometry_column ' + 'FROM geometry_columns ' + 'WHERE f_table_name=%s AND spatial_index_enabled=1', (table_name,)) + for row in cursor.fetchall(): + constraints['%s__spatial__index' % row[0]] = { + "columns": [row[0]], + "primary_key": False, + "unique": False, + "foreign_key": None, + "check": False, + "index": True, + } + return constraints diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/fields.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/fields.py new file mode 100644 index 0000000..79fdbd2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/fields.py @@ -0,0 +1,381 @@ +from collections import defaultdict, namedtuple + +from django.contrib.gis import forms, gdal +from django.contrib.gis.db.models.proxy import SpatialProxy +from django.contrib.gis.gdal.error import GDALException +from django.contrib.gis.geos import ( + GeometryCollection, GEOSException, GEOSGeometry, LineString, + MultiLineString, MultiPoint, MultiPolygon, Point, Polygon, +) +from django.core.exceptions import ImproperlyConfigured +from django.db.models.fields import Field +from django.utils.translation import gettext_lazy as _ + +# Local cache of the spatial_ref_sys table, which holds SRID data for each +# spatial database alias. This cache exists so that the database isn't queried +# for SRID info each time a distance query is constructed. +_srid_cache = defaultdict(dict) + + +SRIDCacheEntry = namedtuple('SRIDCacheEntry', ['units', 'units_name', 'spheroid', 'geodetic']) + + +def get_srid_info(srid, connection): + """ + Return the units, unit name, and spheroid WKT associated with the + given SRID from the `spatial_ref_sys` (or equivalent) spatial database + table for the given database connection. These results are cached. + """ + from django.contrib.gis.gdal import SpatialReference + global _srid_cache + + try: + # The SpatialRefSys model for the spatial backend. + SpatialRefSys = connection.ops.spatial_ref_sys() + except NotImplementedError: + SpatialRefSys = None + + alias, get_srs = ( + (connection.alias, lambda srid: SpatialRefSys.objects.using(connection.alias).get(srid=srid).srs) + if SpatialRefSys else + (None, SpatialReference) + ) + if srid not in _srid_cache[alias]: + srs = get_srs(srid) + units, units_name = srs.units + _srid_cache[alias][srid] = SRIDCacheEntry( + units=units, + units_name=units_name, + spheroid='SPHEROID["%s",%s,%s]' % (srs['spheroid'], srs.semi_major, srs.inverse_flattening), + geodetic=srs.geographic, + ) + + return _srid_cache[alias][srid] + + +class BaseSpatialField(Field): + """ + The Base GIS Field. + + It's used as a base class for GeometryField and RasterField. Defines + properties that are common to all GIS fields such as the characteristics + of the spatial reference system of the field. + """ + description = _("The base GIS field.") + empty_strings_allowed = False + + def __init__(self, verbose_name=None, srid=4326, spatial_index=True, **kwargs): + """ + The initialization function for base spatial fields. Takes the following + as keyword arguments: + + srid: + The spatial reference system identifier, an OGC standard. + Defaults to 4326 (WGS84). + + spatial_index: + Indicates whether to create a spatial index. Defaults to True. + Set this instead of 'db_index' for geographic fields since index + creation is different for geometry columns. + """ + + # Setting the index flag with the value of the `spatial_index` keyword. + self.spatial_index = spatial_index + + # Setting the SRID and getting the units. Unit information must be + # easily available in the field instance for distance queries. + self.srid = srid + + # Setting the verbose_name keyword argument with the positional + # first parameter, so this works like normal fields. + kwargs['verbose_name'] = verbose_name + + super().__init__(**kwargs) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + # Always include SRID for less fragility; include spatial index if it's + # not the default value. + kwargs['srid'] = self.srid + if self.spatial_index is not True: + kwargs['spatial_index'] = self.spatial_index + return name, path, args, kwargs + + def db_type(self, connection): + return connection.ops.geo_db_type(self) + + def spheroid(self, connection): + return get_srid_info(self.srid, connection).spheroid + + def units(self, connection): + return get_srid_info(self.srid, connection).units + + def units_name(self, connection): + return get_srid_info(self.srid, connection).units_name + + def geodetic(self, connection): + """ + Return true if this field's SRID corresponds with a coordinate + system that uses non-projected units (e.g., latitude/longitude). + """ + return get_srid_info(self.srid, connection).geodetic + + def get_placeholder(self, value, compiler, connection): + """ + Return the placeholder for the spatial column for the + given value. + """ + return connection.ops.get_geom_placeholder(self, value, compiler) + + def get_srid(self, obj): + """ + Return the default SRID for the given geometry or raster, taking into + account the SRID set for the field. For example, if the input geometry + or raster doesn't have an SRID, then the SRID of the field will be + returned. + """ + srid = obj.srid # SRID of given geometry. + if srid is None or self.srid == -1 or (srid == -1 and self.srid != -1): + return self.srid + else: + return srid + + def get_db_prep_value(self, value, connection, *args, **kwargs): + if value is None: + return None + return connection.ops.Adapter( + super().get_db_prep_value(value, connection, *args, **kwargs), + **({'geography': True} if self.geography and connection.ops.geography else {}) + ) + + def get_raster_prep_value(self, value, is_candidate): + """ + Return a GDALRaster if conversion is successful, otherwise return None. + """ + if isinstance(value, gdal.GDALRaster): + return value + elif is_candidate: + try: + return gdal.GDALRaster(value) + except GDALException: + pass + elif isinstance(value, dict): + try: + return gdal.GDALRaster(value) + except GDALException: + raise ValueError("Couldn't create spatial object from lookup value '%s'." % value) + + def get_prep_value(self, value): + obj = super().get_prep_value(value) + if obj is None: + return None + # When the input is not a geometry or raster, attempt to construct one + # from the given string input. + if isinstance(obj, GEOSGeometry): + pass + else: + # Check if input is a candidate for conversion to raster or geometry. + is_candidate = isinstance(obj, (bytes, str)) or hasattr(obj, '__geo_interface__') + # Try to convert the input to raster. + raster = self.get_raster_prep_value(obj, is_candidate) + + if raster: + obj = raster + elif is_candidate: + try: + obj = GEOSGeometry(obj) + except (GEOSException, GDALException): + raise ValueError("Couldn't create spatial object from lookup value '%s'." % obj) + else: + raise ValueError('Cannot use object with type %s for a spatial lookup parameter.' % type(obj).__name__) + + # Assigning the SRID value. + obj.srid = self.get_srid(obj) + return obj + + +class GeometryField(BaseSpatialField): + """ + The base Geometry field -- maps to the OpenGIS Specification Geometry type. + """ + description = _("The base Geometry field -- maps to the OpenGIS Specification Geometry type.") + form_class = forms.GeometryField + # The OpenGIS Geometry name. + geom_type = 'GEOMETRY' + geom_class = None + + def __init__(self, verbose_name=None, dim=2, geography=False, *, extent=(-180.0, -90.0, 180.0, 90.0), + tolerance=0.05, **kwargs): + """ + The initialization function for geometry fields. In addition to the + parameters from BaseSpatialField, it takes the following as keyword + arguments: + + dim: + The number of dimensions for this geometry. Defaults to 2. + + extent: + Customize the extent, in a 4-tuple of WGS 84 coordinates, for the + geometry field entry in the `USER_SDO_GEOM_METADATA` table. Defaults + to (-180.0, -90.0, 180.0, 90.0). + + tolerance: + Define the tolerance, in meters, to use for the geometry field + entry in the `USER_SDO_GEOM_METADATA` table. Defaults to 0.05. + """ + # Setting the dimension of the geometry field. + self.dim = dim + + # Is this a geography rather than a geometry column? + self.geography = geography + + # Oracle-specific private attributes for creating the entry in + # `USER_SDO_GEOM_METADATA` + self._extent = extent + self._tolerance = tolerance + + super().__init__(verbose_name=verbose_name, **kwargs) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + # Include kwargs if they're not the default values. + if self.dim != 2: + kwargs['dim'] = self.dim + if self.geography is not False: + kwargs['geography'] = self.geography + if self._extent != (-180.0, -90.0, 180.0, 90.0): + kwargs['extent'] = self._extent + if self._tolerance != 0.05: + kwargs['tolerance'] = self._tolerance + return name, path, args, kwargs + + def contribute_to_class(self, cls, name, **kwargs): + super().contribute_to_class(cls, name, **kwargs) + + # Setup for lazy-instantiated Geometry object. + setattr(cls, self.attname, SpatialProxy(self.geom_class or GEOSGeometry, self, load_func=GEOSGeometry)) + + def formfield(self, **kwargs): + defaults = { + 'form_class': self.form_class, + 'geom_type': self.geom_type, + 'srid': self.srid, + **kwargs, + } + if self.dim > 2 and not getattr(defaults['form_class'].widget, 'supports_3d', False): + defaults.setdefault('widget', forms.Textarea) + return super().formfield(**defaults) + + def select_format(self, compiler, sql, params): + """ + Return the selection format string, depending on the requirements + of the spatial backend. For example, Oracle and MySQL require custom + selection formats in order to retrieve geometries in OGC WKB. + """ + return compiler.connection.ops.select % sql, params + + +# The OpenGIS Geometry Type Fields +class PointField(GeometryField): + geom_type = 'POINT' + geom_class = Point + form_class = forms.PointField + description = _("Point") + + +class LineStringField(GeometryField): + geom_type = 'LINESTRING' + geom_class = LineString + form_class = forms.LineStringField + description = _("Line string") + + +class PolygonField(GeometryField): + geom_type = 'POLYGON' + geom_class = Polygon + form_class = forms.PolygonField + description = _("Polygon") + + +class MultiPointField(GeometryField): + geom_type = 'MULTIPOINT' + geom_class = MultiPoint + form_class = forms.MultiPointField + description = _("Multi-point") + + +class MultiLineStringField(GeometryField): + geom_type = 'MULTILINESTRING' + geom_class = MultiLineString + form_class = forms.MultiLineStringField + description = _("Multi-line string") + + +class MultiPolygonField(GeometryField): + geom_type = 'MULTIPOLYGON' + geom_class = MultiPolygon + form_class = forms.MultiPolygonField + description = _("Multi polygon") + + +class GeometryCollectionField(GeometryField): + geom_type = 'GEOMETRYCOLLECTION' + geom_class = GeometryCollection + form_class = forms.GeometryCollectionField + description = _("Geometry collection") + + +class ExtentField(Field): + "Used as a return value from an extent aggregate" + + description = _("Extent Aggregate Field") + + def get_internal_type(self): + return "ExtentField" + + def select_format(self, compiler, sql, params): + select = compiler.connection.ops.select_extent + return select % sql if select else sql, params + + +class RasterField(BaseSpatialField): + """ + Raster field for GeoDjango -- evaluates into GDALRaster objects. + """ + + description = _("Raster Field") + geom_type = 'RASTER' + geography = False + + def _check_connection(self, connection): + # Make sure raster fields are used only on backends with raster support. + if not connection.features.gis_enabled or not connection.features.supports_raster: + raise ImproperlyConfigured('Raster fields require backends with raster support.') + + def db_type(self, connection): + self._check_connection(connection) + return super().db_type(connection) + + def from_db_value(self, value, expression, connection): + return connection.ops.parse_raster(value) + + def contribute_to_class(self, cls, name, **kwargs): + super().contribute_to_class(cls, name, **kwargs) + # Setup for lazy-instantiated Raster object. For large querysets, the + # instantiation of all GDALRasters can potentially be expensive. This + # delays the instantiation of the objects to the moment of evaluation + # of the raster attribute. + setattr(cls, self.attname, SpatialProxy(gdal.GDALRaster, self)) + + def get_transform(self, name): + from django.contrib.gis.db.models.lookups import RasterBandTransform + try: + band_index = int(name) + return type( + 'SpecificRasterBandTransform', + (RasterBandTransform,), + {'band_index': band_index} + ) + except ValueError: + pass + return super().get_transform(name) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/proxy.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/proxy.py new file mode 100644 index 0000000..282109b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/proxy.py @@ -0,0 +1,80 @@ +""" +The SpatialProxy object allows for lazy-geometries and lazy-rasters. The proxy +uses Python descriptors for instantiating and setting Geometry or Raster +objects corresponding to geographic model fields. + +Thanks to Robert Coup for providing this functionality (see #4322). +""" +from django.db.models.query_utils import DeferredAttribute + + +class SpatialProxy(DeferredAttribute): + def __init__(self, klass, field, load_func=None): + """ + Initialize on the given Geometry or Raster class (not an instance) + and the corresponding field. + """ + self._field = field + self._klass = klass + self._load_func = load_func or klass + super().__init__(field.attname) + + def __get__(self, instance, cls=None): + """ + Retrieve the geometry or raster, initializing it using the + corresponding class specified during initialization and the value of + the field. Currently, GEOS or OGR geometries as well as GDALRasters are + supported. + """ + if instance is None: + # Accessed on a class, not an instance + return self + + # Getting the value of the field. + try: + geo_value = instance.__dict__[self._field.attname] + except KeyError: + geo_value = super().__get__(instance, cls) + + if isinstance(geo_value, self._klass): + geo_obj = geo_value + elif (geo_value is None) or (geo_value == ''): + geo_obj = None + else: + # Otherwise, a geometry or raster object is built using the field's + # contents, and the model's corresponding attribute is set. + geo_obj = self._load_func(geo_value) + setattr(instance, self._field.attname, geo_obj) + return geo_obj + + def __set__(self, instance, value): + """ + Retrieve the proxied geometry or raster with the corresponding class + specified during initialization. + + To set geometries, use values of None, HEXEWKB, or WKT. + To set rasters, use JSON or dict values. + """ + # The geographic type of the field. + gtype = self._field.geom_type + + if gtype == 'RASTER' and (value is None or isinstance(value, (str, dict, self._klass))): + # For raster fields, assure input is None or a string, dict, or + # raster instance. + pass + elif isinstance(value, self._klass): + # The geometry type must match that of the field -- unless the + # general GeometryField is used. + if value.srid is None: + # Assigning the field SRID if the geometry has no SRID. + value.srid = self._field.srid + elif value is None or isinstance(value, (str, memoryview)): + # Set geometries with None, WKT, HEX, or WKB + pass + else: + raise TypeError('Cannot set %s SpatialProxy (%s) with value of type: %s' % ( + instance.__class__.__name__, gtype, type(value))) + + # Setting the objects dictionary with the value, and returning. + instance.__dict__[self._field.attname] = value + return value diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/__init__.py new file mode 100644 index 0000000..850c644 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/__init__.py @@ -0,0 +1,7 @@ +from django.contrib.gis.db.models.sql.conversion import ( + AreaField, DistanceField, +) + +__all__ = [ + 'AreaField', 'DistanceField', +] diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/conversion.py b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/conversion.py new file mode 100644 index 0000000..99ab51e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/db/models/sql/conversion.py @@ -0,0 +1,69 @@ +""" +This module holds simple classes to convert geospatial values from the +database. +""" +from decimal import Decimal + +from django.contrib.gis.measure import Area, Distance +from django.db import models + + +class AreaField(models.FloatField): + "Wrapper for Area values." + def __init__(self, geo_field): + super().__init__() + self.geo_field = geo_field + + def get_prep_value(self, value): + if not isinstance(value, Area): + raise ValueError('AreaField only accepts Area measurement objects.') + return value + + def get_db_prep_value(self, value, connection, prepared=False): + if value is None: + return + area_att = connection.ops.get_area_att_for_field(self.geo_field) + return getattr(value, area_att) if area_att else value + + def from_db_value(self, value, expression, connection): + if value is None: + return + # If the database returns a Decimal, convert it to a float as expected + # by the Python geometric objects. + if isinstance(value, Decimal): + value = float(value) + # If the units are known, convert value into area measure. + area_att = connection.ops.get_area_att_for_field(self.geo_field) + return Area(**{area_att: value}) if area_att else value + + def get_internal_type(self): + return 'AreaField' + + +class DistanceField(models.FloatField): + "Wrapper for Distance values." + def __init__(self, geo_field): + super().__init__() + self.geo_field = geo_field + + def get_prep_value(self, value): + if isinstance(value, Distance): + return value + return super().get_prep_value(value) + + def get_db_prep_value(self, value, connection, prepared=False): + if not isinstance(value, Distance): + return value + distance_att = connection.ops.get_distance_att_for_field(self.geo_field) + if not distance_att: + raise ValueError('Distance measure is supplied, but units are unknown for result.') + return getattr(value, distance_att) + + def from_db_value(self, value, expression, connection): + if value is None: + return + distance_att = connection.ops.get_distance_att_for_field(self.geo_field) + return Distance(**{distance_att: value}) if distance_att else value + + def get_internal_type(self): + return 'DistanceField' diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/forms/fields.py b/venv/lib/python3.7/site-packages/django/contrib/gis/forms/fields.py new file mode 100644 index 0000000..2699810 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/forms/fields.py @@ -0,0 +1,132 @@ +from django import forms +from django.contrib.gis.gdal import GDALException +from django.contrib.gis.geos import GEOSException, GEOSGeometry +from django.utils.translation import gettext_lazy as _ + +from .widgets import OpenLayersWidget + + +class GeometryField(forms.Field): + """ + This is the basic form field for a Geometry. Any textual input that is + accepted by GEOSGeometry is accepted by this form. By default, + this includes WKT, HEXEWKB, WKB (in a buffer), and GeoJSON. + """ + widget = OpenLayersWidget + geom_type = 'GEOMETRY' + + default_error_messages = { + 'required': _('No geometry value provided.'), + 'invalid_geom': _('Invalid geometry value.'), + 'invalid_geom_type': _('Invalid geometry type.'), + 'transform_error': _('An error occurred when transforming the geometry ' + 'to the SRID of the geometry form field.'), + } + + def __init__(self, *, srid=None, geom_type=None, **kwargs): + self.srid = srid + if geom_type is not None: + self.geom_type = geom_type + super().__init__(**kwargs) + self.widget.attrs['geom_type'] = self.geom_type + + def to_python(self, value): + """Transform the value to a Geometry object.""" + if value in self.empty_values: + return None + + if not isinstance(value, GEOSGeometry): + if hasattr(self.widget, 'deserialize'): + try: + value = self.widget.deserialize(value) + except GDALException: + value = None + else: + try: + value = GEOSGeometry(value) + except (GEOSException, ValueError, TypeError): + value = None + if value is None: + raise forms.ValidationError(self.error_messages['invalid_geom'], code='invalid_geom') + + # Try to set the srid + if not value.srid: + try: + value.srid = self.widget.map_srid + except AttributeError: + if self.srid: + value.srid = self.srid + return value + + def clean(self, value): + """ + Validate that the input value can be converted to a Geometry object + and return it. Raise a ValidationError if the value cannot be + instantiated as a Geometry. + """ + geom = super().clean(value) + if geom is None: + return geom + + # Ensuring that the geometry is of the correct type (indicated + # using the OGC string label). + if str(geom.geom_type).upper() != self.geom_type and not self.geom_type == 'GEOMETRY': + raise forms.ValidationError(self.error_messages['invalid_geom_type'], code='invalid_geom_type') + + # Transforming the geometry if the SRID was set. + if self.srid and self.srid != -1 and self.srid != geom.srid: + try: + geom.transform(self.srid) + except GEOSException: + raise forms.ValidationError( + self.error_messages['transform_error'], code='transform_error') + + return geom + + def has_changed(self, initial, data): + """ Compare geographic value of data with its initial value. """ + + try: + data = self.to_python(data) + initial = self.to_python(initial) + except forms.ValidationError: + return True + + # Only do a geographic comparison if both values are available + if initial and data: + data.transform(initial.srid) + # If the initial value was not added by the browser, the geometry + # provided may be slightly different, the first time it is saved. + # The comparison is done with a very low tolerance. + return not initial.equals_exact(data, tolerance=0.000001) + else: + # Check for change of state of existence + return bool(initial) != bool(data) + + +class GeometryCollectionField(GeometryField): + geom_type = 'GEOMETRYCOLLECTION' + + +class PointField(GeometryField): + geom_type = 'POINT' + + +class MultiPointField(GeometryField): + geom_type = 'MULTIPOINT' + + +class LineStringField(GeometryField): + geom_type = 'LINESTRING' + + +class MultiLineStringField(GeometryField): + geom_type = 'MULTILINESTRING' + + +class PolygonField(GeometryField): + geom_type = 'POLYGON' + + +class MultiPolygonField(GeometryField): + geom_type = 'MULTIPOLYGON' diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/forms/widgets.py b/venv/lib/python3.7/site-packages/django/contrib/gis/forms/widgets.py new file mode 100644 index 0000000..611bed9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/forms/widgets.py @@ -0,0 +1,117 @@ +import logging + +from django.conf import settings +from django.contrib.gis import gdal +from django.contrib.gis.geometry import json_regex +from django.contrib.gis.geos import GEOSException, GEOSGeometry +from django.forms.widgets import Widget +from django.utils import translation + +logger = logging.getLogger('django.contrib.gis') + + +class BaseGeometryWidget(Widget): + """ + The base class for rich geometry widgets. + Render a map using the WKT of the geometry. + """ + geom_type = 'GEOMETRY' + map_srid = 4326 + map_width = 600 + map_height = 400 + display_raw = False + + supports_3d = False + template_name = '' # set on subclasses + + def __init__(self, attrs=None): + self.attrs = {} + for key in ('geom_type', 'map_srid', 'map_width', 'map_height', 'display_raw'): + self.attrs[key] = getattr(self, key) + if attrs: + self.attrs.update(attrs) + + def serialize(self, value): + return value.wkt if value else '' + + def deserialize(self, value): + try: + return GEOSGeometry(value) + except (GEOSException, ValueError, TypeError) as err: + logger.error("Error creating geometry from value '%s' (%s)", value, err) + return None + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + # If a string reaches here (via a validation error on another + # field) then just reconstruct the Geometry. + if value and isinstance(value, str): + value = self.deserialize(value) + + if value: + # Check that srid of value and map match + if value.srid and value.srid != self.map_srid: + try: + ogr = value.ogr + ogr.transform(self.map_srid) + value = ogr + except gdal.GDALException as err: + logger.error( + "Error transforming geometry from srid '%s' to srid '%s' (%s)", + value.srid, self.map_srid, err + ) + + context.update(self.build_attrs(self.attrs, { + 'name': name, + 'module': 'geodjango_%s' % name.replace('-', '_'), # JS-safe + 'serialized': self.serialize(value), + 'geom_type': gdal.OGRGeomType(self.attrs['geom_type']), + 'STATIC_URL': settings.STATIC_URL, + 'LANGUAGE_BIDI': translation.get_language_bidi(), + **(attrs or {}), + })) + return context + + +class OpenLayersWidget(BaseGeometryWidget): + template_name = 'gis/openlayers.html' + map_srid = 3857 + + class Media: + css = { + 'all': ( + 'https://cdnjs.cloudflare.com/ajax/libs/ol3/4.6.5/ol.css', + 'gis/css/ol3.css', + ) + } + js = ( + 'https://cdnjs.cloudflare.com/ajax/libs/ol3/4.6.5/ol.js', + 'gis/js/OLMapWidget.js', + ) + + def serialize(self, value): + return value.json if value else '' + + def deserialize(self, value): + geom = super().deserialize(value) + # GeoJSON assumes WGS84 (4326). Use the map's SRID instead. + if geom and json_regex.match(value) and self.map_srid != 4326: + geom.srid = self.map_srid + return geom + + +class OSMWidget(OpenLayersWidget): + """ + An OpenLayers/OpenStreetMap-based widget. + """ + template_name = 'gis/openlayers-osm.html' + default_lon = 5 + default_lat = 47 + default_zoom = 12 + + def __init__(self, attrs=None): + super().__init__() + for key in ('default_lon', 'default_lat', 'default_zoom'): + self.attrs[key] = getattr(self, key) + if attrs: + self.attrs.update(attrs) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/envelope.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/envelope.py new file mode 100644 index 0000000..7921c97 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/envelope.py @@ -0,0 +1,178 @@ +""" + The GDAL/OGR library uses an Envelope structure to hold the bounding + box information for a geometry. The envelope (bounding box) contains + two pairs of coordinates, one for the lower left coordinate and one + for the upper right coordinate: + + +----------o Upper right; (max_x, max_y) + | | + | | + | | + Lower left (min_x, min_y) o----------+ +""" +from ctypes import Structure, c_double + +from django.contrib.gis.gdal.error import GDALException + + +# The OGR definition of an Envelope is a C structure containing four doubles. +# See the 'ogr_core.h' source file for more information: +# https://www.gdal.org/ogr__core_8h_source.html +class OGREnvelope(Structure): + "Represent the OGREnvelope C Structure." + _fields_ = [("MinX", c_double), + ("MaxX", c_double), + ("MinY", c_double), + ("MaxY", c_double), + ] + + +class Envelope: + """ + The Envelope object is a C structure that contains the minimum and + maximum X, Y coordinates for a rectangle bounding box. The naming + of the variables is compatible with the OGR Envelope structure. + """ + + def __init__(self, *args): + """ + The initialization function may take an OGREnvelope structure, 4-element + tuple or list, or 4 individual arguments. + """ + + if len(args) == 1: + if isinstance(args[0], OGREnvelope): + # OGREnvelope (a ctypes Structure) was passed in. + self._envelope = args[0] + elif isinstance(args[0], (tuple, list)): + # A tuple was passed in. + if len(args[0]) != 4: + raise GDALException('Incorrect number of tuple elements (%d).' % len(args[0])) + else: + self._from_sequence(args[0]) + else: + raise TypeError('Incorrect type of argument: %s' % type(args[0])) + elif len(args) == 4: + # Individual parameters passed in. + # Thanks to ww for the help + self._from_sequence([float(a) for a in args]) + else: + raise GDALException('Incorrect number (%d) of arguments.' % len(args)) + + # Checking the x,y coordinates + if self.min_x > self.max_x: + raise GDALException('Envelope minimum X > maximum X.') + if self.min_y > self.max_y: + raise GDALException('Envelope minimum Y > maximum Y.') + + def __eq__(self, other): + """ + Return True if the envelopes are equivalent; can compare against + other Envelopes and 4-tuples. + """ + if isinstance(other, Envelope): + return (self.min_x == other.min_x) and (self.min_y == other.min_y) and \ + (self.max_x == other.max_x) and (self.max_y == other.max_y) + elif isinstance(other, tuple) and len(other) == 4: + return (self.min_x == other[0]) and (self.min_y == other[1]) and \ + (self.max_x == other[2]) and (self.max_y == other[3]) + else: + raise GDALException('Equivalence testing only works with other Envelopes.') + + def __str__(self): + "Return a string representation of the tuple." + return str(self.tuple) + + def _from_sequence(self, seq): + "Initialize the C OGR Envelope structure from the given sequence." + self._envelope = OGREnvelope() + self._envelope.MinX = seq[0] + self._envelope.MinY = seq[1] + self._envelope.MaxX = seq[2] + self._envelope.MaxY = seq[3] + + def expand_to_include(self, *args): + """ + Modify the envelope to expand to include the boundaries of + the passed-in 2-tuple (a point), 4-tuple (an extent) or + envelope. + """ + # We provide a number of different signatures for this method, + # and the logic here is all about converting them into a + # 4-tuple single parameter which does the actual work of + # expanding the envelope. + if len(args) == 1: + if isinstance(args[0], Envelope): + return self.expand_to_include(args[0].tuple) + elif hasattr(args[0], 'x') and hasattr(args[0], 'y'): + return self.expand_to_include(args[0].x, args[0].y, args[0].x, args[0].y) + elif isinstance(args[0], (tuple, list)): + # A tuple was passed in. + if len(args[0]) == 2: + return self.expand_to_include((args[0][0], args[0][1], args[0][0], args[0][1])) + elif len(args[0]) == 4: + (minx, miny, maxx, maxy) = args[0] + if minx < self._envelope.MinX: + self._envelope.MinX = minx + if miny < self._envelope.MinY: + self._envelope.MinY = miny + if maxx > self._envelope.MaxX: + self._envelope.MaxX = maxx + if maxy > self._envelope.MaxY: + self._envelope.MaxY = maxy + else: + raise GDALException('Incorrect number of tuple elements (%d).' % len(args[0])) + else: + raise TypeError('Incorrect type of argument: %s' % type(args[0])) + elif len(args) == 2: + # An x and an y parameter were passed in + return self.expand_to_include((args[0], args[1], args[0], args[1])) + elif len(args) == 4: + # Individual parameters passed in. + return self.expand_to_include(args) + else: + raise GDALException('Incorrect number (%d) of arguments.' % len(args[0])) + + @property + def min_x(self): + "Return the value of the minimum X coordinate." + return self._envelope.MinX + + @property + def min_y(self): + "Return the value of the minimum Y coordinate." + return self._envelope.MinY + + @property + def max_x(self): + "Return the value of the maximum X coordinate." + return self._envelope.MaxX + + @property + def max_y(self): + "Return the value of the maximum Y coordinate." + return self._envelope.MaxY + + @property + def ur(self): + "Return the upper-right coordinate." + return (self.max_x, self.max_y) + + @property + def ll(self): + "Return the lower-left coordinate." + return (self.min_x, self.min_y) + + @property + def tuple(self): + "Return a tuple representing the envelope." + return (self.min_x, self.min_y, self.max_x, self.max_y) + + @property + def wkt(self): + "Return WKT representing a Polygon for this envelope." + # TODO: Fix significant figures. + return 'POLYGON((%s %s,%s %s,%s %s,%s %s,%s %s))' % \ + (self.min_x, self.min_y, self.min_x, self.max_y, + self.max_x, self.max_y, self.max_x, self.min_y, + self.min_x, self.min_y) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/geometries.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/geometries.py new file mode 100644 index 0000000..6bc5df5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/geometries.py @@ -0,0 +1,715 @@ +""" + The OGRGeometry is a wrapper for using the OGR Geometry class + (see https://www.gdal.org/classOGRGeometry.html). OGRGeometry + may be instantiated when reading geometries from OGR Data Sources + (e.g. SHP files), or when given OGC WKT (a string). + + While the 'full' API is not present yet, the API is "pythonic" unlike + the traditional and "next-generation" OGR Python bindings. One major + advantage OGR Geometries have over their GEOS counterparts is support + for spatial reference systems and their transformation. + + Example: + >>> from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, SpatialReference + >>> wkt1, wkt2 = 'POINT(-90 30)', 'POLYGON((0 0, 5 0, 5 5, 0 5)' + >>> pnt = OGRGeometry(wkt1) + >>> print(pnt) + POINT (-90 30) + >>> mpnt = OGRGeometry(OGRGeomType('MultiPoint'), SpatialReference('WGS84')) + >>> mpnt.add(wkt1) + >>> mpnt.add(wkt1) + >>> print(mpnt) + MULTIPOINT (-90 30,-90 30) + >>> print(mpnt.srs.name) + WGS 84 + >>> print(mpnt.srs.proj) + +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs + >>> mpnt.transform(SpatialReference('NAD27')) + >>> print(mpnt.proj) + +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs + >>> print(mpnt) + MULTIPOINT (-89.999930378602485 29.999797886557641,-89.999930378602485 29.999797886557641) + + The OGRGeomType class is to make it easy to specify an OGR geometry type: + >>> from django.contrib.gis.gdal import OGRGeomType + >>> gt1 = OGRGeomType(3) # Using an integer for the type + >>> gt2 = OGRGeomType('Polygon') # Using a string + >>> gt3 = OGRGeomType('POLYGON') # It's case-insensitive + >>> print(gt1 == 3, gt1 == 'Polygon') # Equivalence works w/non-OGRGeomType objects + True True +""" +import sys +from binascii import b2a_hex +from ctypes import byref, c_char_p, c_double, c_ubyte, c_void_p, string_at + +from django.contrib.gis.gdal.base import GDALBase +from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope +from django.contrib.gis.gdal.error import GDALException, SRSException +from django.contrib.gis.gdal.geomtype import OGRGeomType +from django.contrib.gis.gdal.libgdal import GDAL_VERSION +from django.contrib.gis.gdal.prototypes import geom as capi, srs as srs_api +from django.contrib.gis.gdal.srs import CoordTransform, SpatialReference +from django.contrib.gis.geometry import hex_regex, json_regex, wkt_regex +from django.utils.encoding import force_bytes + + +# For more information, see the OGR C API source code: +# https://www.gdal.org/ogr__api_8h.html +# +# The OGR_G_* routines are relevant here. +class OGRGeometry(GDALBase): + """Encapsulate an OGR geometry.""" + destructor = capi.destroy_geom + + def __init__(self, geom_input, srs=None): + """Initialize Geometry on either WKT or an OGR pointer as input.""" + str_instance = isinstance(geom_input, str) + + # If HEX, unpack input to a binary buffer. + if str_instance and hex_regex.match(geom_input): + geom_input = memoryview(bytes.fromhex(geom_input)) + str_instance = False + + # Constructing the geometry, + if str_instance: + wkt_m = wkt_regex.match(geom_input) + json_m = json_regex.match(geom_input) + if wkt_m: + if wkt_m.group('srid'): + # If there's EWKT, set the SRS w/value of the SRID. + srs = int(wkt_m.group('srid')) + if wkt_m.group('type').upper() == 'LINEARRING': + # OGR_G_CreateFromWkt doesn't work with LINEARRING WKT. + # See https://trac.osgeo.org/gdal/ticket/1992. + g = capi.create_geom(OGRGeomType(wkt_m.group('type')).num) + capi.import_wkt(g, byref(c_char_p(wkt_m.group('wkt').encode()))) + else: + g = capi.from_wkt(byref(c_char_p(wkt_m.group('wkt').encode())), None, byref(c_void_p())) + elif json_m: + g = self._from_json(geom_input.encode()) + else: + # Seeing if the input is a valid short-hand string + # (e.g., 'Point', 'POLYGON'). + OGRGeomType(geom_input) + g = capi.create_geom(OGRGeomType(geom_input).num) + elif isinstance(geom_input, memoryview): + # WKB was passed in + g = self._from_wkb(geom_input) + elif isinstance(geom_input, OGRGeomType): + # OGRGeomType was passed in, an empty geometry will be created. + g = capi.create_geom(geom_input.num) + elif isinstance(geom_input, self.ptr_type): + # OGR pointer (c_void_p) was the input. + g = geom_input + else: + raise GDALException('Invalid input type for OGR Geometry construction: %s' % type(geom_input)) + + # Now checking the Geometry pointer before finishing initialization + # by setting the pointer for the object. + if not g: + raise GDALException('Cannot create OGR Geometry from input: %s' % geom_input) + self.ptr = g + + # Assigning the SpatialReference object to the geometry, if valid. + if srs: + self.srs = srs + + # Setting the class depending upon the OGR Geometry Type + self.__class__ = GEO_CLASSES[self.geom_type.num] + + # Pickle routines + def __getstate__(self): + srs = self.srs + if srs: + srs = srs.wkt + else: + srs = None + return bytes(self.wkb), srs + + def __setstate__(self, state): + wkb, srs = state + ptr = capi.from_wkb(wkb, None, byref(c_void_p()), len(wkb)) + if not ptr: + raise GDALException('Invalid OGRGeometry loaded from pickled state.') + self.ptr = ptr + self.srs = srs + + @classmethod + def _from_wkb(cls, geom_input): + return capi.from_wkb(bytes(geom_input), None, byref(c_void_p()), len(geom_input)) + + @staticmethod + def _from_json(geom_input): + ptr = capi.from_json(geom_input) + if GDAL_VERSION < (2, 0): + try: + capi.get_geom_srs(ptr) + except SRSException: + srs = SpatialReference(4326) + capi.assign_srs(ptr, srs.ptr) + return ptr + + @classmethod + def from_bbox(cls, bbox): + "Construct a Polygon from a bounding box (4-tuple)." + x0, y0, x1, y1 = bbox + return OGRGeometry('POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))' % ( + x0, y0, x0, y1, x1, y1, x1, y0, x0, y0)) + + @staticmethod + def from_json(geom_input): + return OGRGeometry(OGRGeometry._from_json(force_bytes(geom_input))) + + @classmethod + def from_gml(cls, gml_string): + return cls(capi.from_gml(force_bytes(gml_string))) + + # ### Geometry set-like operations ### + # g = g1 | g2 + def __or__(self, other): + "Return the union of the two geometries." + return self.union(other) + + # g = g1 & g2 + def __and__(self, other): + "Return the intersection of this Geometry and the other." + return self.intersection(other) + + # g = g1 - g2 + def __sub__(self, other): + "Return the difference this Geometry and the other." + return self.difference(other) + + # g = g1 ^ g2 + def __xor__(self, other): + "Return the symmetric difference of this Geometry and the other." + return self.sym_difference(other) + + def __eq__(self, other): + "Is this Geometry equal to the other?" + return isinstance(other, OGRGeometry) and self.equals(other) + + def __str__(self): + "WKT is used for the string representation." + return self.wkt + + # #### Geometry Properties #### + @property + def dimension(self): + "Return 0 for points, 1 for lines, and 2 for surfaces." + return capi.get_dims(self.ptr) + + def _get_coord_dim(self): + "Return the coordinate dimension of the Geometry." + return capi.get_coord_dim(self.ptr) + + def _set_coord_dim(self, dim): + "Set the coordinate dimension of this Geometry." + if dim not in (2, 3): + raise ValueError('Geometry dimension must be either 2 or 3') + capi.set_coord_dim(self.ptr, dim) + + coord_dim = property(_get_coord_dim, _set_coord_dim) + + @property + def geom_count(self): + "Return the number of elements in this Geometry." + return capi.get_geom_count(self.ptr) + + @property + def point_count(self): + "Return the number of Points in this Geometry." + return capi.get_point_count(self.ptr) + + @property + def num_points(self): + "Alias for `point_count` (same name method in GEOS API.)" + return self.point_count + + @property + def num_coords(self): + "Alias for `point_count`." + return self.point_count + + @property + def geom_type(self): + "Return the Type for this Geometry." + return OGRGeomType(capi.get_geom_type(self.ptr)) + + @property + def geom_name(self): + "Return the Name of this Geometry." + return capi.get_geom_name(self.ptr) + + @property + def area(self): + "Return the area for a LinearRing, Polygon, or MultiPolygon; 0 otherwise." + return capi.get_area(self.ptr) + + @property + def envelope(self): + "Return the envelope for this Geometry." + # TODO: Fix Envelope() for Point geometries. + return Envelope(capi.get_envelope(self.ptr, byref(OGREnvelope()))) + + @property + def empty(self): + return capi.is_empty(self.ptr) + + @property + def extent(self): + "Return the envelope as a 4-tuple, instead of as an Envelope object." + return self.envelope.tuple + + # #### SpatialReference-related Properties #### + + # The SRS property + def _get_srs(self): + "Return the Spatial Reference for this Geometry." + try: + srs_ptr = capi.get_geom_srs(self.ptr) + return SpatialReference(srs_api.clone_srs(srs_ptr)) + except SRSException: + return None + + def _set_srs(self, srs): + "Set the SpatialReference for this geometry." + # Do not have to clone the `SpatialReference` object pointer because + # when it is assigned to this `OGRGeometry` it's internal OGR + # reference count is incremented, and will likewise be released + # (decremented) when this geometry's destructor is called. + if isinstance(srs, SpatialReference): + srs_ptr = srs.ptr + elif isinstance(srs, (int, str)): + sr = SpatialReference(srs) + srs_ptr = sr.ptr + elif srs is None: + srs_ptr = None + else: + raise TypeError('Cannot assign spatial reference with object of type: %s' % type(srs)) + capi.assign_srs(self.ptr, srs_ptr) + + srs = property(_get_srs, _set_srs) + + # The SRID property + def _get_srid(self): + srs = self.srs + if srs: + return srs.srid + return None + + def _set_srid(self, srid): + if isinstance(srid, int) or srid is None: + self.srs = srid + else: + raise TypeError('SRID must be set with an integer.') + + srid = property(_get_srid, _set_srid) + + # #### Output Methods #### + def _geos_ptr(self): + from django.contrib.gis.geos import GEOSGeometry + return GEOSGeometry._from_wkb(self.wkb) + + @property + def geos(self): + "Return a GEOSGeometry object from this OGRGeometry." + from django.contrib.gis.geos import GEOSGeometry + return GEOSGeometry(self._geos_ptr(), self.srid) + + @property + def gml(self): + "Return the GML representation of the Geometry." + return capi.to_gml(self.ptr) + + @property + def hex(self): + "Return the hexadecimal representation of the WKB (a string)." + return b2a_hex(self.wkb).upper() + + @property + def json(self): + """ + Return the GeoJSON representation of this Geometry. + """ + return capi.to_json(self.ptr) + geojson = json + + @property + def kml(self): + "Return the KML representation of the Geometry." + return capi.to_kml(self.ptr, None) + + @property + def wkb_size(self): + "Return the size of the WKB buffer." + return capi.get_wkbsize(self.ptr) + + @property + def wkb(self): + "Return the WKB representation of the Geometry." + if sys.byteorder == 'little': + byteorder = 1 # wkbNDR (from ogr_core.h) + else: + byteorder = 0 # wkbXDR + sz = self.wkb_size + # Creating the unsigned character buffer, and passing it in by reference. + buf = (c_ubyte * sz)() + capi.to_wkb(self.ptr, byteorder, byref(buf)) + # Returning a buffer of the string at the pointer. + return memoryview(string_at(buf, sz)) + + @property + def wkt(self): + "Return the WKT representation of the Geometry." + return capi.to_wkt(self.ptr, byref(c_char_p())) + + @property + def ewkt(self): + "Return the EWKT representation of the Geometry." + srs = self.srs + if srs and srs.srid: + return 'SRID=%s;%s' % (srs.srid, self.wkt) + else: + return self.wkt + + # #### Geometry Methods #### + def clone(self): + "Clone this OGR Geometry." + return OGRGeometry(capi.clone_geom(self.ptr), self.srs) + + def close_rings(self): + """ + If there are any rings within this geometry that have not been + closed, this routine will do so by adding the starting point at the + end. + """ + # Closing the open rings. + capi.geom_close_rings(self.ptr) + + def transform(self, coord_trans, clone=False): + """ + Transform this geometry to a different spatial reference system. + May take a CoordTransform object, a SpatialReference object, string + WKT or PROJ.4, and/or an integer SRID. By default, return nothing + and transform the geometry in-place. However, if the `clone` keyword is + set, return a transformed clone of this geometry. + """ + if clone: + klone = self.clone() + klone.transform(coord_trans) + return klone + + # Depending on the input type, use the appropriate OGR routine + # to perform the transformation. + if isinstance(coord_trans, CoordTransform): + capi.geom_transform(self.ptr, coord_trans.ptr) + elif isinstance(coord_trans, SpatialReference): + capi.geom_transform_to(self.ptr, coord_trans.ptr) + elif isinstance(coord_trans, (int, str)): + sr = SpatialReference(coord_trans) + capi.geom_transform_to(self.ptr, sr.ptr) + else: + raise TypeError('Transform only accepts CoordTransform, ' + 'SpatialReference, string, and integer objects.') + + # #### Topology Methods #### + def _topology(self, func, other): + """A generalized function for topology operations, takes a GDAL function and + the other geometry to perform the operation on.""" + if not isinstance(other, OGRGeometry): + raise TypeError('Must use another OGRGeometry object for topology operations!') + + # Returning the output of the given function with the other geometry's + # pointer. + return func(self.ptr, other.ptr) + + def intersects(self, other): + "Return True if this geometry intersects with the other." + return self._topology(capi.ogr_intersects, other) + + def equals(self, other): + "Return True if this geometry is equivalent to the other." + return self._topology(capi.ogr_equals, other) + + def disjoint(self, other): + "Return True if this geometry and the other are spatially disjoint." + return self._topology(capi.ogr_disjoint, other) + + def touches(self, other): + "Return True if this geometry touches the other." + return self._topology(capi.ogr_touches, other) + + def crosses(self, other): + "Return True if this geometry crosses the other." + return self._topology(capi.ogr_crosses, other) + + def within(self, other): + "Return True if this geometry is within the other." + return self._topology(capi.ogr_within, other) + + def contains(self, other): + "Return True if this geometry contains the other." + return self._topology(capi.ogr_contains, other) + + def overlaps(self, other): + "Return True if this geometry overlaps the other." + return self._topology(capi.ogr_overlaps, other) + + # #### Geometry-generation Methods #### + def _geomgen(self, gen_func, other=None): + "A helper routine for the OGR routines that generate geometries." + if isinstance(other, OGRGeometry): + return OGRGeometry(gen_func(self.ptr, other.ptr), self.srs) + else: + return OGRGeometry(gen_func(self.ptr), self.srs) + + @property + def boundary(self): + "Return the boundary of this geometry." + return self._geomgen(capi.get_boundary) + + @property + def convex_hull(self): + """ + Return the smallest convex Polygon that contains all the points in + this Geometry. + """ + return self._geomgen(capi.geom_convex_hull) + + def difference(self, other): + """ + Return a new geometry consisting of the region which is the difference + of this geometry and the other. + """ + return self._geomgen(capi.geom_diff, other) + + def intersection(self, other): + """ + Return a new geometry consisting of the region of intersection of this + geometry and the other. + """ + return self._geomgen(capi.geom_intersection, other) + + def sym_difference(self, other): + """ + Return a new geometry which is the symmetric difference of this + geometry and the other. + """ + return self._geomgen(capi.geom_sym_diff, other) + + def union(self, other): + """ + Return a new geometry consisting of the region which is the union of + this geometry and the other. + """ + return self._geomgen(capi.geom_union, other) + + +# The subclasses for OGR Geometry. +class Point(OGRGeometry): + + def _geos_ptr(self): + from django.contrib.gis import geos + return geos.Point._create_empty() if self.empty else super()._geos_ptr() + + @classmethod + def _create_empty(cls): + return capi.create_geom(OGRGeomType('point').num) + + @property + def x(self): + "Return the X coordinate for this Point." + return capi.getx(self.ptr, 0) + + @property + def y(self): + "Return the Y coordinate for this Point." + return capi.gety(self.ptr, 0) + + @property + def z(self): + "Return the Z coordinate for this Point." + if self.coord_dim == 3: + return capi.getz(self.ptr, 0) + + @property + def tuple(self): + "Return the tuple of this point." + if self.coord_dim == 2: + return (self.x, self.y) + elif self.coord_dim == 3: + return (self.x, self.y, self.z) + coords = tuple + + +class LineString(OGRGeometry): + + def __getitem__(self, index): + "Return the Point at the given index." + if 0 <= index < self.point_count: + x, y, z = c_double(), c_double(), c_double() + capi.get_point(self.ptr, index, byref(x), byref(y), byref(z)) + dim = self.coord_dim + if dim == 1: + return (x.value,) + elif dim == 2: + return (x.value, y.value) + elif dim == 3: + return (x.value, y.value, z.value) + else: + raise IndexError('Index out of range when accessing points of a line string: %s.' % index) + + def __len__(self): + "Return the number of points in the LineString." + return self.point_count + + @property + def tuple(self): + "Return the tuple representation of this LineString." + return tuple(self[i] for i in range(len(self))) + coords = tuple + + def _listarr(self, func): + """ + Internal routine that returns a sequence (list) corresponding with + the given function. + """ + return [func(self.ptr, i) for i in range(len(self))] + + @property + def x(self): + "Return the X coordinates in a list." + return self._listarr(capi.getx) + + @property + def y(self): + "Return the Y coordinates in a list." + return self._listarr(capi.gety) + + @property + def z(self): + "Return the Z coordinates in a list." + if self.coord_dim == 3: + return self._listarr(capi.getz) + + +# LinearRings are used in Polygons. +class LinearRing(LineString): + pass + + +class Polygon(OGRGeometry): + + def __len__(self): + "Return the number of interior rings in this Polygon." + return self.geom_count + + def __getitem__(self, index): + "Get the ring at the specified index." + if 0 <= index < self.geom_count: + return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs) + else: + raise IndexError('Index out of range when accessing rings of a polygon: %s.' % index) + + # Polygon Properties + @property + def shell(self): + "Return the shell of this Polygon." + return self[0] # First ring is the shell + exterior_ring = shell + + @property + def tuple(self): + "Return a tuple of LinearRing coordinate tuples." + return tuple(self[i].tuple for i in range(self.geom_count)) + coords = tuple + + @property + def point_count(self): + "Return the number of Points in this Polygon." + # Summing up the number of points in each ring of the Polygon. + return sum(self[i].point_count for i in range(self.geom_count)) + + @property + def centroid(self): + "Return the centroid (a Point) of this Polygon." + # The centroid is a Point, create a geometry for this. + p = OGRGeometry(OGRGeomType('Point')) + capi.get_centroid(self.ptr, p.ptr) + return p + + +# Geometry Collection base class. +class GeometryCollection(OGRGeometry): + "The Geometry Collection class." + + def __getitem__(self, index): + "Get the Geometry at the specified index." + if 0 <= index < self.geom_count: + return OGRGeometry(capi.clone_geom(capi.get_geom_ref(self.ptr, index)), self.srs) + else: + raise IndexError('Index out of range when accessing geometry in a collection: %s.' % index) + + def __len__(self): + "Return the number of geometries in this Geometry Collection." + return self.geom_count + + def add(self, geom): + "Add the geometry to this Geometry Collection." + if isinstance(geom, OGRGeometry): + if isinstance(geom, self.__class__): + for g in geom: + capi.add_geom(self.ptr, g.ptr) + else: + capi.add_geom(self.ptr, geom.ptr) + elif isinstance(geom, str): + tmp = OGRGeometry(geom) + capi.add_geom(self.ptr, tmp.ptr) + else: + raise GDALException('Must add an OGRGeometry.') + + @property + def point_count(self): + "Return the number of Points in this Geometry Collection." + # Summing up the number of points in each geometry in this collection + return sum(self[i].point_count for i in range(self.geom_count)) + + @property + def tuple(self): + "Return a tuple representation of this Geometry Collection." + return tuple(self[i].tuple for i in range(self.geom_count)) + coords = tuple + + +# Multiple Geometry types. +class MultiPoint(GeometryCollection): + pass + + +class MultiLineString(GeometryCollection): + pass + + +class MultiPolygon(GeometryCollection): + pass + + +# Class mapping dictionary (using the OGRwkbGeometryType as the key) +GEO_CLASSES = { + 1: Point, + 2: LineString, + 3: Polygon, + 4: MultiPoint, + 5: MultiLineString, + 6: MultiPolygon, + 7: GeometryCollection, + 101: LinearRing, + 1 + OGRGeomType.wkb25bit: Point, + 2 + OGRGeomType.wkb25bit: LineString, + 3 + OGRGeomType.wkb25bit: Polygon, + 4 + OGRGeomType.wkb25bit: MultiPoint, + 5 + OGRGeomType.wkb25bit: MultiLineString, + 6 + OGRGeomType.wkb25bit: MultiPolygon, + 7 + OGRGeomType.wkb25bit: GeometryCollection, +} diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/generation.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/generation.py new file mode 100644 index 0000000..012a5ba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/generation.py @@ -0,0 +1,158 @@ +""" + This module contains functions that generate ctypes prototypes for the + GDAL routines. +""" +from ctypes import POINTER, c_char_p, c_double, c_int, c_int64, c_void_p +from functools import partial + +from django.contrib.gis.gdal.prototypes.errcheck import ( + check_arg_errcode, check_const_string, check_errcode, check_geom, + check_geom_offset, check_pointer, check_srs, check_str_arg, check_string, +) + + +class gdal_char_p(c_char_p): + pass + + +def double_output(func, argtypes, errcheck=False, strarg=False, cpl=False): + "Generate a ctypes function that returns a double value." + func.argtypes = argtypes + func.restype = c_double + if errcheck: + func.errcheck = partial(check_arg_errcode, cpl=cpl) + if strarg: + func.errcheck = check_str_arg + return func + + +def geom_output(func, argtypes, offset=None): + """ + Generate a function that returns a Geometry either by reference + or directly (if the return_geom keyword is set to True). + """ + # Setting the argument types + func.argtypes = argtypes + + if not offset: + # When a geometry pointer is directly returned. + func.restype = c_void_p + func.errcheck = check_geom + else: + # Error code returned, geometry is returned by-reference. + func.restype = c_int + + def geomerrcheck(result, func, cargs): + return check_geom_offset(result, func, cargs, offset) + func.errcheck = geomerrcheck + + return func + + +def int_output(func, argtypes, errcheck=None): + "Generate a ctypes function that returns an integer value." + func.argtypes = argtypes + func.restype = c_int + if errcheck: + func.errcheck = errcheck + return func + + +def int64_output(func, argtypes): + "Generate a ctypes function that returns a 64-bit integer value." + func.argtypes = argtypes + func.restype = c_int64 + return func + + +def srs_output(func, argtypes): + """ + Generate a ctypes prototype for the given function with + the given C arguments that returns a pointer to an OGR + Spatial Reference System. + """ + func.argtypes = argtypes + func.restype = c_void_p + func.errcheck = check_srs + return func + + +def const_string_output(func, argtypes, offset=None, decoding=None, cpl=False): + func.argtypes = argtypes + if offset: + func.restype = c_int + else: + func.restype = c_char_p + + def _check_const(result, func, cargs): + res = check_const_string(result, func, cargs, offset=offset, cpl=cpl) + if res and decoding: + res = res.decode(decoding) + return res + func.errcheck = _check_const + + return func + + +def string_output(func, argtypes, offset=-1, str_result=False, decoding=None): + """ + Generate a ctypes prototype for the given function with the + given argument types that returns a string from a GDAL pointer. + The `const` flag indicates whether the allocated pointer should + be freed via the GDAL library routine VSIFree -- but only applies + only when `str_result` is True. + """ + func.argtypes = argtypes + if str_result: + # Use subclass of c_char_p so the error checking routine + # can free the memory at the pointer's address. + func.restype = gdal_char_p + else: + # Error code is returned + func.restype = c_int + + # Dynamically defining our error-checking function with the + # given offset. + def _check_str(result, func, cargs): + res = check_string(result, func, cargs, offset=offset, str_result=str_result) + if res and decoding: + res = res.decode(decoding) + return res + func.errcheck = _check_str + return func + + +def void_output(func, argtypes, errcheck=True, cpl=False): + """ + For functions that don't only return an error code that needs to + be examined. + """ + if argtypes: + func.argtypes = argtypes + if errcheck: + # `errcheck` keyword may be set to False for routines that + # return void, rather than a status code. + func.restype = c_int + func.errcheck = partial(check_errcode, cpl=cpl) + else: + func.restype = None + + return func + + +def voidptr_output(func, argtypes, errcheck=True): + "For functions that return c_void_p." + func.argtypes = argtypes + func.restype = c_void_p + if errcheck: + func.errcheck = check_pointer + return func + + +def chararray_output(func, argtypes, errcheck=True): + """For functions that return a c_char_p array.""" + func.argtypes = argtypes + func.restype = POINTER(c_char_p) + if errcheck: + func.errcheck = check_pointer + return func diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/raster.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/raster.py new file mode 100644 index 0000000..32b4f70 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/raster.py @@ -0,0 +1,108 @@ +""" +This module houses the ctypes function prototypes for GDAL DataSource (raster) +related data structures. +""" +from ctypes import POINTER, c_bool, c_char_p, c_double, c_int, c_void_p +from functools import partial + +from django.contrib.gis.gdal.libgdal import GDAL_VERSION, std_call +from django.contrib.gis.gdal.prototypes.generation import ( + chararray_output, const_string_output, double_output, int_output, + void_output, voidptr_output, +) + +# For more detail about c function names and definitions see +# https://gdal.org/gdal_8h.html +# https://gdal.org/gdalwarper_8h.html +# https://www.gdal.org/gdal__utils_8h.html + +# Prepare partial functions that use cpl error codes +void_output = partial(void_output, cpl=True) +const_string_output = partial(const_string_output, cpl=True) +double_output = partial(double_output, cpl=True) + +# Raster Driver Routines +register_all = void_output(std_call('GDALAllRegister'), [], errcheck=False) +get_driver = voidptr_output(std_call('GDALGetDriver'), [c_int]) +get_driver_by_name = voidptr_output(std_call('GDALGetDriverByName'), [c_char_p], errcheck=False) +get_driver_count = int_output(std_call('GDALGetDriverCount'), []) +get_driver_description = const_string_output(std_call('GDALGetDescription'), [c_void_p]) + +# Raster Data Source Routines +create_ds = voidptr_output(std_call('GDALCreate'), [c_void_p, c_char_p, c_int, c_int, c_int, c_int, c_void_p]) +open_ds = voidptr_output(std_call('GDALOpen'), [c_char_p, c_int]) +close_ds = void_output(std_call('GDALClose'), [c_void_p], errcheck=False) +flush_ds = int_output(std_call('GDALFlushCache'), [c_void_p]) +copy_ds = voidptr_output( + std_call('GDALCreateCopy'), + [c_void_p, c_char_p, c_void_p, c_int, POINTER(c_char_p), c_void_p, c_void_p] +) +add_band_ds = void_output(std_call('GDALAddBand'), [c_void_p, c_int]) +get_ds_description = const_string_output(std_call('GDALGetDescription'), [c_void_p]) +get_ds_driver = voidptr_output(std_call('GDALGetDatasetDriver'), [c_void_p]) +get_ds_xsize = int_output(std_call('GDALGetRasterXSize'), [c_void_p]) +get_ds_ysize = int_output(std_call('GDALGetRasterYSize'), [c_void_p]) +get_ds_raster_count = int_output(std_call('GDALGetRasterCount'), [c_void_p]) +get_ds_raster_band = voidptr_output(std_call('GDALGetRasterBand'), [c_void_p, c_int]) +get_ds_projection_ref = const_string_output(std_call('GDALGetProjectionRef'), [c_void_p]) +set_ds_projection_ref = void_output(std_call('GDALSetProjection'), [c_void_p, c_char_p]) +get_ds_geotransform = void_output(std_call('GDALGetGeoTransform'), [c_void_p, POINTER(c_double * 6)], errcheck=False) +set_ds_geotransform = void_output(std_call('GDALSetGeoTransform'), [c_void_p, POINTER(c_double * 6)]) + +get_ds_metadata = chararray_output(std_call('GDALGetMetadata'), [c_void_p, c_char_p], errcheck=False) +set_ds_metadata = void_output(std_call('GDALSetMetadata'), [c_void_p, POINTER(c_char_p), c_char_p]) +get_ds_metadata_domain_list = chararray_output(std_call('GDALGetMetadataDomainList'), [c_void_p], errcheck=False) +get_ds_metadata_item = const_string_output(std_call('GDALGetMetadataItem'), [c_void_p, c_char_p, c_char_p]) +set_ds_metadata_item = const_string_output(std_call('GDALSetMetadataItem'), [c_void_p, c_char_p, c_char_p, c_char_p]) +free_dsl = void_output(std_call('CSLDestroy'), [POINTER(c_char_p)], errcheck=False) + +if GDAL_VERSION >= (2, 1): + get_ds_info = const_string_output(std_call('GDALInfo'), [c_void_p, c_void_p]) +else: + get_ds_info = None + +# Raster Band Routines +band_io = void_output( + std_call('GDALRasterIO'), + [c_void_p, c_int, c_int, c_int, c_int, c_int, c_void_p, c_int, c_int, c_int, c_int, c_int] +) +get_band_xsize = int_output(std_call('GDALGetRasterBandXSize'), [c_void_p]) +get_band_ysize = int_output(std_call('GDALGetRasterBandYSize'), [c_void_p]) +get_band_index = int_output(std_call('GDALGetBandNumber'), [c_void_p]) +get_band_description = const_string_output(std_call('GDALGetDescription'), [c_void_p]) +get_band_ds = voidptr_output(std_call('GDALGetBandDataset'), [c_void_p]) +get_band_datatype = int_output(std_call('GDALGetRasterDataType'), [c_void_p]) +get_band_color_interp = int_output(std_call('GDALGetRasterColorInterpretation'), [c_void_p]) +get_band_nodata_value = double_output(std_call('GDALGetRasterNoDataValue'), [c_void_p, POINTER(c_int)]) +set_band_nodata_value = void_output(std_call('GDALSetRasterNoDataValue'), [c_void_p, c_double]) +if GDAL_VERSION >= (2, 1): + delete_band_nodata_value = void_output(std_call('GDALDeleteRasterNoDataValue'), [c_void_p]) +else: + delete_band_nodata_value = None +get_band_statistics = void_output( + std_call('GDALGetRasterStatistics'), + [ + c_void_p, c_int, c_int, POINTER(c_double), POINTER(c_double), + POINTER(c_double), POINTER(c_double), c_void_p, c_void_p, + ], +) +compute_band_statistics = void_output( + std_call('GDALComputeRasterStatistics'), + [c_void_p, c_int, POINTER(c_double), POINTER(c_double), POINTER(c_double), POINTER(c_double), c_void_p, c_void_p], +) + +# Reprojection routine +reproject_image = void_output( + std_call('GDALReprojectImage'), + [c_void_p, c_char_p, c_void_p, c_char_p, c_int, c_double, c_double, c_void_p, c_void_p, c_void_p] +) +auto_create_warped_vrt = voidptr_output( + std_call('GDALAutoCreateWarpedVRT'), + [c_void_p, c_char_p, c_char_p, c_int, c_double, c_void_p] +) + +# Create VSI gdal raster files from in-memory buffers. +# https://gdal.org/cpl__vsi_8h.html +create_vsi_file_from_mem_buffer = voidptr_output(std_call('VSIFileFromMemBuffer'), [c_char_p, c_void_p, c_int, c_int]) +get_mem_buffer_from_vsi_file = voidptr_output(std_call('VSIGetMemFileBuffer'), [c_char_p, POINTER(c_int), c_bool]) +unlink_vsi_file = int_output(std_call('VSIUnlink'), [c_char_p]) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/srs.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/srs.py new file mode 100644 index 0000000..9b1da3e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/prototypes/srs.py @@ -0,0 +1,80 @@ +from ctypes import POINTER, c_char_p, c_int, c_void_p + +from django.contrib.gis.gdal.libgdal import lgdal, std_call +from django.contrib.gis.gdal.prototypes.generation import ( + const_string_output, double_output, int_output, srs_output, string_output, + void_output, +) + + +# Shortcut generation for routines with known parameters. +def srs_double(f): + """ + Create a function prototype for the OSR routines that take + the OSRSpatialReference object and return a double value. + """ + return double_output(f, [c_void_p, POINTER(c_int)], errcheck=True) + + +def units_func(f): + """ + Create a ctypes function prototype for OSR units functions, e.g., + OSRGetAngularUnits, OSRGetLinearUnits. + """ + return double_output(f, [c_void_p, POINTER(c_char_p)], strarg=True) + + +# Creation & destruction. +clone_srs = srs_output(std_call('OSRClone'), [c_void_p]) +new_srs = srs_output(std_call('OSRNewSpatialReference'), [c_char_p]) +release_srs = void_output(lgdal.OSRRelease, [c_void_p], errcheck=False) +destroy_srs = void_output(std_call('OSRDestroySpatialReference'), [c_void_p], errcheck=False) +srs_validate = void_output(lgdal.OSRValidate, [c_void_p]) + +# Getting the semi_major, semi_minor, and flattening functions. +semi_major = srs_double(lgdal.OSRGetSemiMajor) +semi_minor = srs_double(lgdal.OSRGetSemiMinor) +invflattening = srs_double(lgdal.OSRGetInvFlattening) + +# WKT, PROJ, EPSG, XML importation routines. +from_wkt = void_output(lgdal.OSRImportFromWkt, [c_void_p, POINTER(c_char_p)]) +from_proj = void_output(lgdal.OSRImportFromProj4, [c_void_p, c_char_p]) +from_epsg = void_output(std_call('OSRImportFromEPSG'), [c_void_p, c_int]) +from_xml = void_output(lgdal.OSRImportFromXML, [c_void_p, c_char_p]) +from_user_input = void_output(std_call('OSRSetFromUserInput'), [c_void_p, c_char_p]) + +# Morphing to/from ESRI WKT. +morph_to_esri = void_output(lgdal.OSRMorphToESRI, [c_void_p]) +morph_from_esri = void_output(lgdal.OSRMorphFromESRI, [c_void_p]) + +# Identifying the EPSG +identify_epsg = void_output(lgdal.OSRAutoIdentifyEPSG, [c_void_p]) + +# Getting the angular_units, linear_units functions +linear_units = units_func(lgdal.OSRGetLinearUnits) +angular_units = units_func(lgdal.OSRGetAngularUnits) + +# For exporting to WKT, PROJ.4, "Pretty" WKT, and XML. +to_wkt = string_output(std_call('OSRExportToWkt'), [c_void_p, POINTER(c_char_p)], decoding='utf-8') +to_proj = string_output(std_call('OSRExportToProj4'), [c_void_p, POINTER(c_char_p)], decoding='ascii') +to_pretty_wkt = string_output( + std_call('OSRExportToPrettyWkt'), + [c_void_p, POINTER(c_char_p), c_int], offset=-2, decoding='utf-8' +) + +# Memory leak fixed in GDAL 1.5; still exists in 1.4. +to_xml = string_output(lgdal.OSRExportToXML, [c_void_p, POINTER(c_char_p), c_char_p], offset=-2, decoding='utf-8') + +# String attribute retrival routines. +get_attr_value = const_string_output(std_call('OSRGetAttrValue'), [c_void_p, c_char_p, c_int], decoding='utf-8') +get_auth_name = const_string_output(lgdal.OSRGetAuthorityName, [c_void_p, c_char_p], decoding='ascii') +get_auth_code = const_string_output(lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p], decoding='ascii') + +# SRS Properties +isgeographic = int_output(lgdal.OSRIsGeographic, [c_void_p]) +islocal = int_output(lgdal.OSRIsLocal, [c_void_p]) +isprojected = int_output(lgdal.OSRIsProjected, [c_void_p]) + +# Coordinate transformation +new_ct = srs_output(std_call('OCTNewCoordinateTransformation'), [c_void_p, c_void_p]) +destroy_ct = void_output(std_call('OCTDestroyCoordinateTransformation'), [c_void_p], errcheck=False) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/band.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/band.py new file mode 100644 index 0000000..e1ead63 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/band.py @@ -0,0 +1,252 @@ +from ctypes import byref, c_double, c_int, c_void_p + +from django.contrib.gis.gdal.error import GDALException +from django.contrib.gis.gdal.prototypes import raster as capi +from django.contrib.gis.gdal.raster.base import GDALRasterBase +from django.contrib.gis.shortcuts import numpy +from django.utils.encoding import force_text + +from .const import ( + GDAL_COLOR_TYPES, GDAL_INTEGER_TYPES, GDAL_PIXEL_TYPES, GDAL_TO_CTYPES, +) + + +class GDALBand(GDALRasterBase): + """ + Wrap a GDAL raster band, needs to be obtained from a GDALRaster object. + """ + def __init__(self, source, index): + self.source = source + self._ptr = capi.get_ds_raster_band(source._ptr, index) + + def _flush(self): + """ + Call the flush method on the Band's parent raster and force a refresh + of the statistics attribute when requested the next time. + """ + self.source._flush() + self._stats_refresh = True + + @property + def description(self): + """ + Return the description string of the band. + """ + return force_text(capi.get_band_description(self._ptr)) + + @property + def width(self): + """ + Width (X axis) in pixels of the band. + """ + return capi.get_band_xsize(self._ptr) + + @property + def height(self): + """ + Height (Y axis) in pixels of the band. + """ + return capi.get_band_ysize(self._ptr) + + @property + def pixel_count(self): + """ + Return the total number of pixels in this band. + """ + return self.width * self.height + + _stats_refresh = False + + def statistics(self, refresh=False, approximate=False): + """ + Compute statistics on the pixel values of this band. + + The return value is a tuple with the following structure: + (minimum, maximum, mean, standard deviation). + + If approximate=True, the statistics may be computed based on overviews + or a subset of image tiles. + + If refresh=True, the statistics will be computed from the data directly, + and the cache will be updated where applicable. + + For empty bands (where all pixel values are nodata), all statistics + values are returned as None. + + For raster formats using Persistent Auxiliary Metadata (PAM) services, + the statistics might be cached in an auxiliary file. + """ + # Prepare array with arguments for capi function + smin, smax, smean, sstd = c_double(), c_double(), c_double(), c_double() + stats_args = [ + self._ptr, c_int(approximate), byref(smin), byref(smax), + byref(smean), byref(sstd), c_void_p(), c_void_p(), + ] + + if refresh or self._stats_refresh: + func = capi.compute_band_statistics + else: + # Add additional argument to force computation if there is no + # existing PAM file to take the values from. + force = True + stats_args.insert(2, c_int(force)) + func = capi.get_band_statistics + + # Computation of statistics fails for empty bands. + try: + func(*stats_args) + result = smin.value, smax.value, smean.value, sstd.value + except GDALException: + result = (None, None, None, None) + + self._stats_refresh = False + + return result + + @property + def min(self): + """ + Return the minimum pixel value for this band. + """ + return self.statistics()[0] + + @property + def max(self): + """ + Return the maximum pixel value for this band. + """ + return self.statistics()[1] + + @property + def mean(self): + """ + Return the mean of all pixel values of this band. + """ + return self.statistics()[2] + + @property + def std(self): + """ + Return the standard deviation of all pixel values of this band. + """ + return self.statistics()[3] + + @property + def nodata_value(self): + """ + Return the nodata value for this band, or None if it isn't set. + """ + # Get value and nodata exists flag + nodata_exists = c_int() + value = capi.get_band_nodata_value(self._ptr, nodata_exists) + if not nodata_exists: + value = None + # If the pixeltype is an integer, convert to int + elif self.datatype() in GDAL_INTEGER_TYPES: + value = int(value) + return value + + @nodata_value.setter + def nodata_value(self, value): + """ + Set the nodata value for this band. + """ + if value is None: + if not capi.delete_band_nodata_value: + raise ValueError('GDAL >= 2.1 required to delete nodata values.') + capi.delete_band_nodata_value(self._ptr) + elif not isinstance(value, (int, float)): + raise ValueError('Nodata value must be numeric or None.') + else: + capi.set_band_nodata_value(self._ptr, value) + self._flush() + + def datatype(self, as_string=False): + """ + Return the GDAL Pixel Datatype for this band. + """ + dtype = capi.get_band_datatype(self._ptr) + if as_string: + dtype = GDAL_PIXEL_TYPES[dtype] + return dtype + + def color_interp(self, as_string=False): + """Return the GDAL color interpretation for this band.""" + color = capi.get_band_color_interp(self._ptr) + if as_string: + color = GDAL_COLOR_TYPES[color] + return color + + def data(self, data=None, offset=None, size=None, shape=None, as_memoryview=False): + """ + Read or writes pixel values for this band. Blocks of data can + be accessed by specifying the width, height and offset of the + desired block. The same specification can be used to update + parts of a raster by providing an array of values. + + Allowed input data types are bytes, memoryview, list, tuple, and array. + """ + offset = offset or (0, 0) + size = size or (self.width - offset[0], self.height - offset[1]) + shape = shape or size + if any(x <= 0 for x in size): + raise ValueError('Offset too big for this raster.') + + if size[0] > self.width or size[1] > self.height: + raise ValueError('Size is larger than raster.') + + # Create ctypes type array generator + ctypes_array = GDAL_TO_CTYPES[self.datatype()] * (shape[0] * shape[1]) + + if data is None: + # Set read mode + access_flag = 0 + # Prepare empty ctypes array + data_array = ctypes_array() + else: + # Set write mode + access_flag = 1 + + # Instantiate ctypes array holding the input data + if isinstance(data, (bytes, memoryview)) or (numpy and isinstance(data, numpy.ndarray)): + data_array = ctypes_array.from_buffer_copy(data) + else: + data_array = ctypes_array(*data) + + # Access band + capi.band_io(self._ptr, access_flag, offset[0], offset[1], + size[0], size[1], byref(data_array), shape[0], + shape[1], self.datatype(), 0, 0) + + # Return data as numpy array if possible, otherwise as list + if data is None: + if as_memoryview: + return memoryview(data_array) + elif numpy: + # reshape() needs a reshape parameter with the height first. + return numpy.frombuffer( + data_array, dtype=numpy.dtype(data_array) + ).reshape(tuple(reversed(size))) + else: + return list(data_array) + else: + self._flush() + + +class BandList(list): + def __init__(self, source): + self.source = source + super().__init__() + + def __iter__(self): + for idx in range(1, len(self) + 1): + yield GDALBand(self.source, idx) + + def __len__(self): + return capi.get_ds_raster_count(self.source._ptr) + + def __getitem__(self, index): + try: + return GDALBand(self.source, index + 1) + except GDALException: + raise GDALException('Unable to get band index %d' % index) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/base.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/base.py new file mode 100644 index 0000000..c5b438e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/base.py @@ -0,0 +1,75 @@ +from django.contrib.gis.gdal.base import GDALBase +from django.contrib.gis.gdal.prototypes import raster as capi + + +class GDALRasterBase(GDALBase): + """ + Attributes that exist on both GDALRaster and GDALBand. + """ + @property + def metadata(self): + """ + Return the metadata for this raster or band. The return value is a + nested dictionary, where the first-level key is the metadata domain and + the second-level is the metadata item names and values for that domain. + """ + # The initial metadata domain list contains the default domain. + # The default is returned if domain name is None. + domain_list = ['DEFAULT'] + + # Get additional metadata domains from the raster. + meta_list = capi.get_ds_metadata_domain_list(self._ptr) + if meta_list: + # The number of domains is unknown, so retrieve data until there + # are no more values in the ctypes array. + counter = 0 + domain = meta_list[counter] + while domain: + domain_list.append(domain.decode()) + counter += 1 + domain = meta_list[counter] + + # Free domain list array. + capi.free_dsl(meta_list) + + # Retrieve metadata values for each domain. + result = {} + for domain in domain_list: + # Get metadata for this domain. + data = capi.get_ds_metadata( + self._ptr, + (None if domain == 'DEFAULT' else domain.encode()), + ) + if not data: + continue + # The number of metadata items is unknown, so retrieve data until + # there are no more values in the ctypes array. + domain_meta = {} + counter = 0 + item = data[counter] + while item: + key, val = item.decode().split('=') + domain_meta[key] = val + counter += 1 + item = data[counter] + # The default domain values are returned if domain is None. + result[domain or 'DEFAULT'] = domain_meta + return result + + @metadata.setter + def metadata(self, value): + """ + Set the metadata. Update only the domains that are contained in the + value dictionary. + """ + # Loop through domains. + for domain, metadata in value.items(): + # Set the domain to None for the default, otherwise encode. + domain = None if domain == 'DEFAULT' else domain.encode() + # Set each metadata entry separately. + for meta_name, meta_value in metadata.items(): + capi.set_ds_metadata_item( + self._ptr, meta_name.encode(), + meta_value.encode() if meta_value else None, + domain, + ) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/source.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/source.py new file mode 100644 index 0000000..fc02bce --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/raster/source.py @@ -0,0 +1,467 @@ +import json +import os +import sys +import uuid +from ctypes import ( + addressof, byref, c_buffer, c_char_p, c_double, c_int, c_void_p, string_at, +) + +from django.contrib.gis.gdal.driver import Driver +from django.contrib.gis.gdal.error import GDALException +from django.contrib.gis.gdal.prototypes import raster as capi +from django.contrib.gis.gdal.raster.band import BandList +from django.contrib.gis.gdal.raster.base import GDALRasterBase +from django.contrib.gis.gdal.raster.const import ( + GDAL_RESAMPLE_ALGORITHMS, VSI_DELETE_BUFFER_ON_READ, + VSI_FILESYSTEM_BASE_PATH, VSI_TAKE_BUFFER_OWNERSHIP, +) +from django.contrib.gis.gdal.srs import SpatialReference, SRSException +from django.contrib.gis.geometry import json_regex +from django.utils.encoding import force_bytes, force_text +from django.utils.functional import cached_property + + +class TransformPoint(list): + indices = { + 'origin': (0, 3), + 'scale': (1, 5), + 'skew': (2, 4), + } + + def __init__(self, raster, prop): + x = raster.geotransform[self.indices[prop][0]] + y = raster.geotransform[self.indices[prop][1]] + super().__init__([x, y]) + self._raster = raster + self._prop = prop + + @property + def x(self): + return self[0] + + @x.setter + def x(self, value): + gtf = self._raster.geotransform + gtf[self.indices[self._prop][0]] = value + self._raster.geotransform = gtf + + @property + def y(self): + return self[1] + + @y.setter + def y(self, value): + gtf = self._raster.geotransform + gtf[self.indices[self._prop][1]] = value + self._raster.geotransform = gtf + + +class GDALRaster(GDALRasterBase): + """ + Wrap a raster GDAL Data Source object. + """ + destructor = capi.close_ds + + def __init__(self, ds_input, write=False): + self._write = 1 if write else 0 + Driver.ensure_registered() + + # Preprocess json inputs. This converts json strings to dictionaries, + # which are parsed below the same way as direct dictionary inputs. + if isinstance(ds_input, str) and json_regex.match(ds_input): + ds_input = json.loads(ds_input) + + # If input is a valid file path, try setting file as source. + if isinstance(ds_input, str): + try: + # GDALOpen will auto-detect the data source type. + self._ptr = capi.open_ds(force_bytes(ds_input), self._write) + except GDALException as err: + raise GDALException('Could not open the datasource at "{}" ({}).'.format(ds_input, err)) + elif isinstance(ds_input, bytes): + # Create a new raster in write mode. + self._write = 1 + # Get size of buffer. + size = sys.getsizeof(ds_input) + # Pass data to ctypes, keeping a reference to the ctypes object so + # that the vsimem file remains available until the GDALRaster is + # deleted. + self._ds_input = c_buffer(ds_input) + # Create random name to reference in vsimem filesystem. + vsi_path = os.path.join(VSI_FILESYSTEM_BASE_PATH, str(uuid.uuid4())) + # Create vsimem file from buffer. + capi.create_vsi_file_from_mem_buffer( + force_bytes(vsi_path), + byref(self._ds_input), + size, + VSI_TAKE_BUFFER_OWNERSHIP, + ) + # Open the new vsimem file as a GDALRaster. + try: + self._ptr = capi.open_ds(force_bytes(vsi_path), self._write) + except GDALException: + # Remove the broken file from the VSI filesystem. + capi.unlink_vsi_file(force_bytes(vsi_path)) + raise GDALException('Failed creating VSI raster from the input buffer.') + elif isinstance(ds_input, dict): + # A new raster needs to be created in write mode + self._write = 1 + + # Create driver (in memory by default) + driver = Driver(ds_input.get('driver', 'MEM')) + + # For out of memory drivers, check filename argument + if driver.name != 'MEM' and 'name' not in ds_input: + raise GDALException('Specify name for creation of raster with driver "{}".'.format(driver.name)) + + # Check if width and height where specified + if 'width' not in ds_input or 'height' not in ds_input: + raise GDALException('Specify width and height attributes for JSON or dict input.') + + # Check if srid was specified + if 'srid' not in ds_input: + raise GDALException('Specify srid for JSON or dict input.') + + # Create null terminated gdal options array. + papsz_options = [] + for key, val in ds_input.get('papsz_options', {}).items(): + option = '{}={}'.format(key, val) + papsz_options.append(option.upper().encode()) + papsz_options.append(None) + + # Convert papszlist to ctypes array. + papsz_options = (c_char_p * len(papsz_options))(*papsz_options) + + # Create GDAL Raster + self._ptr = capi.create_ds( + driver._ptr, + force_bytes(ds_input.get('name', '')), + ds_input['width'], + ds_input['height'], + ds_input.get('nr_of_bands', len(ds_input.get('bands', []))), + ds_input.get('datatype', 6), + byref(papsz_options), + ) + + # Set band data if provided + for i, band_input in enumerate(ds_input.get('bands', [])): + band = self.bands[i] + if 'nodata_value' in band_input: + band.nodata_value = band_input['nodata_value'] + # Instantiate band filled with nodata values if only + # partial input data has been provided. + if band.nodata_value is not None and ( + 'data' not in band_input or + 'size' in band_input or + 'shape' in band_input): + band.data(data=(band.nodata_value,), shape=(1, 1)) + # Set band data values from input. + band.data( + data=band_input.get('data'), + size=band_input.get('size'), + shape=band_input.get('shape'), + offset=band_input.get('offset'), + ) + + # Set SRID + self.srs = ds_input.get('srid') + + # Set additional properties if provided + if 'origin' in ds_input: + self.origin.x, self.origin.y = ds_input['origin'] + + if 'scale' in ds_input: + self.scale.x, self.scale.y = ds_input['scale'] + + if 'skew' in ds_input: + self.skew.x, self.skew.y = ds_input['skew'] + elif isinstance(ds_input, c_void_p): + # Instantiate the object using an existing pointer to a gdal raster. + self._ptr = ds_input + else: + raise GDALException('Invalid data source input type: "{}".'.format(type(ds_input))) + + def __del__(self): + if self.is_vsi_based: + # Remove the temporary file from the VSI in-memory filesystem. + capi.unlink_vsi_file(force_bytes(self.name)) + super().__del__() + + def __str__(self): + return self.name + + def __repr__(self): + """ + Short-hand representation because WKB may be very large. + """ + return '' % hex(addressof(self._ptr)) + + def _flush(self): + """ + Flush all data from memory into the source file if it exists. + The data that needs flushing are geotransforms, coordinate systems, + nodata_values and pixel values. This function will be called + automatically wherever it is needed. + """ + # Raise an Exception if the value is being changed in read mode. + if not self._write: + raise GDALException('Raster needs to be opened in write mode to change values.') + capi.flush_ds(self._ptr) + + @property + def vsi_buffer(self): + if not self.is_vsi_based: + return None + # Prepare an integer that will contain the buffer length. + out_length = c_int() + # Get the data using the vsi file name. + dat = capi.get_mem_buffer_from_vsi_file( + force_bytes(self.name), + byref(out_length), + VSI_DELETE_BUFFER_ON_READ, + ) + # Read the full buffer pointer. + return string_at(dat, out_length.value) + + @cached_property + def is_vsi_based(self): + return self.name.startswith(VSI_FILESYSTEM_BASE_PATH) + + @property + def name(self): + """ + Return the name of this raster. Corresponds to filename + for file-based rasters. + """ + return force_text(capi.get_ds_description(self._ptr)) + + @cached_property + def driver(self): + """ + Return the GDAL Driver used for this raster. + """ + ds_driver = capi.get_ds_driver(self._ptr) + return Driver(ds_driver) + + @property + def width(self): + """ + Width (X axis) in pixels. + """ + return capi.get_ds_xsize(self._ptr) + + @property + def height(self): + """ + Height (Y axis) in pixels. + """ + return capi.get_ds_ysize(self._ptr) + + @property + def srs(self): + """ + Return the SpatialReference used in this GDALRaster. + """ + try: + wkt = capi.get_ds_projection_ref(self._ptr) + if not wkt: + return None + return SpatialReference(wkt, srs_type='wkt') + except SRSException: + return None + + @srs.setter + def srs(self, value): + """ + Set the spatial reference used in this GDALRaster. The input can be + a SpatialReference or any parameter accepted by the SpatialReference + constructor. + """ + if isinstance(value, SpatialReference): + srs = value + elif isinstance(value, (int, str)): + srs = SpatialReference(value) + else: + raise ValueError('Could not create a SpatialReference from input.') + capi.set_ds_projection_ref(self._ptr, srs.wkt.encode()) + self._flush() + + @property + def srid(self): + """ + Shortcut to access the srid of this GDALRaster. + """ + return self.srs.srid + + @srid.setter + def srid(self, value): + """ + Shortcut to set this GDALRaster's srs from an srid. + """ + self.srs = value + + @property + def geotransform(self): + """ + Return the geotransform of the data source. + Return the default geotransform if it does not exist or has not been + set previously. The default is [0.0, 1.0, 0.0, 0.0, 0.0, -1.0]. + """ + # Create empty ctypes double array for data + gtf = (c_double * 6)() + capi.get_ds_geotransform(self._ptr, byref(gtf)) + return list(gtf) + + @geotransform.setter + def geotransform(self, values): + "Set the geotransform for the data source." + if len(values) != 6 or not all(isinstance(x, (int, float)) for x in values): + raise ValueError('Geotransform must consist of 6 numeric values.') + # Create ctypes double array with input and write data + values = (c_double * 6)(*values) + capi.set_ds_geotransform(self._ptr, byref(values)) + self._flush() + + @property + def origin(self): + """ + Coordinates of the raster origin. + """ + return TransformPoint(self, 'origin') + + @property + def scale(self): + """ + Pixel scale in units of the raster projection. + """ + return TransformPoint(self, 'scale') + + @property + def skew(self): + """ + Skew of pixels (rotation parameters). + """ + return TransformPoint(self, 'skew') + + @property + def extent(self): + """ + Return the extent as a 4-tuple (xmin, ymin, xmax, ymax). + """ + # Calculate boundary values based on scale and size + xval = self.origin.x + self.scale.x * self.width + yval = self.origin.y + self.scale.y * self.height + # Calculate min and max values + xmin = min(xval, self.origin.x) + xmax = max(xval, self.origin.x) + ymin = min(yval, self.origin.y) + ymax = max(yval, self.origin.y) + + return xmin, ymin, xmax, ymax + + @property + def bands(self): + return BandList(self) + + def warp(self, ds_input, resampling='NearestNeighbour', max_error=0.0): + """ + Return a warped GDALRaster with the given input characteristics. + + The input is expected to be a dictionary containing the parameters + of the target raster. Allowed values are width, height, SRID, origin, + scale, skew, datatype, driver, and name (filename). + + By default, the warp functions keeps all parameters equal to the values + of the original source raster. For the name of the target raster, the + name of the source raster will be used and appended with + _copy. + source_driver_name. + + In addition, the resampling algorithm can be specified with the "resampling" + input parameter. The default is NearestNeighbor. For a list of all options + consult the GDAL_RESAMPLE_ALGORITHMS constant. + """ + # Get the parameters defining the geotransform, srid, and size of the raster + ds_input.setdefault('width', self.width) + ds_input.setdefault('height', self.height) + ds_input.setdefault('srid', self.srs.srid) + ds_input.setdefault('origin', self.origin) + ds_input.setdefault('scale', self.scale) + ds_input.setdefault('skew', self.skew) + # Get the driver, name, and datatype of the target raster + ds_input.setdefault('driver', self.driver.name) + + if 'name' not in ds_input: + ds_input['name'] = self.name + '_copy.' + self.driver.name + + if 'datatype' not in ds_input: + ds_input['datatype'] = self.bands[0].datatype() + + # Instantiate raster bands filled with nodata values. + ds_input['bands'] = [{'nodata_value': bnd.nodata_value} for bnd in self.bands] + + # Create target raster + target = GDALRaster(ds_input, write=True) + + # Select resampling algorithm + algorithm = GDAL_RESAMPLE_ALGORITHMS[resampling] + + # Reproject image + capi.reproject_image( + self._ptr, self.srs.wkt.encode(), + target._ptr, target.srs.wkt.encode(), + algorithm, 0.0, max_error, + c_void_p(), c_void_p(), c_void_p() + ) + + # Make sure all data is written to file + target._flush() + + return target + + def transform(self, srid, driver=None, name=None, resampling='NearestNeighbour', + max_error=0.0): + """ + Return a copy of this raster reprojected into the given SRID. + """ + # Convert the resampling algorithm name into an algorithm id + algorithm = GDAL_RESAMPLE_ALGORITHMS[resampling] + + # Instantiate target spatial reference system + target_srs = SpatialReference(srid) + + # Create warped virtual dataset in the target reference system + target = capi.auto_create_warped_vrt( + self._ptr, self.srs.wkt.encode(), target_srs.wkt.encode(), + algorithm, max_error, c_void_p() + ) + target = GDALRaster(target) + + # Construct the target warp dictionary from the virtual raster + data = { + 'srid': srid, + 'width': target.width, + 'height': target.height, + 'origin': [target.origin.x, target.origin.y], + 'scale': [target.scale.x, target.scale.y], + 'skew': [target.skew.x, target.skew.y], + } + + # Set the driver and filepath if provided + if driver: + data['driver'] = driver + + if name: + data['name'] = name + + # Warp the raster into new srid + return self.warp(data, resampling=resampling, max_error=max_error) + + @property + def info(self): + """ + Return information about this raster in a string format equivalent + to the output of the gdalinfo command line utility. + """ + if not capi.get_ds_info: + raise ValueError('GDAL ≥ 2.1 is required for using the info property.') + return capi.get_ds_info(self.ptr, None).decode() diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/srs.py b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/srs.py new file mode 100644 index 0000000..b2e0b09 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/gdal/srs.py @@ -0,0 +1,335 @@ +""" + The Spatial Reference class, represents OGR Spatial Reference objects. + + Example: + >>> from django.contrib.gis.gdal import SpatialReference + >>> srs = SpatialReference('WGS84') + >>> print(srs) + GEOGCS["WGS 84", + DATUM["WGS_1984", + SPHEROID["WGS 84",6378137,298.257223563, + AUTHORITY["EPSG","7030"]], + TOWGS84[0,0,0,0,0,0,0], + AUTHORITY["EPSG","6326"]], + PRIMEM["Greenwich",0, + AUTHORITY["EPSG","8901"]], + UNIT["degree",0.01745329251994328, + AUTHORITY["EPSG","9122"]], + AUTHORITY["EPSG","4326"]] + >>> print(srs.proj) + +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs + >>> print(srs.ellipsoid) + (6378137.0, 6356752.3142451793, 298.25722356300003) + >>> print(srs.projected, srs.geographic) + False True + >>> srs.import_epsg(32140) + >>> print(srs.name) + NAD83 / Texas South Central +""" +from ctypes import byref, c_char_p, c_int + +from django.contrib.gis.gdal.base import GDALBase +from django.contrib.gis.gdal.error import SRSException +from django.contrib.gis.gdal.prototypes import srs as capi +from django.utils.encoding import force_bytes, force_text + + +class SpatialReference(GDALBase): + """ + A wrapper for the OGRSpatialReference object. According to the GDAL Web site, + the SpatialReference object "provide[s] services to represent coordinate + systems (projections and datums) and to transform between them." + """ + destructor = capi.release_srs + + def __init__(self, srs_input='', srs_type='user'): + """ + Create a GDAL OSR Spatial Reference object from the given input. + The input may be string of OGC Well Known Text (WKT), an integer + EPSG code, a PROJ.4 string, and/or a projection "well known" shorthand + string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83'). + """ + + if srs_type == 'wkt': + self.ptr = capi.new_srs(c_char_p(b'')) + self.import_wkt(srs_input) + return + elif isinstance(srs_input, str): + try: + # If SRID is a string, e.g., '4326', then make acceptable + # as user input. + srid = int(srs_input) + srs_input = 'EPSG:%d' % srid + except ValueError: + pass + elif isinstance(srs_input, int): + # EPSG integer code was input. + srs_type = 'epsg' + elif isinstance(srs_input, self.ptr_type): + srs = srs_input + srs_type = 'ogr' + else: + raise TypeError('Invalid SRS type "%s"' % srs_type) + + if srs_type == 'ogr': + # Input is already an SRS pointer. + srs = srs_input + else: + # Creating a new SRS pointer, using the string buffer. + buf = c_char_p(b'') + srs = capi.new_srs(buf) + + # If the pointer is NULL, throw an exception. + if not srs: + raise SRSException('Could not create spatial reference from: %s' % srs_input) + else: + self.ptr = srs + + # Importing from either the user input string or an integer SRID. + if srs_type == 'user': + self.import_user_input(srs_input) + elif srs_type == 'epsg': + self.import_epsg(srs_input) + + def __getitem__(self, target): + """ + Return the value of the given string attribute node, None if the node + doesn't exist. Can also take a tuple as a parameter, (target, child), + where child is the index of the attribute in the WKT. For example: + + >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]' + >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326 + >>> print(srs['GEOGCS']) + WGS 84 + >>> print(srs['DATUM']) + WGS_1984 + >>> print(srs['AUTHORITY']) + EPSG + >>> print(srs['AUTHORITY', 1]) # The authority value + 4326 + >>> print(srs['TOWGS84', 4]) # the fourth value in this wkt + 0 + >>> print(srs['UNIT|AUTHORITY']) # For the units authority, have to use the pipe symbole. + EPSG + >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the units + 9122 + """ + if isinstance(target, tuple): + return self.attr_value(*target) + else: + return self.attr_value(target) + + def __str__(self): + "Use 'pretty' WKT." + return self.pretty_wkt + + # #### SpatialReference Methods #### + def attr_value(self, target, index=0): + """ + The attribute value for the given target node (e.g. 'PROJCS'). The index + keyword specifies an index of the child node to return. + """ + if not isinstance(target, str) or not isinstance(index, int): + raise TypeError + return capi.get_attr_value(self.ptr, force_bytes(target), index) + + def auth_name(self, target): + "Return the authority name for the given string target node." + return capi.get_auth_name(self.ptr, force_bytes(target)) + + def auth_code(self, target): + "Return the authority code for the given string target node." + return capi.get_auth_code(self.ptr, force_bytes(target)) + + def clone(self): + "Return a clone of this SpatialReference object." + return SpatialReference(capi.clone_srs(self.ptr)) + + def from_esri(self): + "Morph this SpatialReference from ESRI's format to EPSG." + capi.morph_from_esri(self.ptr) + + def identify_epsg(self): + """ + This method inspects the WKT of this SpatialReference, and will + add EPSG authority nodes where an EPSG identifier is applicable. + """ + capi.identify_epsg(self.ptr) + + def to_esri(self): + "Morph this SpatialReference to ESRI's format." + capi.morph_to_esri(self.ptr) + + def validate(self): + "Check to see if the given spatial reference is valid." + capi.srs_validate(self.ptr) + + # #### Name & SRID properties #### + @property + def name(self): + "Return the name of this Spatial Reference." + if self.projected: + return self.attr_value('PROJCS') + elif self.geographic: + return self.attr_value('GEOGCS') + elif self.local: + return self.attr_value('LOCAL_CS') + else: + return None + + @property + def srid(self): + "Return the SRID of top-level authority, or None if undefined." + try: + return int(self.attr_value('AUTHORITY', 1)) + except (TypeError, ValueError): + return None + + # #### Unit Properties #### + @property + def linear_name(self): + "Return the name of the linear units." + units, name = capi.linear_units(self.ptr, byref(c_char_p())) + return name + + @property + def linear_units(self): + "Return the value of the linear units." + units, name = capi.linear_units(self.ptr, byref(c_char_p())) + return units + + @property + def angular_name(self): + "Return the name of the angular units." + units, name = capi.angular_units(self.ptr, byref(c_char_p())) + return name + + @property + def angular_units(self): + "Return the value of the angular units." + units, name = capi.angular_units(self.ptr, byref(c_char_p())) + return units + + @property + def units(self): + """ + Return a 2-tuple of the units value and the units name. Automatically + determine whether to return the linear or angular units. + """ + units, name = None, None + if self.projected or self.local: + units, name = capi.linear_units(self.ptr, byref(c_char_p())) + elif self.geographic: + units, name = capi.angular_units(self.ptr, byref(c_char_p())) + if name is not None: + name = force_text(name) + return (units, name) + + # #### Spheroid/Ellipsoid Properties #### + @property + def ellipsoid(self): + """ + Return a tuple of the ellipsoid parameters: + (semimajor axis, semiminor axis, and inverse flattening) + """ + return (self.semi_major, self.semi_minor, self.inverse_flattening) + + @property + def semi_major(self): + "Return the Semi Major Axis for this Spatial Reference." + return capi.semi_major(self.ptr, byref(c_int())) + + @property + def semi_minor(self): + "Return the Semi Minor Axis for this Spatial Reference." + return capi.semi_minor(self.ptr, byref(c_int())) + + @property + def inverse_flattening(self): + "Return the Inverse Flattening for this Spatial Reference." + return capi.invflattening(self.ptr, byref(c_int())) + + # #### Boolean Properties #### + @property + def geographic(self): + """ + Return True if this SpatialReference is geographic + (root node is GEOGCS). + """ + return bool(capi.isgeographic(self.ptr)) + + @property + def local(self): + "Return True if this SpatialReference is local (root node is LOCAL_CS)." + return bool(capi.islocal(self.ptr)) + + @property + def projected(self): + """ + Return True if this SpatialReference is a projected coordinate system + (root node is PROJCS). + """ + return bool(capi.isprojected(self.ptr)) + + # #### Import Routines ##### + def import_epsg(self, epsg): + "Import the Spatial Reference from the EPSG code (an integer)." + capi.from_epsg(self.ptr, epsg) + + def import_proj(self, proj): + "Import the Spatial Reference from a PROJ.4 string." + capi.from_proj(self.ptr, proj) + + def import_user_input(self, user_input): + "Import the Spatial Reference from the given user input string." + capi.from_user_input(self.ptr, force_bytes(user_input)) + + def import_wkt(self, wkt): + "Import the Spatial Reference from OGC WKT (string)" + capi.from_wkt(self.ptr, byref(c_char_p(force_bytes(wkt)))) + + def import_xml(self, xml): + "Import the Spatial Reference from an XML string." + capi.from_xml(self.ptr, xml) + + # #### Export Properties #### + @property + def wkt(self): + "Return the WKT representation of this Spatial Reference." + return capi.to_wkt(self.ptr, byref(c_char_p())) + + @property + def pretty_wkt(self, simplify=0): + "Return the 'pretty' representation of the WKT." + return capi.to_pretty_wkt(self.ptr, byref(c_char_p()), simplify) + + @property + def proj(self): + "Return the PROJ.4 representation for this Spatial Reference." + return capi.to_proj(self.ptr, byref(c_char_p())) + + @property + def proj4(self): + "Alias for proj()." + return self.proj + + @property + def xml(self, dialect=''): + "Return the XML representation of this Spatial Reference." + return capi.to_xml(self.ptr, byref(c_char_p()), force_bytes(dialect)) + + +class CoordTransform(GDALBase): + "The coordinate system transformation object." + destructor = capi.destroy_ct + + def __init__(self, source, target): + "Initialize on a source and target SpatialReference objects." + if not isinstance(source, SpatialReference) or not isinstance(target, SpatialReference): + raise TypeError('source and target must be of type SpatialReference') + self.ptr = capi.new_ct(source._ptr, target._ptr) + self._srs1_name = source.name + self._srs2_name = target.name + + def __str__(self): + return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/__init__.py new file mode 100644 index 0000000..2d7d7a7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/__init__.py @@ -0,0 +1,23 @@ +""" +This module houses the GeoIP2 object, a wrapper for the MaxMind GeoIP2(R) +Python API (https://geoip2.readthedocs.io/). This is an alternative to the +Python GeoIP2 interface provided by MaxMind. + +GeoIP(R) is a registered trademark of MaxMind, Inc. + +For IP-based geolocation, this module requires the GeoLite2 Country and City +datasets, in binary format (CSV will not work!). The datasets may be +downloaded from MaxMind at http://dev.maxmind.com/geoip/geoip2/geolite2/. +Grab GeoLite2-Country.mmdb.gz and GeoLite2-City.mmdb.gz, and unzip them in the +directory corresponding to settings.GEOIP_PATH. +""" +__all__ = ['HAS_GEOIP2'] + +try: + import geoip2 # NOQA +except ImportError: + HAS_GEOIP2 = False +else: + from .base import GeoIP2, GeoIP2Exception + HAS_GEOIP2 = True + __all__ += ['GeoIP2', 'GeoIP2Exception'] diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/resources.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/resources.py new file mode 100644 index 0000000..3de3346 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geoip2/resources.py @@ -0,0 +1,21 @@ +def City(response): + return { + 'city': response.city.name, + 'continent_code': response.continent.code, + 'continent_name': response.continent.name, + 'country_code': response.country.iso_code, + 'country_name': response.country.name, + 'dma_code': response.location.metro_code, + 'latitude': response.location.latitude, + 'longitude': response.location.longitude, + 'postal_code': response.postal.code, + 'region': response.subdivisions[0].iso_code if response.subdivisions else None, + 'time_zone': response.location.time_zone, + } + + +def Country(response): + return { + 'country_code': response.country.iso_code, + 'country_name': response.country.name, + } diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/LICENSE b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/LICENSE new file mode 100644 index 0000000..0479b07 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2007-2009 Justin Bronn +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of GEOSGeometry nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/coordseq.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/coordseq.py new file mode 100644 index 0000000..6ea0fe9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/coordseq.py @@ -0,0 +1,196 @@ +""" + This module houses the GEOSCoordSeq object, which is used internally + by GEOSGeometry to house the actual coordinates of the Point, + LineString, and LinearRing geometries. +""" +from ctypes import byref, c_double, c_uint + +from django.contrib.gis.geos import prototypes as capi +from django.contrib.gis.geos.base import GEOSBase +from django.contrib.gis.geos.error import GEOSException +from django.contrib.gis.geos.libgeos import CS_PTR +from django.contrib.gis.shortcuts import numpy + + +class GEOSCoordSeq(GEOSBase): + "The internal representation of a list of coordinates inside a Geometry." + + ptr_type = CS_PTR + + def __init__(self, ptr, z=False): + "Initialize from a GEOS pointer." + if not isinstance(ptr, CS_PTR): + raise TypeError('Coordinate sequence should initialize with a CS_PTR.') + self._ptr = ptr + self._z = z + + def __iter__(self): + "Iterate over each point in the coordinate sequence." + for i in range(self.size): + yield self[i] + + def __len__(self): + "Return the number of points in the coordinate sequence." + return int(self.size) + + def __str__(self): + "Return the string representation of the coordinate sequence." + return str(self.tuple) + + def __getitem__(self, index): + "Return the coordinate sequence value at the given index." + self._checkindex(index) + return self._point_getter(index) + + def __setitem__(self, index, value): + "Set the coordinate sequence value at the given index." + # Checking the input value + if isinstance(value, (list, tuple)): + pass + elif numpy and isinstance(value, numpy.ndarray): + pass + else: + raise TypeError('Must set coordinate with a sequence (list, tuple, or numpy array).') + # Checking the dims of the input + if self.dims == 3 and self._z: + n_args = 3 + point_setter = self._set_point_3d + else: + n_args = 2 + point_setter = self._set_point_2d + if len(value) != n_args: + raise TypeError('Dimension of value does not match.') + self._checkindex(index) + point_setter(index, value) + + # #### Internal Routines #### + def _checkindex(self, index): + "Check the given index." + if not (0 <= index < self.size): + raise IndexError('invalid GEOS Geometry index: %s' % index) + + def _checkdim(self, dim): + "Check the given dimension." + if dim < 0 or dim > 2: + raise GEOSException('invalid ordinate dimension "%d"' % dim) + + def _get_x(self, index): + return capi.cs_getx(self.ptr, index, byref(c_double())) + + def _get_y(self, index): + return capi.cs_gety(self.ptr, index, byref(c_double())) + + def _get_z(self, index): + return capi.cs_getz(self.ptr, index, byref(c_double())) + + def _set_x(self, index, value): + capi.cs_setx(self.ptr, index, value) + + def _set_y(self, index, value): + capi.cs_sety(self.ptr, index, value) + + def _set_z(self, index, value): + capi.cs_setz(self.ptr, index, value) + + @property + def _point_getter(self): + return self._get_point_3d if self.dims == 3 and self._z else self._get_point_2d + + def _get_point_2d(self, index): + return (self._get_x(index), self._get_y(index)) + + def _get_point_3d(self, index): + return (self._get_x(index), self._get_y(index), self._get_z(index)) + + def _set_point_2d(self, index, value): + x, y = value + self._set_x(index, x) + self._set_y(index, y) + + def _set_point_3d(self, index, value): + x, y, z = value + self._set_x(index, x) + self._set_y(index, y) + self._set_z(index, z) + + # #### Ordinate getting and setting routines #### + def getOrdinate(self, dimension, index): + "Return the value for the given dimension and index." + self._checkindex(index) + self._checkdim(dimension) + return capi.cs_getordinate(self.ptr, index, dimension, byref(c_double())) + + def setOrdinate(self, dimension, index, value): + "Set the value for the given dimension and index." + self._checkindex(index) + self._checkdim(dimension) + capi.cs_setordinate(self.ptr, index, dimension, value) + + def getX(self, index): + "Get the X value at the index." + return self.getOrdinate(0, index) + + def setX(self, index, value): + "Set X with the value at the given index." + self.setOrdinate(0, index, value) + + def getY(self, index): + "Get the Y value at the given index." + return self.getOrdinate(1, index) + + def setY(self, index, value): + "Set Y with the value at the given index." + self.setOrdinate(1, index, value) + + def getZ(self, index): + "Get Z with the value at the given index." + return self.getOrdinate(2, index) + + def setZ(self, index, value): + "Set Z with the value at the given index." + self.setOrdinate(2, index, value) + + # ### Dimensions ### + @property + def size(self): + "Return the size of this coordinate sequence." + return capi.cs_getsize(self.ptr, byref(c_uint())) + + @property + def dims(self): + "Return the dimensions of this coordinate sequence." + return capi.cs_getdims(self.ptr, byref(c_uint())) + + @property + def hasz(self): + """ + Return whether this coordinate sequence is 3D. This property value is + inherited from the parent Geometry. + """ + return self._z + + # ### Other Methods ### + def clone(self): + "Clone this coordinate sequence." + return GEOSCoordSeq(capi.cs_clone(self.ptr), self.hasz) + + @property + def kml(self): + "Return the KML representation for the coordinates." + # Getting the substitution string depending on whether the coordinates have + # a Z dimension. + if self.hasz: + substr = '%s,%s,%s ' + else: + substr = '%s,%s,0 ' + return '%s' % \ + ''.join(substr % self[i] for i in range(len(self))).strip() + + @property + def tuple(self): + "Return a tuple version of this coordinate sequence." + n = self.size + get_point = self._point_getter + if n == 1: + return get_point(0) + return tuple(get_point(i) for i in range(n)) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/error.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/error.py new file mode 100644 index 0000000..af2ac2f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/error.py @@ -0,0 +1,3 @@ +class GEOSException(Exception): + "The base GEOS exception, indicates a GEOS-related error." + pass diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/geometry.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/geometry.py new file mode 100644 index 0000000..4b37799 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/geometry.py @@ -0,0 +1,738 @@ +""" + This module contains the 'base' GEOSGeometry object -- all GEOS Geometries + inherit from this object. +""" +import re +from ctypes import addressof, byref, c_double + +from django.contrib.gis import gdal +from django.contrib.gis.geometry import hex_regex, json_regex, wkt_regex +from django.contrib.gis.geos import prototypes as capi +from django.contrib.gis.geos.base import GEOSBase +from django.contrib.gis.geos.coordseq import GEOSCoordSeq +from django.contrib.gis.geos.error import GEOSException +from django.contrib.gis.geos.libgeos import GEOM_PTR +from django.contrib.gis.geos.mutable_list import ListMixin +from django.contrib.gis.geos.prepared import PreparedGeometry +from django.contrib.gis.geos.prototypes.io import ( + ewkb_w, wkb_r, wkb_w, wkt_r, wkt_w, +) +from django.utils.deconstruct import deconstructible +from django.utils.encoding import force_bytes, force_text + + +class GEOSGeometryBase(GEOSBase): + + _GEOS_CLASSES = None + + ptr_type = GEOM_PTR + destructor = capi.destroy_geom + has_cs = False # Only Point, LineString, LinearRing have coordinate sequences + + def __init__(self, ptr, cls): + self._ptr = ptr + + # Setting the class type (e.g., Point, Polygon, etc.) + if type(self) in (GEOSGeometryBase, GEOSGeometry): + if cls is None: + if GEOSGeometryBase._GEOS_CLASSES is None: + # Inner imports avoid import conflicts with GEOSGeometry. + from .linestring import LineString, LinearRing + from .point import Point + from .polygon import Polygon + from .collections import ( + GeometryCollection, MultiPoint, MultiLineString, MultiPolygon, + ) + GEOSGeometryBase._GEOS_CLASSES = { + 0: Point, + 1: LineString, + 2: LinearRing, + 3: Polygon, + 4: MultiPoint, + 5: MultiLineString, + 6: MultiPolygon, + 7: GeometryCollection, + } + cls = GEOSGeometryBase._GEOS_CLASSES[self.geom_typeid] + self.__class__ = cls + self._post_init() + + def _post_init(self): + "Perform post-initialization setup." + # Setting the coordinate sequence for the geometry (will be None on + # geometries that do not have coordinate sequences) + self._cs = GEOSCoordSeq(capi.get_cs(self.ptr), self.hasz) if self.has_cs else None + + def __copy__(self): + """ + Return a clone because the copy of a GEOSGeometry may contain an + invalid pointer location if the original is garbage collected. + """ + return self.clone() + + def __deepcopy__(self, memodict): + """ + The `deepcopy` routine is used by the `Node` class of django.utils.tree; + thus, the protocol routine needs to be implemented to return correct + copies (clones) of these GEOS objects, which use C pointers. + """ + return self.clone() + + def __str__(self): + "EWKT is used for the string representation." + return self.ewkt + + def __repr__(self): + "Short-hand representation because WKT may be very large." + return '<%s object at %s>' % (self.geom_type, hex(addressof(self.ptr))) + + # Pickling support + def _to_pickle_wkb(self): + return bytes(self.wkb) + + def _from_pickle_wkb(self, wkb): + return wkb_r().read(memoryview(wkb)) + + def __getstate__(self): + # The pickled state is simply a tuple of the WKB (in string form) + # and the SRID. + return self._to_pickle_wkb(), self.srid + + def __setstate__(self, state): + # Instantiating from the tuple state that was pickled. + wkb, srid = state + ptr = self._from_pickle_wkb(wkb) + if not ptr: + raise GEOSException('Invalid Geometry loaded from pickled state.') + self.ptr = ptr + self._post_init() + self.srid = srid + + @classmethod + def _from_wkb(cls, wkb): + return wkb_r().read(wkb) + + @staticmethod + def from_ewkt(ewkt): + ewkt = force_bytes(ewkt) + srid = None + parts = ewkt.split(b';', 1) + if len(parts) == 2: + srid_part, wkt = parts + match = re.match(br'SRID=(?P\-?\d+)', srid_part) + if not match: + raise ValueError('EWKT has invalid SRID part.') + srid = int(match.group('srid')) + else: + wkt = ewkt + if not wkt: + raise ValueError('Expected WKT but got an empty string.') + return GEOSGeometry(GEOSGeometry._from_wkt(wkt), srid=srid) + + @staticmethod + def _from_wkt(wkt): + return wkt_r().read(wkt) + + @classmethod + def from_gml(cls, gml_string): + return gdal.OGRGeometry.from_gml(gml_string).geos + + # Comparison operators + def __eq__(self, other): + """ + Equivalence testing, a Geometry may be compared with another Geometry + or an EWKT representation. + """ + if isinstance(other, str): + try: + other = GEOSGeometry.from_ewkt(other) + except (ValueError, GEOSException): + return False + return isinstance(other, GEOSGeometry) and self.srid == other.srid and self.equals_exact(other) + + def __hash__(self): + return hash((self.srid, self.wkt)) + + # ### Geometry set-like operations ### + # Thanks to Sean Gillies for inspiration: + # http://lists.gispython.org/pipermail/community/2007-July/001034.html + # g = g1 | g2 + def __or__(self, other): + "Return the union of this Geometry and the other." + return self.union(other) + + # g = g1 & g2 + def __and__(self, other): + "Return the intersection of this Geometry and the other." + return self.intersection(other) + + # g = g1 - g2 + def __sub__(self, other): + "Return the difference this Geometry and the other." + return self.difference(other) + + # g = g1 ^ g2 + def __xor__(self, other): + "Return the symmetric difference of this Geometry and the other." + return self.sym_difference(other) + + # #### Coordinate Sequence Routines #### + @property + def coord_seq(self): + "Return a clone of the coordinate sequence for this Geometry." + if self.has_cs: + return self._cs.clone() + + # #### Geometry Info #### + @property + def geom_type(self): + "Return a string representing the Geometry type, e.g. 'Polygon'" + return capi.geos_type(self.ptr).decode() + + @property + def geom_typeid(self): + "Return an integer representing the Geometry type." + return capi.geos_typeid(self.ptr) + + @property + def num_geom(self): + "Return the number of geometries in the Geometry." + return capi.get_num_geoms(self.ptr) + + @property + def num_coords(self): + "Return the number of coordinates in the Geometry." + return capi.get_num_coords(self.ptr) + + @property + def num_points(self): + "Return the number points, or coordinates, in the Geometry." + return self.num_coords + + @property + def dims(self): + "Return the dimension of this Geometry (0=point, 1=line, 2=surface)." + return capi.get_dims(self.ptr) + + def normalize(self): + "Convert this Geometry to normal form (or canonical form)." + capi.geos_normalize(self.ptr) + + # #### Unary predicates #### + @property + def empty(self): + """ + Return a boolean indicating whether the set of points in this Geometry + are empty. + """ + return capi.geos_isempty(self.ptr) + + @property + def hasz(self): + "Return whether the geometry has a 3D dimension." + return capi.geos_hasz(self.ptr) + + @property + def ring(self): + "Return whether or not the geometry is a ring." + return capi.geos_isring(self.ptr) + + @property + def simple(self): + "Return false if the Geometry isn't simple." + return capi.geos_issimple(self.ptr) + + @property + def valid(self): + "Test the validity of this Geometry." + return capi.geos_isvalid(self.ptr) + + @property + def valid_reason(self): + """ + Return a string containing the reason for any invalidity. + """ + return capi.geos_isvalidreason(self.ptr).decode() + + # #### Binary predicates. #### + def contains(self, other): + "Return true if other.within(this) returns true." + return capi.geos_contains(self.ptr, other.ptr) + + def covers(self, other): + """ + Return True if the DE-9IM Intersection Matrix for the two geometries is + T*****FF*, *T****FF*, ***T**FF*, or ****T*FF*. If either geometry is + empty, return False. + """ + return capi.geos_covers(self.ptr, other.ptr) + + def crosses(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is T*T****** (for a point and a curve,a point and an area or a line and + an area) 0******** (for two curves). + """ + return capi.geos_crosses(self.ptr, other.ptr) + + def disjoint(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is FF*FF****. + """ + return capi.geos_disjoint(self.ptr, other.ptr) + + def equals(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is T*F**FFF*. + """ + return capi.geos_equals(self.ptr, other.ptr) + + def equals_exact(self, other, tolerance=0): + """ + Return true if the two Geometries are exactly equal, up to a + specified tolerance. + """ + return capi.geos_equalsexact(self.ptr, other.ptr, float(tolerance)) + + def intersects(self, other): + "Return true if disjoint return false." + return capi.geos_intersects(self.ptr, other.ptr) + + def overlaps(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is T*T***T** (for two points or two surfaces) 1*T***T** (for two curves). + """ + return capi.geos_overlaps(self.ptr, other.ptr) + + def relate_pattern(self, other, pattern): + """ + Return true if the elements in the DE-9IM intersection matrix for the + two Geometries match the elements in pattern. + """ + if not isinstance(pattern, str) or len(pattern) > 9: + raise GEOSException('invalid intersection matrix pattern') + return capi.geos_relatepattern(self.ptr, other.ptr, force_bytes(pattern)) + + def touches(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is FT*******, F**T***** or F***T****. + """ + return capi.geos_touches(self.ptr, other.ptr) + + def within(self, other): + """ + Return true if the DE-9IM intersection matrix for the two Geometries + is T*F**F***. + """ + return capi.geos_within(self.ptr, other.ptr) + + # #### SRID Routines #### + @property + def srid(self): + "Get the SRID for the geometry. Return None if no SRID is set." + s = capi.geos_get_srid(self.ptr) + if s == 0: + return None + else: + return s + + @srid.setter + def srid(self, srid): + "Set the SRID for the geometry." + capi.geos_set_srid(self.ptr, 0 if srid is None else srid) + + # #### Output Routines #### + @property + def ewkt(self): + """ + Return the EWKT (SRID + WKT) of the Geometry. + """ + srid = self.srid + return 'SRID=%s;%s' % (srid, self.wkt) if srid else self.wkt + + @property + def wkt(self): + "Return the WKT (Well-Known Text) representation of this Geometry." + return wkt_w(dim=3 if self.hasz else 2, trim=True).write(self).decode() + + @property + def hex(self): + """ + Return the WKB of this Geometry in hexadecimal form. Please note + that the SRID is not included in this representation because it is not + a part of the OGC specification (use the `hexewkb` property instead). + """ + # A possible faster, all-python, implementation: + # str(self.wkb).encode('hex') + return wkb_w(dim=3 if self.hasz else 2).write_hex(self) + + @property + def hexewkb(self): + """ + Return the EWKB of this Geometry in hexadecimal form. This is an + extension of the WKB specification that includes SRID value that are + a part of this geometry. + """ + return ewkb_w(dim=3 if self.hasz else 2).write_hex(self) + + @property + def json(self): + """ + Return GeoJSON representation of this Geometry. + """ + return self.ogr.json + geojson = json + + @property + def wkb(self): + """ + Return the WKB (Well-Known Binary) representation of this Geometry + as a Python buffer. SRID and Z values are not included, use the + `ewkb` property instead. + """ + return wkb_w(3 if self.hasz else 2).write(self) + + @property + def ewkb(self): + """ + Return the EWKB representation of this Geometry as a Python buffer. + This is an extension of the WKB specification that includes any SRID + value that are a part of this geometry. + """ + return ewkb_w(3 if self.hasz else 2).write(self) + + @property + def kml(self): + "Return the KML representation of this Geometry." + gtype = self.geom_type + return '<%s>%s' % (gtype, self.coord_seq.kml, gtype) + + @property + def prepared(self): + """ + Return a PreparedGeometry corresponding to this geometry -- it is + optimized for the contains, intersects, and covers operations. + """ + return PreparedGeometry(self) + + # #### GDAL-specific output routines #### + def _ogr_ptr(self): + return gdal.OGRGeometry._from_wkb(self.wkb) + + @property + def ogr(self): + "Return the OGR Geometry for this Geometry." + return gdal.OGRGeometry(self._ogr_ptr(), self.srs) + + @property + def srs(self): + "Return the OSR SpatialReference for SRID of this Geometry." + if self.srid: + try: + return gdal.SpatialReference(self.srid) + except gdal.SRSException: + pass + return None + + @property + def crs(self): + "Alias for `srs` property." + return self.srs + + def transform(self, ct, clone=False): + """ + Requires GDAL. Transform the geometry according to the given + transformation object, which may be an integer SRID, and WKT or + PROJ.4 string. By default, transform the geometry in-place and return + nothing. However if the `clone` keyword is set, don't modify the + geometry and return a transformed clone instead. + """ + srid = self.srid + + if ct == srid: + # short-circuit where source & dest SRIDs match + if clone: + return self.clone() + else: + return + + if isinstance(ct, gdal.CoordTransform): + # We don't care about SRID because CoordTransform presupposes + # source SRS. + srid = None + elif srid is None or srid < 0: + raise GEOSException("Calling transform() with no SRID set is not supported") + + # Creating an OGR Geometry, which is then transformed. + g = gdal.OGRGeometry(self._ogr_ptr(), srid) + g.transform(ct) + # Getting a new GEOS pointer + ptr = g._geos_ptr() + if clone: + # User wants a cloned transformed geometry returned. + return GEOSGeometry(ptr, srid=g.srid) + if ptr: + # Reassigning pointer, and performing post-initialization setup + # again due to the reassignment. + capi.destroy_geom(self.ptr) + self.ptr = ptr + self._post_init() + self.srid = g.srid + else: + raise GEOSException('Transformed WKB was invalid.') + + # #### Topology Routines #### + def _topology(self, gptr): + "Return Geometry from the given pointer." + return GEOSGeometry(gptr, srid=self.srid) + + @property + def boundary(self): + "Return the boundary as a newly allocated Geometry object." + return self._topology(capi.geos_boundary(self.ptr)) + + def buffer(self, width, quadsegs=8): + """ + Return a geometry that represents all points whose distance from this + Geometry is less than or equal to distance. Calculations are in the + Spatial Reference System of this Geometry. The optional third parameter sets + the number of segment used to approximate a quarter circle (defaults to 8). + (Text from PostGIS documentation at ch. 6.1.3) + """ + return self._topology(capi.geos_buffer(self.ptr, width, quadsegs)) + + def buffer_with_style(self, width, quadsegs=8, end_cap_style=1, join_style=1, mitre_limit=5.0): + """ + Same as buffer() but allows customizing the style of the buffer. + + End cap style can be round (1), flat (2), or square (3). + Join style can be round (1), mitre (2), or bevel (3). + Mitre ratio limit only affects mitered join style. + """ + return self._topology( + capi.geos_bufferwithstyle(self.ptr, width, quadsegs, end_cap_style, join_style, mitre_limit), + ) + + @property + def centroid(self): + """ + The centroid is equal to the centroid of the set of component Geometries + of highest dimension (since the lower-dimension geometries contribute zero + "weight" to the centroid). + """ + return self._topology(capi.geos_centroid(self.ptr)) + + @property + def convex_hull(self): + """ + Return the smallest convex Polygon that contains all the points + in the Geometry. + """ + return self._topology(capi.geos_convexhull(self.ptr)) + + def difference(self, other): + """ + Return a Geometry representing the points making up this Geometry + that do not make up other. + """ + return self._topology(capi.geos_difference(self.ptr, other.ptr)) + + @property + def envelope(self): + "Return the envelope for this geometry (a polygon)." + return self._topology(capi.geos_envelope(self.ptr)) + + def intersection(self, other): + "Return a Geometry representing the points shared by this Geometry and other." + return self._topology(capi.geos_intersection(self.ptr, other.ptr)) + + @property + def point_on_surface(self): + "Compute an interior point of this Geometry." + return self._topology(capi.geos_pointonsurface(self.ptr)) + + def relate(self, other): + "Return the DE-9IM intersection matrix for this Geometry and the other." + return capi.geos_relate(self.ptr, other.ptr).decode() + + def simplify(self, tolerance=0.0, preserve_topology=False): + """ + Return the Geometry, simplified using the Douglas-Peucker algorithm + to the specified tolerance (higher tolerance => less points). If no + tolerance provided, defaults to 0. + + By default, don't preserve topology - e.g. polygons can be split, + collapse to lines or disappear holes can be created or disappear, and + lines can cross. By specifying preserve_topology=True, the result will + have the same dimension and number of components as the input. This is + significantly slower. + """ + if preserve_topology: + return self._topology(capi.geos_preservesimplify(self.ptr, tolerance)) + else: + return self._topology(capi.geos_simplify(self.ptr, tolerance)) + + def sym_difference(self, other): + """ + Return a set combining the points in this Geometry not in other, + and the points in other not in this Geometry. + """ + return self._topology(capi.geos_symdifference(self.ptr, other.ptr)) + + @property + def unary_union(self): + "Return the union of all the elements of this geometry." + return self._topology(capi.geos_unary_union(self.ptr)) + + def union(self, other): + "Return a Geometry representing all the points in this Geometry and other." + return self._topology(capi.geos_union(self.ptr, other.ptr)) + + # #### Other Routines #### + @property + def area(self): + "Return the area of the Geometry." + return capi.geos_area(self.ptr, byref(c_double())) + + def distance(self, other): + """ + Return the distance between the closest points on this Geometry + and the other. Units will be in those of the coordinate system of + the Geometry. + """ + if not isinstance(other, GEOSGeometry): + raise TypeError('distance() works only on other GEOS Geometries.') + return capi.geos_distance(self.ptr, other.ptr, byref(c_double())) + + @property + def extent(self): + """ + Return the extent of this geometry as a 4-tuple, consisting of + (xmin, ymin, xmax, ymax). + """ + from .point import Point + env = self.envelope + if isinstance(env, Point): + xmin, ymin = env.tuple + xmax, ymax = xmin, ymin + else: + xmin, ymin = env[0][0] + xmax, ymax = env[0][2] + return (xmin, ymin, xmax, ymax) + + @property + def length(self): + """ + Return the length of this Geometry (e.g., 0 for point, or the + circumference of a Polygon). + """ + return capi.geos_length(self.ptr, byref(c_double())) + + def clone(self): + "Clone this Geometry." + return GEOSGeometry(capi.geom_clone(self.ptr)) + + +class LinearGeometryMixin: + """ + Used for LineString and MultiLineString. + """ + def interpolate(self, distance): + return self._topology(capi.geos_interpolate(self.ptr, distance)) + + def interpolate_normalized(self, distance): + return self._topology(capi.geos_interpolate_normalized(self.ptr, distance)) + + def project(self, point): + from .point import Point + if not isinstance(point, Point): + raise TypeError('locate_point argument must be a Point') + return capi.geos_project(self.ptr, point.ptr) + + def project_normalized(self, point): + from .point import Point + if not isinstance(point, Point): + raise TypeError('locate_point argument must be a Point') + return capi.geos_project_normalized(self.ptr, point.ptr) + + @property + def merged(self): + """ + Return the line merge of this Geometry. + """ + return self._topology(capi.geos_linemerge(self.ptr)) + + @property + def closed(self): + """ + Return whether or not this Geometry is closed. + """ + return capi.geos_isclosed(self.ptr) + + +@deconstructible +class GEOSGeometry(GEOSGeometryBase, ListMixin): + "A class that, generally, encapsulates a GEOS geometry." + + def __init__(self, geo_input, srid=None): + """ + The base constructor for GEOS geometry objects. It may take the + following inputs: + + * strings: + - WKT + - HEXEWKB (a PostGIS-specific canonical form) + - GeoJSON (requires GDAL) + * buffer: + - WKB + + The `srid` keyword specifies the Source Reference Identifier (SRID) + number for this Geometry. If not provided, it defaults to None. + """ + input_srid = None + if isinstance(geo_input, bytes): + geo_input = force_text(geo_input) + if isinstance(geo_input, str): + wkt_m = wkt_regex.match(geo_input) + if wkt_m: + # Handle WKT input. + if wkt_m.group('srid'): + input_srid = int(wkt_m.group('srid')) + g = self._from_wkt(force_bytes(wkt_m.group('wkt'))) + elif hex_regex.match(geo_input): + # Handle HEXEWKB input. + g = wkb_r().read(force_bytes(geo_input)) + elif json_regex.match(geo_input): + # Handle GeoJSON input. + ogr = gdal.OGRGeometry.from_json(geo_input) + g = ogr._geos_ptr() + input_srid = ogr.srid + else: + raise ValueError('String input unrecognized as WKT EWKT, and HEXEWKB.') + elif isinstance(geo_input, GEOM_PTR): + # When the input is a pointer to a geometry (GEOM_PTR). + g = geo_input + elif isinstance(geo_input, memoryview): + # When the input is a buffer (WKB). + g = wkb_r().read(geo_input) + elif isinstance(geo_input, GEOSGeometry): + g = capi.geom_clone(geo_input.ptr) + else: + raise TypeError('Improper geometry input type: %s' % type(geo_input)) + + if not g: + raise GEOSException('Could not initialize GEOS Geometry with given input.') + + input_srid = input_srid or capi.geos_get_srid(g) or None + if input_srid and srid and input_srid != srid: + raise ValueError('Input geometry already has SRID: %d.' % input_srid) + + super().__init__(g, None) + # Set the SRID, if given. + srid = input_srid or srid + if srid and isinstance(srid, int): + self.srid = srid diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/libgeos.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/libgeos.py new file mode 100644 index 0000000..40f3cae --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/libgeos.py @@ -0,0 +1,175 @@ +""" + This module houses the ctypes initialization procedures, as well + as the notice and error handler function callbacks (get called + when an error occurs in GEOS). + + This module also houses GEOS Pointer utilities, including + get_pointer_arr(), and GEOM_PTR. +""" +import logging +import os +from ctypes import CDLL, CFUNCTYPE, POINTER, Structure, c_char_p +from ctypes.util import find_library + +from django.core.exceptions import ImproperlyConfigured +from django.utils.functional import SimpleLazyObject, cached_property +from django.utils.version import get_version_tuple + +logger = logging.getLogger('django.contrib.gis') + + +def load_geos(): + # Custom library path set? + try: + from django.conf import settings + lib_path = settings.GEOS_LIBRARY_PATH + except (AttributeError, EnvironmentError, + ImportError, ImproperlyConfigured): + lib_path = None + + # Setting the appropriate names for the GEOS-C library. + if lib_path: + lib_names = None + elif os.name == 'nt': + # Windows NT libraries + lib_names = ['geos_c', 'libgeos_c-1'] + elif os.name == 'posix': + # *NIX libraries + lib_names = ['geos_c', 'GEOS'] + else: + raise ImportError('Unsupported OS "%s"' % os.name) + + # Using the ctypes `find_library` utility to find the path to the GEOS + # shared library. This is better than manually specifying each library name + # and extension (e.g., libgeos_c.[so|so.1|dylib].). + if lib_names: + for lib_name in lib_names: + lib_path = find_library(lib_name) + if lib_path is not None: + break + + # No GEOS library could be found. + if lib_path is None: + raise ImportError( + 'Could not find the GEOS library (tried "%s"). ' + 'Try setting GEOS_LIBRARY_PATH in your settings.' % + '", "'.join(lib_names) + ) + # Getting the GEOS C library. The C interface (CDLL) is used for + # both *NIX and Windows. + # See the GEOS C API source code for more details on the library function calls: + # http://geos.refractions.net/ro/doxygen_docs/html/geos__c_8h-source.html + _lgeos = CDLL(lib_path) + # Here we set up the prototypes for the initGEOS_r and finishGEOS_r + # routines. These functions aren't actually called until they are + # attached to a GEOS context handle -- this actually occurs in + # geos/prototypes/threadsafe.py. + _lgeos.initGEOS_r.restype = CONTEXT_PTR + _lgeos.finishGEOS_r.argtypes = [CONTEXT_PTR] + # Set restype for compatibility across 32 and 64-bit platforms. + _lgeos.GEOSversion.restype = c_char_p + return _lgeos + + +# The notice and error handler C function callback definitions. +# Supposed to mimic the GEOS message handler (C below): +# typedef void (*GEOSMessageHandler)(const char *fmt, ...); +NOTICEFUNC = CFUNCTYPE(None, c_char_p, c_char_p) + + +def notice_h(fmt, lst): + fmt, lst = fmt.decode(), lst.decode() + try: + warn_msg = fmt % lst + except TypeError: + warn_msg = fmt + logger.warning('GEOS_NOTICE: %s\n', warn_msg) + + +notice_h = NOTICEFUNC(notice_h) + +ERRORFUNC = CFUNCTYPE(None, c_char_p, c_char_p) + + +def error_h(fmt, lst): + fmt, lst = fmt.decode(), lst.decode() + try: + err_msg = fmt % lst + except TypeError: + err_msg = fmt + logger.error('GEOS_ERROR: %s\n', err_msg) + + +error_h = ERRORFUNC(error_h) + +# #### GEOS Geometry C data structures, and utility functions. #### + + +# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR +class GEOSGeom_t(Structure): + pass + + +class GEOSPrepGeom_t(Structure): + pass + + +class GEOSCoordSeq_t(Structure): + pass + + +class GEOSContextHandle_t(Structure): + pass + + +# Pointers to opaque GEOS geometry structures. +GEOM_PTR = POINTER(GEOSGeom_t) +PREPGEOM_PTR = POINTER(GEOSPrepGeom_t) +CS_PTR = POINTER(GEOSCoordSeq_t) +CONTEXT_PTR = POINTER(GEOSContextHandle_t) + + +lgeos = SimpleLazyObject(load_geos) + + +class GEOSFuncFactory: + """ + Lazy loading of GEOS functions. + """ + argtypes = None + restype = None + errcheck = None + + def __init__(self, func_name, *args, restype=None, errcheck=None, argtypes=None, **kwargs): + self.func_name = func_name + if restype is not None: + self.restype = restype + if errcheck is not None: + self.errcheck = errcheck + if argtypes is not None: + self.argtypes = argtypes + self.args = args + self.kwargs = kwargs + + def __call__(self, *args, **kwargs): + return self.func(*args, **kwargs) + + @cached_property + def func(self): + from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc + func = GEOSFunc(self.func_name) + func.argtypes = self.argtypes or [] + func.restype = self.restype + if self.errcheck: + func.errcheck = self.errcheck + return func + + +def geos_version(): + """Return the string version of the GEOS library.""" + return lgeos.GEOSversion() + + +def geos_version_tuple(): + """Return the GEOS version as a tuple (major, minor, subminor).""" + return get_version_tuple(geos_version().decode()) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prepared.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prepared.py new file mode 100644 index 0000000..789432f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prepared.py @@ -0,0 +1,49 @@ +from .base import GEOSBase +from .prototypes import prepared as capi + + +class PreparedGeometry(GEOSBase): + """ + A geometry that is prepared for performing certain operations. + At the moment this includes the contains covers, and intersects + operations. + """ + ptr_type = capi.PREPGEOM_PTR + destructor = capi.prepared_destroy + + def __init__(self, geom): + # Keeping a reference to the original geometry object to prevent it + # from being garbage collected which could then crash the prepared one + # See #21662 + self._base_geom = geom + from .geometry import GEOSGeometry + if not isinstance(geom, GEOSGeometry): + raise TypeError + self.ptr = capi.geos_prepare(geom.ptr) + + def contains(self, other): + return capi.prepared_contains(self.ptr, other.ptr) + + def contains_properly(self, other): + return capi.prepared_contains_properly(self.ptr, other.ptr) + + def covers(self, other): + return capi.prepared_covers(self.ptr, other.ptr) + + def intersects(self, other): + return capi.prepared_intersects(self.ptr, other.ptr) + + def crosses(self, other): + return capi.prepared_crosses(self.ptr, other.ptr) + + def disjoint(self, other): + return capi.prepared_disjoint(self.ptr, other.ptr) + + def overlaps(self, other): + return capi.prepared_overlaps(self.ptr, other.ptr) + + def touches(self, other): + return capi.prepared_touches(self.ptr, other.ptr) + + def within(self, other): + return capi.prepared_within(self.ptr, other.ptr) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/coordseq.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/coordseq.py new file mode 100644 index 0000000..d1a5ed6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/coordseq.py @@ -0,0 +1,91 @@ +from ctypes import POINTER, c_double, c_int, c_uint + +from django.contrib.gis.geos.libgeos import CS_PTR, GEOM_PTR, GEOSFuncFactory +from django.contrib.gis.geos.prototypes.errcheck import ( + GEOSException, last_arg_byref, +) + + +# ## Error-checking routines specific to coordinate sequences. ## +def check_cs_op(result, func, cargs): + "Check the status code of a coordinate sequence operation." + if result == 0: + raise GEOSException('Could not set value on coordinate sequence') + else: + return result + + +def check_cs_get(result, func, cargs): + "Check the coordinate sequence retrieval." + check_cs_op(result, func, cargs) + # Object in by reference, return its value. + return last_arg_byref(cargs) + + +# ## Coordinate sequence prototype factory classes. ## +class CsInt(GEOSFuncFactory): + "For coordinate sequence routines that return an integer." + argtypes = [CS_PTR, POINTER(c_uint)] + restype = c_int + errcheck = staticmethod(check_cs_get) + + +class CsOperation(GEOSFuncFactory): + "For coordinate sequence operations." + restype = c_int + + def __init__(self, *args, ordinate=False, get=False, **kwargs): + if get: + # Get routines have double parameter passed-in by reference. + errcheck = check_cs_get + dbl_param = POINTER(c_double) + else: + errcheck = check_cs_op + dbl_param = c_double + + if ordinate: + # Get/Set ordinate routines have an extra uint parameter. + argtypes = [CS_PTR, c_uint, c_uint, dbl_param] + else: + argtypes = [CS_PTR, c_uint, dbl_param] + + super().__init__(*args, **{**kwargs, 'errcheck': errcheck, 'argtypes': argtypes}) + + +class CsOutput(GEOSFuncFactory): + restype = CS_PTR + + @staticmethod + def errcheck(result, func, cargs): + if not result: + raise GEOSException( + 'Error encountered checking Coordinate Sequence returned from GEOS ' + 'C function "%s".' % func.__name__ + ) + return result + + +# ## Coordinate Sequence ctypes prototypes ## + +# Coordinate Sequence constructors & cloning. +cs_clone = CsOutput('GEOSCoordSeq_clone', argtypes=[CS_PTR]) +create_cs = CsOutput('GEOSCoordSeq_create', argtypes=[c_uint, c_uint]) +get_cs = CsOutput('GEOSGeom_getCoordSeq', argtypes=[GEOM_PTR]) + +# Getting, setting ordinate +cs_getordinate = CsOperation('GEOSCoordSeq_getOrdinate', ordinate=True, get=True) +cs_setordinate = CsOperation('GEOSCoordSeq_setOrdinate', ordinate=True) + +# For getting, x, y, z +cs_getx = CsOperation('GEOSCoordSeq_getX', get=True) +cs_gety = CsOperation('GEOSCoordSeq_getY', get=True) +cs_getz = CsOperation('GEOSCoordSeq_getZ', get=True) + +# For setting, x, y, z +cs_setx = CsOperation('GEOSCoordSeq_setX') +cs_sety = CsOperation('GEOSCoordSeq_setY') +cs_setz = CsOperation('GEOSCoordSeq_setZ') + +# These routines return size & dimensions. +cs_getsize = CsInt('GEOSCoordSeq_getSize') +cs_getdims = CsInt('GEOSCoordSeq_getDimensions') diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/topology.py b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/topology.py new file mode 100644 index 0000000..9ca0dce --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/geos/prototypes/topology.py @@ -0,0 +1,53 @@ +""" + This module houses the GEOS ctypes prototype functions for the + topological operations on geometries. +""" +from ctypes import c_double, c_int + +from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory +from django.contrib.gis.geos.prototypes.errcheck import ( + check_geom, check_minus_one, check_string, +) +from django.contrib.gis.geos.prototypes.geom import geos_char_p + + +class Topology(GEOSFuncFactory): + "For GEOS unary topology functions." + argtypes = [GEOM_PTR] + restype = GEOM_PTR + errcheck = staticmethod(check_geom) + + +# Topology Routines +geos_boundary = Topology('GEOSBoundary') +geos_buffer = Topology('GEOSBuffer', argtypes=[GEOM_PTR, c_double, c_int]) +geos_bufferwithstyle = Topology('GEOSBufferWithStyle', argtypes=[GEOM_PTR, c_double, c_int, c_int, c_int, c_double]) +geos_centroid = Topology('GEOSGetCentroid') +geos_convexhull = Topology('GEOSConvexHull') +geos_difference = Topology('GEOSDifference', argtypes=[GEOM_PTR, GEOM_PTR]) +geos_envelope = Topology('GEOSEnvelope') +geos_intersection = Topology('GEOSIntersection', argtypes=[GEOM_PTR, GEOM_PTR]) +geos_linemerge = Topology('GEOSLineMerge') +geos_pointonsurface = Topology('GEOSPointOnSurface') +geos_preservesimplify = Topology('GEOSTopologyPreserveSimplify', argtypes=[GEOM_PTR, c_double]) +geos_simplify = Topology('GEOSSimplify', argtypes=[GEOM_PTR, c_double]) +geos_symdifference = Topology('GEOSSymDifference', argtypes=[GEOM_PTR, GEOM_PTR]) +geos_union = Topology('GEOSUnion', argtypes=[GEOM_PTR, GEOM_PTR]) + +geos_unary_union = GEOSFuncFactory('GEOSUnaryUnion', argtypes=[GEOM_PTR], restype=GEOM_PTR) + +# GEOSRelate returns a string, not a geometry. +geos_relate = GEOSFuncFactory( + 'GEOSRelate', argtypes=[GEOM_PTR, GEOM_PTR], restype=geos_char_p, errcheck=check_string +) + +# Linear referencing routines +geos_project = GEOSFuncFactory( + 'GEOSProject', argtypes=[GEOM_PTR, GEOM_PTR], restype=c_double, errcheck=check_minus_one +) +geos_interpolate = Topology('GEOSInterpolate', argtypes=[GEOM_PTR, c_double]) + +geos_project_normalized = GEOSFuncFactory( + 'GEOSProjectNormalized', argtypes=[GEOM_PTR, GEOM_PTR], restype=c_double, errcheck=check_minus_one +) +geos_interpolate_normalized = Topology('GEOSInterpolateNormalized', argtypes=[GEOM_PTR, c_double]) diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b981361 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..51900e2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bashar Al-Abdulhadi, 2015-2016 +# Bashar Al-Abdulhadi, 2014 +# Eyad Toma , 2013 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgid "GIS" +msgstr "نظم المعلومات الجغرافية GIS" + +msgid "The base GIS field." +msgstr "حقل نظم المعلومات الجغرافية الرئيسي" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"قاعدة الحقل الهندسي ترتكز لمواصفات نوع OpenGIS (نظم المعلومات الجغرافية " +"المفتوحة) الهندسية." + +msgid "Point" +msgstr "نقطة إحداثية" + +msgid "Line string" +msgstr "سطر تسلسل أحرف" + +msgid "Polygon" +msgstr "مُضلّع إحداثي" + +msgid "Multi-point" +msgstr "نقاط إحداثية" + +msgid "Multi-line string" +msgstr "تسلسل أحرف متعدد الأسطر" + +msgid "Multi polygon" +msgstr "مجموعة مُضلعات إحداثية" + +msgid "Geometry collection" +msgstr "مجموعة إحداثية" + +msgid "Extent Aggregate Field" +msgstr "حقل مجموع التحصيل" + +msgid "Raster Field" +msgstr "حقل خطوط المسح التسامتي" + +msgid "No geometry value provided." +msgstr "لم تُدخل أي أحداثيات." + +msgid "Invalid geometry value." +msgstr "الإحداثيات غير صحيحة." + +msgid "Invalid geometry type." +msgstr "نوع الإحداثيات غير صحيح." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "حدث خطأ أثناء تحويل geometry إلى حقل SRID." + +msgid "Delete all Features" +msgstr "حذف جميع المميزات" + +msgid "WKT debugging window:" +msgstr "نافذة تدقيق WKT:" + +msgid "Debugging window (serialized value)" +msgstr "نافذة التدقيق (قيمة تسلسلية)" + +msgid "No feeds are registered." +msgstr "لا موجز مسجّل" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r غير مسجّل" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4a347ba Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ast/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..614a6ec --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Georgi Kostadinov , 2012 +# Todor Lubenov , 2016 +# Todor Lubenov , 2011,2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Базово ГИС поле." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Основното ГИС поле - карти за спецификация от OpenGIS геометричен тип." + +msgid "Point" +msgstr "Точка" + +msgid "Line string" +msgstr "Линеен елемент" + +msgid "Polygon" +msgstr "Полигон" + +msgid "Multi-point" +msgstr "Комплексна-точка" + +msgid "Multi-line string" +msgstr "Комплексен-линеен елемент" + +msgid "Multi polygon" +msgstr "Комплексен полигон" + +msgid "Geometry collection" +msgstr "Геометрична колекция" + +msgid "Extent Aggregate Field" +msgstr "Разшири Полето за обединяване" + +msgid "Raster Field" +msgstr "Растерно Поле" + +msgid "No geometry value provided." +msgstr "Няма предоставена геометрична стойност." + +msgid "Invalid geometry value." +msgstr "Невалидна геометрична стойност." + +msgid "Invalid geometry type." +msgstr "Невалиден геометричен тип." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Възникна грешка при трансформиране на геометрията на SRID от полето " +"геометрия." + +msgid "Delete all Features" +msgstr "Изтрий всички обекти" + +msgid "WKT debugging window:" +msgstr "WKT прозорец за проверка:" + +msgid "Debugging window (serialized value)" +msgstr "Debugging прозорец (сериализирана стойност)" + +msgid "No feeds are registered." +msgstr "Няма регистрирани фийда." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Слъгът %r не е регистриран." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1168ac4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/bn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po new file mode 100644 index 0000000..e99ab2a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,93 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Anastasiadis Stavros , 2014 +# Dimitris Glezos , 2011 +# Elena Andreou , 2016 +# Kostas Papadimitriou , 2012 +# Nick Mavrakis , 2016 +# Pãnoș , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr " Γεωγραφικά Συστήματα Πληροφορίας" + +msgid "The base GIS field." +msgstr "Το βασικό GIS πεδίο." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Το βασικό Γεωμετρικό πεδίο -- αντιστοιχεί στον τύπο της Γεωμετρικής " +"Προδιαγραφής OpenGIS." + +msgid "Point" +msgstr "Σημείο" + +msgid "Line string" +msgstr "Γραμμή string" + +msgid "Polygon" +msgstr "Πολύγωνο" + +msgid "Multi-point" +msgstr "Πολλαπλό σημείο" + +msgid "Multi-line string" +msgstr "Multi-line string" + +msgid "Multi polygon" +msgstr "Πολλαπλό πολύγωνο" + +msgid "Geometry collection" +msgstr "Συλλογή γεωμετριών" + +msgid "Extent Aggregate Field" +msgstr "Πεδίο Extent Aggregate" + +msgid "Raster Field" +msgstr "Πεδίο Raster" + +msgid "No geometry value provided." +msgstr "Δε δόθηκε τιμή γεωμετρίας." + +msgid "Invalid geometry value." +msgstr "Άκυρη γεωμετρική τιμή." + +msgid "Invalid geometry type." +msgstr "Άκυρος γεωμετρικός τύπος." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Παρουσιάστηκε σφάλμα κατά τη μετατροπή της γεωμετρίας στο SRID του πεδίου " +"της φόρμας γεωμετρίας." + +msgid "Delete all Features" +msgstr "Διαγραφή όλων των αντικειμένων" + +msgid "WKT debugging window:" +msgstr "Παράθυρο αποσφαλμάτωσης WKT" + +msgid "Debugging window (serialized value)" +msgstr "Παράθυρο αποσφαλμάτωσης (σειριακή τιμή)" + +msgid "No feeds are registered." +msgstr "Δεν υπάρχουν εγγεγραμμένες ροές ειδήσεων." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Το slug %r δεν έχει καταχωρηθεί." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..93567a5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..9b4e60a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,93 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2012,2015-2016 +# Ernesto Avilés Vázquez , 2015 +# Igor Támara , 2015 +# Jannis Leidel , 2011 +# Josue Naaman Nistal Guerra , 2014 +# Marc Garcia , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "El campo GIS base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"El campo base Geometry -- casa con el tipo OpenGis Specification Geometry" + +msgid "Point" +msgstr "Punto" + +msgid "Line string" +msgstr "Cadena de línea" + +msgid "Polygon" +msgstr "Polígono" + +msgid "Multi-point" +msgstr "Punto múltiple" + +msgid "Multi-line string" +msgstr "Cadena de línea múltiple" + +msgid "Multi polygon" +msgstr "Polígono múltiple" + +msgid "Geometry collection" +msgstr "Colección de \"Geometry\"" + +msgid "Extent Aggregate Field" +msgstr "Extensión de campo agregado" + +msgid "Raster Field" +msgstr "Campo Raster" + +msgid "No geometry value provided." +msgstr "No se indico ningún valor de geometría." + +msgid "Invalid geometry value." +msgstr "Valor de geometría inválido." + +msgid "Invalid geometry type." +msgstr "Tipo de geometría inválido." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ocurrió un error al transformar la geometria al SRID de la geometria del " +"campo de formulario." + +msgid "Delete all Features" +msgstr "Borrar todos los elementos" + +msgid "WKT debugging window:" +msgstr "Ventana de depuración WKT" + +msgid "Debugging window (serialized value)" +msgstr "Ventana de depuración (valores serializados)" + +msgid "No feeds are registered." +msgstr "No se han registrado canales de contenido." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "El slug %r no está registrado." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ae392de Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..85698c5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,87 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abraham Estrada, 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" +"language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "Punto" + +msgid "Line string" +msgstr "Secuencia de líneas" + +msgid "Polygon" +msgstr "Polígono" + +msgid "Multi-point" +msgstr "Multi-punto" + +msgid "Multi-line string" +msgstr "Cadena multi-línea" + +msgid "Multi polygon" +msgstr "Multi polígonos" + +msgid "Geometry collection" +msgstr "Colección de geometrías" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "No se ha proporcionado un valor de geometría." + +msgid "Invalid geometry value." +msgstr "Valor de geometría no válido." + +msgid "Invalid geometry type." +msgstr "Tipo de geometría no válido." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ha ocurrido un error mientras se transformaba la geometría al SRID del campo " +"de formulario de la misma." + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "No hay feeds registrados." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "El slug %r no está registrado." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..dc8a885 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Nikneshan , 2012-2013 +# Alireza Savand , 2013 +# Ali Vakilzade , 2015 +# Jannis Leidel , 2011 +# Pouya Abbassi, 2016 +# Saeed , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "GIS" +msgstr "جی‌آی‌اس" + +msgid "The base GIS field." +msgstr "پایه‌ی سیستم اطلاعات جغرافیایی میدانی." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "پایه‌ی فیلد هندسی --نوع خاص هندسه‌ی نقشه‌ها‌ی نوع OpenGIS" + +msgid "Point" +msgstr "نقطه" + +msgid "Line string" +msgstr "رشته خط" + +msgid "Polygon" +msgstr "چندضلعی" + +msgid "Multi-point" +msgstr "چند نقطه ای" + +msgid "Multi-line string" +msgstr "چند خط رشته" + +msgid "Multi polygon" +msgstr "چندین چند ضلعی " + +msgid "Geometry collection" +msgstr "مجموعه هندسی" + +msgid "Extent Aggregate Field" +msgstr "تراکم وسعت حوزه‌ی " + +msgid "Raster Field" +msgstr "حوزه‌ی شطرنجی" + +msgid "No geometry value provided." +msgstr "مقدار جغرافیایی‌ای مقرر نشده است." + +msgid "Invalid geometry value." +msgstr "مقدار جغرافیایی نامعتبر" + +msgid "Invalid geometry type." +msgstr "نوعِ جغرافیایی نامعتبر" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "مشکلی در هنگام انتقال مختصات هندسی از فیلد به SRID رخ داد." + +msgid "Delete all Features" +msgstr "حذف همه‌ی اشیاء" + +msgid "WKT debugging window:" +msgstr "پنجره‌ی اشکال زدایی «متن قابل درک»" + +msgid "Debugging window (serialized value)" +msgstr "پنجره‌ی اشکال زدایی (ارزش متوالی)" + +msgid "No feeds are registered." +msgstr "هیچ فیدی ثبت شده است." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r ثبت نشده" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a60917b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..7df1906 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014-2015,2017 +# Claude Paroz , 2012 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "GIS" +msgstr "SIG" + +msgid "The base GIS field." +msgstr "Le champ SIG de base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Le champ géométrique de base, correspond au type Geometry de la " +"spécification OpenGIS." + +msgid "Point" +msgstr "Point" + +msgid "Line string" +msgstr "Chaîne de segment" + +msgid "Polygon" +msgstr "Polygone" + +msgid "Multi-point" +msgstr "Multipoint" + +msgid "Multi-line string" +msgstr "Chaîne multisegment" + +msgid "Multi polygon" +msgstr "Multipolygone" + +msgid "Geometry collection" +msgstr "Collection géométrique" + +msgid "Extent Aggregate Field" +msgstr "Champ d'agrégation d'étendue" + +msgid "Raster Field" +msgstr "Champ matriciel" + +msgid "No geometry value provided." +msgstr "Aucune valeur géométrique fournie." + +msgid "Invalid geometry value." +msgstr "Valeur géométrique non valide." + +msgid "Invalid geometry type." +msgstr "Type de géométrie non valide." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Une erreur est survenue lors de la transformation de l'objet géométrique " +"dans le SRID du champ de formulaire géométrique." + +msgid "Delete all Features" +msgstr "Supprimer toutes les localisations" + +msgid "WKT debugging window:" +msgstr "Fenêtre de débogage WKT :" + +msgid "Debugging window (serialized value)" +msgstr "Fenêtre de débogage (valeur sérialisée)" + +msgid "No feeds are registered." +msgstr "Aucun flux enregistré." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Le slug %r n'est pas enregistré." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..19b093b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po new file mode 100644 index 0000000..9426d48 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/fy/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:35+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" +"language/fy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Google Maps via GeoDjango" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po new file mode 100644 index 0000000..e8de66a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ga/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Michael Thornhill , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ga\n" +"Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " +"4);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "Pointe" + +msgid "Line string" +msgstr "Líne teaghrán" + +msgid "Polygon" +msgstr "Polagán" + +msgid "Multi-point" +msgstr "Il-phointe" + +msgid "Multi-line string" +msgstr "Il-líne teaghrán" + +msgid "Multi polygon" +msgstr "Il polagán" + +msgid "Geometry collection" +msgstr "Céimseata bhailiú" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "Ní soláthair méid geoiméadracht" + +msgid "Invalid geometry value." +msgstr "Méid geoiméadracht neamhbhailí" + +msgid "Invalid geometry type." +msgstr "Tíopa geoiméadracht neamhbhailí" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Tharla earráid ag claochlú an geoiméadracht go dtí SRID an réimse fhoirm " +"geoiméadracht." + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "Níl fothaí cláraithe." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Níl slug %r cláraithe." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..999468e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2d0352c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/he/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..7c844b6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# berislavlopac , 2012 +# Davor Lučić , 2012 +# Filip Cuk , 2016 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Croatian (http://www.transifex.com/django/django/language/" +"hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "Točka" + +msgid "Line string" +msgstr "Linija (Line string)" + +msgid "Polygon" +msgstr "Poligon" + +msgid "Multi-point" +msgstr "Više točaka" + +msgid "Multi-line string" +msgstr "Više linija (Line string)" + +msgid "Multi polygon" +msgstr "Više poligona" + +msgid "Geometry collection" +msgstr "Geometrijska kolekcija" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "Geometrijska vrijednost nije priložena." + +msgid "Invalid geometry value." +msgstr "Neispravna geometrijska vrijednost." + +msgid "Invalid geometry type." +msgstr "Neispravan geometrijski tip." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Došlo je do greške pri transformaciji geometrije na SRID geometrijskog polja " +"forme." + +msgid "Delete all Features" +msgstr "Izbriši sve značajke" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "Nema registriranih izvora." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r nije registriran." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5fe4b97 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..090bbf0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 00:02+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Bazowe polo GIS." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Bazowe geometrijowe polo -- zarysowane do geometrijoweho typa specifikacije " +"OpenGIS. " + +msgid "Point" +msgstr "Dypk" + +msgid "Line string" +msgstr "Čara" + +msgid "Polygon" +msgstr "Wjeleróžk" + +msgid "Multi-point" +msgstr "Wjacore dypki" + +msgid "Multi-line string" +msgstr "Wjacore čary" + +msgid "Multi polygon" +msgstr "Wjacore wjelróžki" + +msgid "Geometry collection" +msgstr "Geometrijowa zběrka" + +msgid "Extent Aggregate Field" +msgstr "Polo „extent aggregate“" + +msgid "Raster Field" +msgstr "Rasterowe polo" + +msgid "No geometry value provided." +msgstr "Žana geometrijowa hódnota podata." + +msgid "Invalid geometry value." +msgstr "Njepłaćiwa geometrijowa hódnota." + +msgid "Invalid geometry type." +msgstr "Njepłaćiwy geometrijowy typ." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Zmylk je wustupił, hdyž so geometrija do SRID pola geometrijoweho formulara " +"přetwori." + +msgid "Delete all Features" +msgstr "Wšě funkcije zhašeć" + +msgid "WKT debugging window:" +msgstr "Wokno pytanja zmylkow WKT:" + +msgid "Debugging window (serialized value)" +msgstr "Wokno pytanja zmylkow (serijalizowana hódnota)" + +msgid "No feeds are registered." +msgstr "Žane kanale zregistrowane." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Adresowe mjeno %r njeje zregistrowane." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..a30fbcc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,90 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016 +# Jannis Leidel , 2011 +# Kristóf Gruber <>, 2012 +# Szilveszter Farkas , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: János R (Hangya)\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Az alap GIS mező." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Az alap Geometry mező -- az OpenGIS specifikáció geometria típusának " +"megfelelően" + +msgid "Point" +msgstr "Pont" + +msgid "Line string" +msgstr "Vonallánc" + +msgid "Polygon" +msgstr "Poligon" + +msgid "Multi-point" +msgstr "Multi-pont" + +msgid "Multi-line string" +msgstr "Többes vonallánc" + +msgid "Multi polygon" +msgstr "Multi-poligon" + +msgid "Geometry collection" +msgstr "Geometria gyűjtemény" + +msgid "Extent Aggregate Field" +msgstr "Terület összegző mező" + +msgid "Raster Field" +msgstr "Raszter mező" + +msgid "No geometry value provided." +msgstr "Geometriai adat nem került megadásra." + +msgid "Invalid geometry value." +msgstr "Érvénytelen geometriai érték." + +msgid "Invalid geometry type." +msgstr "Érvénytelen geometriai típus." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "Hiba történt a geometriai transzformáció során." + +msgid "Delete all Features" +msgstr "Minden Feature törlése" + +msgid "WKT debugging window:" +msgstr "WKT debug ablak:" + +msgid "Debugging window (serialized value)" +msgstr "Debug ablak (szerializált érték)" + +msgid "No feeds are registered." +msgstr "Nincs regisztrált feed." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "%r slug nincs regisztrálva." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..83c1a26 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/hy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo new file mode 100644 index 0000000..022198c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..c635569 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2012,2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "Le campo GIS de base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Le campo Geometry de base. Corresponde al typo geometric del specification " +"OpenGIS." + +msgid "Point" +msgstr "Puncto" + +msgid "Line string" +msgstr "Texto de linea" + +msgid "Polygon" +msgstr "Polygono" + +msgid "Multi-point" +msgstr "Plure punctos" + +msgid "Multi-line string" +msgstr "Texto con plure lineas" + +msgid "Multi polygon" +msgstr "Plure polygonos" + +msgid "Geometry collection" +msgstr "Collection geometric" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "Nulle valor geometric fornite." + +msgid "Invalid geometry value." +msgstr "Valor geometric invalide." + +msgid "Invalid geometry type." +msgstr "Typo geometric invalide." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Un error occurreva durante le transformation del geometria al SRID del campo " +"del formulario geometric." + +msgid "Delete all Features" +msgstr "Deler tote le elementos" + +msgid "WKT debugging window:" +msgstr "Fenestra pro debugging WKT:" + +msgid "Debugging window (serialized value)" +msgstr "Fenestra pro debugging (valor serialisate)" + +msgid "No feeds are registered." +msgstr "Nulle syndication es registrate." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Le denotation %r non es registrate." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f9e56b1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/id/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a5371ba Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/io/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..aea2b94 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,93 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# yakky , 2015 +# Jannis Leidel , 2011 +# Marco Bonetti, 2014 +# Nicola Larosa , 2012 +# palmux , 2015 +# Mattia Procopio , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Il campo GIS base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Il campo base GIS -- corrisponde al tipo Geometry delle specifiche OpenGIS." + +msgid "Point" +msgstr "Punto" + +msgid "Line string" +msgstr "Stringa linea" + +msgid "Polygon" +msgstr "Poligono" + +msgid "Multi-point" +msgstr "Multipunto" + +msgid "Multi-line string" +msgstr "Stringa multilinea" + +msgid "Multi polygon" +msgstr "Multi poligono" + +msgid "Geometry collection" +msgstr "Raccolta Geometry" + +msgid "Extent Aggregate Field" +msgstr "Campo di aggregazione esteso" + +msgid "Raster Field" +msgstr "Campo raster" + +msgid "No geometry value provided." +msgstr "Nessun valore geometrico fornito." + +msgid "Invalid geometry value." +msgstr "Valore geometrico non valido." + +msgid "Invalid geometry type." +msgstr "Tipo geometrico non valido." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Si è verificato un errore durante la trasformazione della geometria nello " +"SRID del campo geometria della form." + +msgid "Delete all Features" +msgstr "Cancella tutti gli oggetti" + +msgid "WKT debugging window:" +msgstr "Finestra di debug WKT:" + +msgid "Debugging window (serialized value)" +msgstr "Finestra di debug (valore serializzato)" + +msgid "No feeds are registered." +msgstr "Non ci sono feed registrati." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Lo slug %r non è registrato." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..754d6a8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ja/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c750301 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po new file mode 100644 index 0000000..d5d5980 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/km/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:35+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Khmer (http://www.transifex.com/projects/p/django/language/" +"km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Google Maps via GeoDjango" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..be4f674 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f91c361 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po new file mode 100644 index 0000000..40fd9e2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/lb/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:35+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" +"language/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Google Maps via GeoDjango" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po new file mode 100644 index 0000000..ad8251e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ml/LC_MESSAGES/django.po @@ -0,0 +1,88 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aby Thomas , 2014 +# Jannis Leidel , 2011 +# Rajeesh Nair , 2011-2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" +"ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "ജി.ഐ.എസ്" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "ബിന്ദു" + +msgid "Line string" +msgstr "രേഖാ സ്ട്രിങ്ങ്" + +msgid "Polygon" +msgstr "ബഹുഭുജം" + +msgid "Multi-point" +msgstr "ബഹുബിന്ദു" + +msgid "Multi-line string" +msgstr "ബഹു രേഖാ സ്ട്രിങ്ങ്" + +msgid "Multi polygon" +msgstr "ബഹു ബഹുഭുജം" + +msgid "Geometry collection" +msgstr "ജ്യാമിതി ശേഖരം" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "ജ്യാമിതീയ മൂല്യമൊന്നും തന്നിട്ടില്ല." + +msgid "Invalid geometry value." +msgstr "തെറ്റായ ജ്യാമിതീയ മൂല്യം." + +msgid "Invalid geometry type." +msgstr "തെറ്റായ തരം ജ്യാമിതി." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"ജ്യാമിതീയ രൂപത്തെ ജ്യാമിതി കളത്തിന്റെ SRID-ലേക്കു മാറ്റുമ്പോള്‍ എന്തോ തകരാറു സംഭവിച്ചിട്ടുണ്ട്." + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr " ഫീഡുകളൊന്നും രജിസ്റ്റര്‍ ചെയ്തിട്ടില്ല." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "%r എന്ന സ്ലഗ് രജിസ്റ്റര്‍ ചെയ്തിട്ടില്ല." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..83ef357 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:35+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Google Maps via GeoDjango" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..443434b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..3fbc0ee --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,85 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Yhal Htet Aung , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-20 03:01+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Burmese (http://www.transifex.com/django/django/language/" +"my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "GIS" +msgstr "ဂျီအိုင်အက်စ်" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a3cf201 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..07e9468 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,84 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Sagar Chalise , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "बिन्दु" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "बहुभुज" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "ज्यामिति संकलन" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "ज्यामिति मान उपलब्ध छैन ।" + +msgid "Invalid geometry value." +msgstr "उनुपयुक्त ज्यामिति मान" + +msgid "Invalid geometry type." +msgstr "उनुपयुक्त ज्यामिति प्रकार" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8193ee6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..7e15bf2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,94 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Blue , 2011 +# Harro van der Klauw , 2012 +# Ilja Maas , 2015 +# Jannis Leidel , 2011 +# Jeffrey Gelens , 2011 +# Sander Steffann , 2015 +# Tonnes , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2019-02-24 16:22+0000\n" +"Last-Translator: Tonnes \n" +"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Het basis-GIS-veld." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Het basis-Geometrie-veld -- correspondeert met het Geometrie-type van de " +"OpenGIS-specificatie." + +msgid "Point" +msgstr "Punt" + +msgid "Line string" +msgstr "Tekenreeks" + +msgid "Polygon" +msgstr "Polygoon" + +msgid "Multi-point" +msgstr "Multipunt" + +msgid "Multi-line string" +msgstr "Multi-tekenreeks" + +msgid "Multi polygon" +msgstr "Multi-polygoon" + +msgid "Geometry collection" +msgstr "Geometrie-verzameling" + +msgid "Extent Aggregate Field" +msgstr "Gebieds-aggregatieveld" + +msgid "Raster Field" +msgstr "Rasterveld" + +msgid "No geometry value provided." +msgstr "Geen geometriewaarde opgegeven." + +msgid "Invalid geometry value." +msgstr "Ongeldige geometriewaarde." + +msgid "Invalid geometry type." +msgstr "Ongeldig geometrietype." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Er is een fout opgetreden bij het omvormen van de geometrie naar de SRID van " +"het geometrieveld." + +msgid "Delete all Features" +msgstr "Alle kenmerken verwijderen" + +msgid "WKT debugging window:" +msgstr "WKT-debugvenster:" + +msgid "Debugging window (serialized value)" +msgstr "Debugvenster (geserialiseerde waarde)" + +msgid "No feeds are registered." +msgstr "Er zijn geen feeds geregistreerd." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r is niet geregistreerd." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cc74c58 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..c4c1e12 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,95 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claudio Fernandes , 2015 +# Jannis Leidel , 2011 +# jorgecarleitao , 2015 +# Manuela Silva , 2015 +# Nuno Mariz , 2011-2012,2015 +# Paulo Köch , 2011 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "SIG" + +msgid "The base GIS field." +msgstr "O campo GIS base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"O campo de Geometria base -- mapeia para o tipo de Geometria de " +"Especificação do OpenGIS." + +msgid "Point" +msgstr "Ponto" + +msgid "Line string" +msgstr "Linha" + +msgid "Polygon" +msgstr "Polígono" + +msgid "Multi-point" +msgstr "Multi-ponto" + +msgid "Multi-line string" +msgstr "Multi-linha" + +msgid "Multi polygon" +msgstr "Multi-polígono" + +msgid "Geometry collection" +msgstr "Coleção geométrica" + +msgid "Extent Aggregate Field" +msgstr "Extender Campo Agregado" + +msgid "Raster Field" +msgstr "Campo Raster" + +msgid "No geometry value provided." +msgstr "Não foi submetido nenhum valor do tipo geometria." + +msgid "Invalid geometry value." +msgstr "Valor inválido de geometria." + +msgid "Invalid geometry type." +msgstr "Tipo inválido de geometria." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ocorreu um erro na transformação da geometria para o SRID da geometria do " +"campo do formulário." + +msgid "Delete all Features" +msgstr "Eliminar todas as Caraterísticas" + +msgid "WKT debugging window:" +msgstr "Janela de depuração de WKT:" + +msgid "Debugging window (serialized value)" +msgstr "Janela de depuração (valor serializado)" + +msgid "No feeds are registered." +msgstr "Nenhum feed está registado." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "O slug %r não está registado." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..513b544 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..c2ec281 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,94 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# Carlos Leite , 2015-2016 +# Eduardo Cereto Carvalho, 2011 +# semente, 2012 +# Jannis Leidel , 2011 +# Lucas Infante , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "O campo GIS base." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"O campo base de geometria -- mapeia para o tipo de geometria da " +"especificação OpenGis" + +msgid "Point" +msgstr "Ponto" + +msgid "Line string" +msgstr "Linha string" + +msgid "Polygon" +msgstr "Polígono" + +msgid "Multi-point" +msgstr "Multiponto" + +msgid "Multi-line string" +msgstr "Multilinha string" + +msgid "Multi polygon" +msgstr "Multipolígono" + +msgid "Geometry collection" +msgstr "Coleção geométrica" + +msgid "Extent Aggregate Field" +msgstr "Campo agregado extendido" + +msgid "Raster Field" +msgstr "Campo Raster." + +msgid "No geometry value provided." +msgstr "Nenhum valor geométrico fornecido." + +msgid "Invalid geometry value." +msgstr "Valor geométrico inválido." + +msgid "Invalid geometry type." +msgstr "Tipo geométrico inválido." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Ocorreu um erro ao transformar a geometria para o SRID do campo de " +"formulário de geometria." + +msgid "Delete all Features" +msgstr "Deletar todas os elementos" + +msgid "WKT debugging window:" +msgstr "Janela de debug WKT" + +msgid "Debugging window (serialized value)" +msgstr "Janela de debug (valor seralizado)" + +msgid "No feeds are registered." +msgstr "Nenhum feed foi registrado." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "O slug %r não foi registrado." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..880b916 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..7cca1ca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Primož Verdnik , 2017 +# zejn , 2016 +# zejn , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Osnovno GIS polje" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" +"Osnovno polje GIS -- se preslika v vrsto Geometry po določilih OpenGIS." + +msgid "Point" +msgstr "Točka" + +msgid "Line string" +msgstr "Črtni niz" + +msgid "Polygon" +msgstr "Mnogokotnik" + +msgid "Multi-point" +msgstr "Več-točkovi predmet" + +msgid "Multi-line string" +msgstr "Več črtni niz" + +msgid "Multi polygon" +msgstr "Večkratni mnogokotnikov" + +msgid "Geometry collection" +msgstr "Zbirka likov" + +msgid "Extent Aggregate Field" +msgstr "Polje z agregiranim območjem" + +msgid "Raster Field" +msgstr "Rastersko polje" + +msgid "No geometry value provided." +msgstr "Ni navedene geometrijske vrednosti." + +msgid "Invalid geometry value." +msgstr "Neveljavna geometrijska vrednost." + +msgid "Invalid geometry type." +msgstr "Neveljavna vrsta geometrije." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Med pretvarjanjem geometrijskega zapisa v SRID geometrijskega polja je " +"prišlo do napake." + +msgid "Delete all Features" +msgstr "Pobriši vse atribute" + +msgid "WKT debugging window:" +msgstr "Okno za razhroščevanje WKT" + +msgid "Debugging window (serialized value)" +msgstr "Okno za razhroščevanje (serializirana vrednost)" + +msgid "No feeds are registered." +msgstr "Ni vpisanih virov." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Okrajšava %r ni vpisana." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8d053ea Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sq/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e119f7a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1e7ac9f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/sw/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..9c2577c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,80 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-18 09:16+0100\n" +"PO-Revision-Date: 2015-03-18 08:35+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/projects/p/django/language/" +"ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "" + +msgid "Invalid geometry value." +msgstr "" + +msgid "Invalid geometry type." +msgstr "" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Google Maps via GeoDjango" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..0797c2f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,84 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "" + +msgid "Line string" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Multi-point" +msgstr "" + +msgid "Multi-line string" +msgstr "" + +msgid "Multi polygon" +msgstr "" + +msgid "Geometry collection" +msgstr "" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "క్షెత్రగనిత మూల్యము ఇవ్వలెదు." + +msgid "Invalid geometry value." +msgstr "సరికాని క్షేత్రగణిత మూల్యము." + +msgid "Invalid geometry type." +msgstr "సరికాని క్షేత్రగణిత రకం." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..40355c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,86 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kowit Charoenratchatabhan , 2012 +# Vichai Vongvorakul , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "จุด" + +msgid "Line string" +msgstr "สายสตริง" + +msgid "Polygon" +msgstr "รูปหลายเหลี่ยม" + +msgid "Multi-point" +msgstr "หลาย ๆ จุด" + +msgid "Multi-line string" +msgstr "สตริงหลายบรรทัด" + +msgid "Multi polygon" +msgstr "รูปหลายเหลี่ยมหลายรูป" + +msgid "Geometry collection" +msgstr "คอลเลกชันรูปทรงเรขาคณิต" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "ไม่พบข้อมูลพิกัด" + +msgid "Invalid geometry value." +msgstr "ค่าพิกัดผิดพลาด " + +msgid "Invalid geometry type." +msgstr "ขนิดข้อมูลพิกัดผิดพลาด" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "ข้อผิดพลาดที่เกิดขึ้นเมื่อการเปลี่ยนรูปทรงเรขาคณิตที่ SRID ของเขตข้อมูลฟอร์มเรขาคณิต" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "ไม่มีฟีดที่ลงทะเบียน" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r ไม่ได้ลงทะเบียน" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..ad71bed --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,91 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BouRock, 2015 +# BouRock, 2014-2015 +# Jannis Leidel , 2011 +# Murat Çorlu , 2012 +# Murat Sahin , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "Temel GIS alanı." + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "Temel Geometri alanı - OpenGIS Özellikleri Geometri türüyle eşlenir." + +msgid "Point" +msgstr "Nokta" + +msgid "Line string" +msgstr "Satır dizgesi" + +msgid "Polygon" +msgstr "Çokgen" + +msgid "Multi-point" +msgstr "Çok noktalı" + +msgid "Multi-line string" +msgstr "Çok satırlı dizge" + +msgid "Multi polygon" +msgstr "Çoklu çokgen" + +msgid "Geometry collection" +msgstr "Geometri koleksiyonu" + +msgid "Extent Aggregate Field" +msgstr "Toplama Alanını Genişlet" + +msgid "Raster Field" +msgstr "Tarama Alanı" + +msgid "No geometry value provided." +msgstr "Verilen hiç geometri değeri yok." + +msgid "Invalid geometry value." +msgstr "Geçersiz geometri değeri." + +msgid "Invalid geometry type." +msgstr "Geçersiz geometri türü." + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"Geometri verisi geometri form alanının SRID değerine dönüştürülürken bir " +"hata meydana geldi." + +msgid "Delete all Features" +msgstr "Tüm Özellikleri Sil" + +msgid "WKT debugging window:" +msgstr "WKT hata ayıklama penceresi:" + +msgid "Debugging window (serialized value)" +msgstr "Hata ayıklama penceresi (serileştirilmiş değer)" + +msgid "No feeds are registered." +msgstr "Hiçbir besleme kayıtlı değil." + +#, python-format +msgid "Slug %r isn't registered." +msgstr "%r kısaltması kayıtlı değil." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po new file mode 100644 index 0000000..bb78f46 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/ur/LC_MESSAGES/django.po @@ -0,0 +1,86 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mansoorulhaq Mansoor , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Urdu (http://www.transifex.com/django/django/language/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "GIS" +msgstr "" + +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "" + +msgid "Point" +msgstr "نقطہ" + +msgid "Line string" +msgstr "لائن سٹرنگ" + +msgid "Polygon" +msgstr "پولی گان" + +msgid "Multi-point" +msgstr "کثیر النقاط" + +msgid "Multi-line string" +msgstr "متعدد لائنوں والا سٹرنگ" + +msgid "Multi polygon" +msgstr "ملٹی پولی گان" + +msgid "Geometry collection" +msgstr "جیومیٹری کا ذخیرہ" + +msgid "Extent Aggregate Field" +msgstr "" + +msgid "Raster Field" +msgstr "" + +msgid "No geometry value provided." +msgstr "کوئی جیومیٹری ویلیو مھیا نھیں کی گئی۔" + +msgid "Invalid geometry value." +msgstr "غلط جیومیٹری ویلیو۔" + +msgid "Invalid geometry type." +msgstr "غلط جیومیٹری ٹائپ" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "" +"جیومیٹری کو جیومیٹری کے فارم کے SRID خانے میں تبدیل کرتے ھوئےکوئی خرابی واقع " +"ھو گئی ھے۔" + +msgid "Delete all Features" +msgstr "" + +msgid "WKT debugging window:" +msgstr "" + +msgid "Debugging window (serialized value)" +msgstr "" + +msgid "No feeds are registered." +msgstr "" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0295e89 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/vi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..ce6b46f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,92 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Daniel Duan , 2011 +# Jannis Leidel , 2011 +# Lei Yang , 2011 +# Lele Long , 2011,2015 +# mozillazg , 2016 +# Ronald White , 2014 +# Kevin Sze , 2012 +# 航 柯 , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2018-10-15 08:06+0000\n" +"Last-Translator: 航 柯 \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "基础 GIS 字段。" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "基础 Geometry 字段 -- 映射到 OpenGIS 规范几何类型。" + +msgid "Point" +msgstr "点" + +msgid "Line string" +msgstr "行字串" + +msgid "Polygon" +msgstr "多边形" + +msgid "Multi-point" +msgstr "多点" + +msgid "Multi-line string" +msgstr "多行字符串" + +msgid "Multi polygon" +msgstr "多个多边形" + +msgid "Geometry collection" +msgstr "几何集合" + +msgid "Extent Aggregate Field" +msgstr "扩展聚集字段" + +msgid "Raster Field" +msgstr "光栅字段" + +msgid "No geometry value provided." +msgstr "未提供几何信息。" + +msgid "Invalid geometry value." +msgstr "无效几何信息。" + +msgid "Invalid geometry type." +msgstr "无效几何类型。" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "几何形状转换SRID字段将发生错误" + +msgid "Delete all Features" +msgstr "删除所有要素" + +msgid "WKT debugging window:" +msgstr "WKT 调试窗口:" + +msgid "Debugging window (serialized value)" +msgstr "调试窗口(已序列化的值)" + +msgid "No feeds are registered." +msgstr "没有已注册的源。" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "Slug %r 没有注册." diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0be3e70 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..3291214 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,89 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Chen Chun-Chia , 2015 +# ilay , 2012 +# Jannis Leidel , 2011 +# quantum9876 , 2011 +# Tzu-ping Chung , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/" +"language/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "GIS" +msgstr "GIS" + +msgid "The base GIS field." +msgstr "基礎 GIS 欄位。" + +msgid "" +"The base Geometry field -- maps to the OpenGIS Specification Geometry type." +msgstr "基本的 Geometry 欄位——對應於 OpenGIS 規格的 Geometry 類型。" + +msgid "Point" +msgstr "Point 類別" + +msgid "Line string" +msgstr "Line string 類別" + +msgid "Polygon" +msgstr "Polygon 類別" + +msgid "Multi-point" +msgstr "Multi-point 類別" + +msgid "Multi-line string" +msgstr "Multi-line string 類別" + +msgid "Multi polygon" +msgstr "Multi polygon 類別" + +msgid "Geometry collection" +msgstr "Geometry collection (幾何型別之叢集) 類別" + +msgid "Extent Aggregate Field" +msgstr "聚集程度欄位" + +msgid "Raster Field" +msgstr "柵格欄位" + +msgid "No geometry value provided." +msgstr "沒有幾何資訊。" + +msgid "Invalid geometry value." +msgstr "無效的幾何參數。" + +msgid "Invalid geometry type." +msgstr "無效的幾何類型。" + +msgid "" +"An error occurred when transforming the geometry to the SRID of the geometry " +"form field." +msgstr "當把目前地理資訊-GIS,轉成空間參考識別碼-SRID時發生錯誤。" + +msgid "Delete all Features" +msgstr "刪除所有特徵" + +msgid "WKT debugging window:" +msgstr "WKT 除錯視窗:" + +msgid "Debugging window (serialized value)" +msgstr "除錯視窗 (序列化值)" + +msgid "No feeds are registered." +msgstr "沒有已註冊的 feed。" + +#, python-format +msgid "Slug %r isn't registered." +msgstr "嵌入式語法 %r 尚未註冊。" diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/sitemaps/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/gis/sitemaps/__init__.py new file mode 100644 index 0000000..7337e65 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/sitemaps/__init__.py @@ -0,0 +1,4 @@ +# Geo-enabled Sitemap classes. +from django.contrib.gis.sitemaps.kml import KMLSitemap, KMZSitemap + +__all__ = ['KMLSitemap', 'KMZSitemap'] diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg new file mode 100644 index 0000000..f006524 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_point_on.svg @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg new file mode 100644 index 0000000..b02dd35 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_off.svg @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg new file mode 100644 index 0000000..303a02a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/static/gis/img/draw_polygon_on.svg @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/openlayers.html b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/openlayers.html new file mode 100644 index 0000000..56bb50b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/openlayers.html @@ -0,0 +1,40 @@ +{% block extrastyle %} +{% load i18n static %}{% get_current_language_bidi as LANGUAGE_BIDI %} + + +{% endblock %} + + +
      +{% if editable %} +{% trans "Delete all Features" %} +{% endif %} +{% if display_wkt %}

      {% trans "WKT debugging window:" %}

      {% endif %} + + +
      diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.html b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.html new file mode 100644 index 0000000..63c3270 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.html @@ -0,0 +1,2 @@ +{% extends "gis/admin/openlayers.html" %} +{% block openlayers %}{% include "gis/admin/osm.js" %}{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.js b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.js new file mode 100644 index 0000000..16a5773 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/templates/gis/admin/osm.js @@ -0,0 +1,2 @@ +{% extends "gis/admin/openlayers.js" %} +{% block base_layer %}new OpenLayers.Layer.OSM("OpenStreetMap (Mapnik)");{% endblock %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/utils/layermapping.py b/venv/lib/python3.7/site-packages/django/contrib/gis/utils/layermapping.py new file mode 100644 index 0000000..b7372f4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/utils/layermapping.py @@ -0,0 +1,631 @@ +# LayerMapping -- A Django Model/OGR Layer Mapping Utility +""" + The LayerMapping class provides a way to map the contents of OGR + vector files (e.g. SHP files) to Geographic-enabled Django models. + + For more information, please consult the GeoDjango documentation: + https://docs.djangoproject.com/en/dev/ref/contrib/gis/layermapping/ +""" +import sys +from decimal import Decimal, InvalidOperation as DecimalInvalidOperation + +from django.contrib.gis.db.models import GeometryField +from django.contrib.gis.gdal import ( + CoordTransform, DataSource, GDALException, OGRGeometry, OGRGeomType, + SpatialReference, +) +from django.contrib.gis.gdal.field import ( + OFTDate, OFTDateTime, OFTInteger, OFTInteger64, OFTReal, OFTString, + OFTTime, +) +from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist +from django.db import connections, models, router, transaction +from django.utils.encoding import force_text + + +# LayerMapping exceptions. +class LayerMapError(Exception): + pass + + +class InvalidString(LayerMapError): + pass + + +class InvalidDecimal(LayerMapError): + pass + + +class InvalidInteger(LayerMapError): + pass + + +class MissingForeignKey(LayerMapError): + pass + + +class LayerMapping: + "A class that maps OGR Layers to GeoDjango Models." + + # Acceptable 'base' types for a multi-geometry type. + MULTI_TYPES = { + 1: OGRGeomType('MultiPoint'), + 2: OGRGeomType('MultiLineString'), + 3: OGRGeomType('MultiPolygon'), + OGRGeomType('Point25D').num: OGRGeomType('MultiPoint25D'), + OGRGeomType('LineString25D').num: OGRGeomType('MultiLineString25D'), + OGRGeomType('Polygon25D').num: OGRGeomType('MultiPolygon25D'), + } + # Acceptable Django field types and corresponding acceptable OGR + # counterparts. + FIELD_TYPES = { + models.AutoField: OFTInteger, + models.BigAutoField: OFTInteger64, + models.IntegerField: (OFTInteger, OFTReal, OFTString), + models.FloatField: (OFTInteger, OFTReal), + models.DateField: OFTDate, + models.DateTimeField: OFTDateTime, + models.EmailField: OFTString, + models.TimeField: OFTTime, + models.DecimalField: (OFTInteger, OFTReal), + models.CharField: OFTString, + models.SlugField: OFTString, + models.TextField: OFTString, + models.URLField: OFTString, + models.BigIntegerField: (OFTInteger, OFTReal, OFTString), + models.SmallIntegerField: (OFTInteger, OFTReal, OFTString), + models.PositiveSmallIntegerField: (OFTInteger, OFTReal, OFTString), + } + + def __init__(self, model, data, mapping, layer=0, + source_srs=None, encoding='utf-8', + transaction_mode='commit_on_success', + transform=True, unique=None, using=None): + """ + A LayerMapping object is initialized using the given Model (not an instance), + a DataSource (or string path to an OGR-supported data file), and a mapping + dictionary. See the module level docstring for more details and keyword + argument usage. + """ + # Getting the DataSource and the associated Layer. + if isinstance(data, str): + self.ds = DataSource(data, encoding=encoding) + else: + self.ds = data + self.layer = self.ds[layer] + + self.using = using if using is not None else router.db_for_write(model) + self.spatial_backend = connections[self.using].ops + + # Setting the mapping & model attributes. + self.mapping = mapping + self.model = model + + # Checking the layer -- initialization of the object will fail if + # things don't check out before hand. + self.check_layer() + + # Getting the geometry column associated with the model (an + # exception will be raised if there is no geometry column). + if connections[self.using].features.supports_transform: + self.geo_field = self.geometry_field() + else: + transform = False + + # Checking the source spatial reference system, and getting + # the coordinate transformation object (unless the `transform` + # keyword is set to False) + if transform: + self.source_srs = self.check_srs(source_srs) + self.transform = self.coord_transform() + else: + self.transform = transform + + # Setting the encoding for OFTString fields, if specified. + if encoding: + # Making sure the encoding exists, if not a LookupError + # exception will be thrown. + from codecs import lookup + lookup(encoding) + self.encoding = encoding + else: + self.encoding = None + + if unique: + self.check_unique(unique) + transaction_mode = 'autocommit' # Has to be set to autocommit. + self.unique = unique + else: + self.unique = None + + # Setting the transaction decorator with the function in the + # transaction modes dictionary. + self.transaction_mode = transaction_mode + if transaction_mode == 'autocommit': + self.transaction_decorator = None + elif transaction_mode == 'commit_on_success': + self.transaction_decorator = transaction.atomic + else: + raise LayerMapError('Unrecognized transaction mode: %s' % transaction_mode) + + # #### Checking routines used during initialization #### + def check_fid_range(self, fid_range): + "Check the `fid_range` keyword." + if fid_range: + if isinstance(fid_range, (tuple, list)): + return slice(*fid_range) + elif isinstance(fid_range, slice): + return fid_range + else: + raise TypeError + else: + return None + + def check_layer(self): + """ + Check the Layer metadata and ensure that it's compatible with the + mapping information and model. Unlike previous revisions, there is no + need to increment through each feature in the Layer. + """ + # The geometry field of the model is set here. + # TODO: Support more than one geometry field / model. However, this + # depends on the GDAL Driver in use. + self.geom_field = False + self.fields = {} + + # Getting lists of the field names and the field types available in + # the OGR Layer. + ogr_fields = self.layer.fields + ogr_field_types = self.layer.field_types + + # Function for determining if the OGR mapping field is in the Layer. + def check_ogr_fld(ogr_map_fld): + try: + idx = ogr_fields.index(ogr_map_fld) + except ValueError: + raise LayerMapError('Given mapping OGR field "%s" not found in OGR Layer.' % ogr_map_fld) + return idx + + # No need to increment through each feature in the model, simply check + # the Layer metadata against what was given in the mapping dictionary. + for field_name, ogr_name in self.mapping.items(): + # Ensuring that a corresponding field exists in the model + # for the given field name in the mapping. + try: + model_field = self.model._meta.get_field(field_name) + except FieldDoesNotExist: + raise LayerMapError('Given mapping field "%s" not in given Model fields.' % field_name) + + # Getting the string name for the Django field class (e.g., 'PointField'). + fld_name = model_field.__class__.__name__ + + if isinstance(model_field, GeometryField): + if self.geom_field: + raise LayerMapError('LayerMapping does not support more than one GeometryField per model.') + + # Getting the coordinate dimension of the geometry field. + coord_dim = model_field.dim + + try: + if coord_dim == 3: + gtype = OGRGeomType(ogr_name + '25D') + else: + gtype = OGRGeomType(ogr_name) + except GDALException: + raise LayerMapError('Invalid mapping for GeometryField "%s".' % field_name) + + # Making sure that the OGR Layer's Geometry is compatible. + ltype = self.layer.geom_type + if not (ltype.name.startswith(gtype.name) or self.make_multi(ltype, model_field)): + raise LayerMapError('Invalid mapping geometry; model has %s%s, ' + 'layer geometry type is %s.' % + (fld_name, '(dim=3)' if coord_dim == 3 else '', ltype)) + + # Setting the `geom_field` attribute w/the name of the model field + # that is a Geometry. Also setting the coordinate dimension + # attribute. + self.geom_field = field_name + self.coord_dim = coord_dim + fields_val = model_field + elif isinstance(model_field, models.ForeignKey): + if isinstance(ogr_name, dict): + # Is every given related model mapping field in the Layer? + rel_model = model_field.remote_field.model + for rel_name, ogr_field in ogr_name.items(): + idx = check_ogr_fld(ogr_field) + try: + rel_model._meta.get_field(rel_name) + except FieldDoesNotExist: + raise LayerMapError('ForeignKey mapping field "%s" not in %s fields.' % + (rel_name, rel_model.__class__.__name__)) + fields_val = rel_model + else: + raise TypeError('ForeignKey mapping must be of dictionary type.') + else: + # Is the model field type supported by LayerMapping? + if model_field.__class__ not in self.FIELD_TYPES: + raise LayerMapError('Django field type "%s" has no OGR mapping (yet).' % fld_name) + + # Is the OGR field in the Layer? + idx = check_ogr_fld(ogr_name) + ogr_field = ogr_field_types[idx] + + # Can the OGR field type be mapped to the Django field type? + if not issubclass(ogr_field, self.FIELD_TYPES[model_field.__class__]): + raise LayerMapError('OGR field "%s" (of type %s) cannot be mapped to Django %s.' % + (ogr_field, ogr_field.__name__, fld_name)) + fields_val = model_field + + self.fields[field_name] = fields_val + + def check_srs(self, source_srs): + "Check the compatibility of the given spatial reference object." + + if isinstance(source_srs, SpatialReference): + sr = source_srs + elif isinstance(source_srs, self.spatial_backend.spatial_ref_sys()): + sr = source_srs.srs + elif isinstance(source_srs, (int, str)): + sr = SpatialReference(source_srs) + else: + # Otherwise just pulling the SpatialReference from the layer + sr = self.layer.srs + + if not sr: + raise LayerMapError('No source reference system defined.') + else: + return sr + + def check_unique(self, unique): + "Check the `unique` keyword parameter -- may be a sequence or string." + if isinstance(unique, (list, tuple)): + # List of fields to determine uniqueness with + for attr in unique: + if attr not in self.mapping: + raise ValueError + elif isinstance(unique, str): + # Only a single field passed in. + if unique not in self.mapping: + raise ValueError + else: + raise TypeError('Unique keyword argument must be set with a tuple, list, or string.') + + # Keyword argument retrieval routines #### + def feature_kwargs(self, feat): + """ + Given an OGR Feature, return a dictionary of keyword arguments for + constructing the mapped model. + """ + # The keyword arguments for model construction. + kwargs = {} + + # Incrementing through each model field and OGR field in the + # dictionary mapping. + for field_name, ogr_name in self.mapping.items(): + model_field = self.fields[field_name] + + if isinstance(model_field, GeometryField): + # Verify OGR geometry. + try: + val = self.verify_geom(feat.geom, model_field) + except GDALException: + raise LayerMapError('Could not retrieve geometry from feature.') + elif isinstance(model_field, models.base.ModelBase): + # The related _model_, not a field was passed in -- indicating + # another mapping for the related Model. + val = self.verify_fk(feat, model_field, ogr_name) + else: + # Otherwise, verify OGR Field type. + val = self.verify_ogr_field(feat[ogr_name], model_field) + + # Setting the keyword arguments for the field name with the + # value obtained above. + kwargs[field_name] = val + + return kwargs + + def unique_kwargs(self, kwargs): + """ + Given the feature keyword arguments (from `feature_kwargs`), construct + and return the uniqueness keyword arguments -- a subset of the feature + kwargs. + """ + if isinstance(self.unique, str): + return {self.unique: kwargs[self.unique]} + else: + return {fld: kwargs[fld] for fld in self.unique} + + # #### Verification routines used in constructing model keyword arguments. #### + def verify_ogr_field(self, ogr_field, model_field): + """ + Verify if the OGR Field contents are acceptable to the model field. If + they are, return the verified value, otherwise raise an exception. + """ + if (isinstance(ogr_field, OFTString) and + isinstance(model_field, (models.CharField, models.TextField))): + if self.encoding: + # The encoding for OGR data sources may be specified here + # (e.g., 'cp437' for Census Bureau boundary files). + val = force_text(ogr_field.value, self.encoding) + else: + val = ogr_field.value + if model_field.max_length and len(val) > model_field.max_length: + raise InvalidString('%s model field maximum string length is %s, given %s characters.' % + (model_field.name, model_field.max_length, len(val))) + elif isinstance(ogr_field, OFTReal) and isinstance(model_field, models.DecimalField): + try: + # Creating an instance of the Decimal value to use. + d = Decimal(str(ogr_field.value)) + except DecimalInvalidOperation: + raise InvalidDecimal('Could not construct decimal from: %s' % ogr_field.value) + + # Getting the decimal value as a tuple. + dtup = d.as_tuple() + digits = dtup[1] + d_idx = dtup[2] # index where the decimal is + + # Maximum amount of precision, or digits to the left of the decimal. + max_prec = model_field.max_digits - model_field.decimal_places + + # Getting the digits to the left of the decimal place for the + # given decimal. + if d_idx < 0: + n_prec = len(digits[:d_idx]) + else: + n_prec = len(digits) + d_idx + + # If we have more than the maximum digits allowed, then throw an + # InvalidDecimal exception. + if n_prec > max_prec: + raise InvalidDecimal( + 'A DecimalField with max_digits %d, decimal_places %d must ' + 'round to an absolute value less than 10^%d.' % + (model_field.max_digits, model_field.decimal_places, max_prec) + ) + val = d + elif isinstance(ogr_field, (OFTReal, OFTString)) and isinstance(model_field, models.IntegerField): + # Attempt to convert any OFTReal and OFTString value to an OFTInteger. + try: + val = int(ogr_field.value) + except ValueError: + raise InvalidInteger('Could not construct integer from: %s' % ogr_field.value) + else: + val = ogr_field.value + return val + + def verify_fk(self, feat, rel_model, rel_mapping): + """ + Given an OGR Feature, the related model and its dictionary mapping, + retrieve the related model for the ForeignKey mapping. + """ + # TODO: It is expensive to retrieve a model for every record -- + # explore if an efficient mechanism exists for caching related + # ForeignKey models. + + # Constructing and verifying the related model keyword arguments. + fk_kwargs = {} + for field_name, ogr_name in rel_mapping.items(): + fk_kwargs[field_name] = self.verify_ogr_field(feat[ogr_name], rel_model._meta.get_field(field_name)) + + # Attempting to retrieve and return the related model. + try: + return rel_model.objects.using(self.using).get(**fk_kwargs) + except ObjectDoesNotExist: + raise MissingForeignKey( + 'No ForeignKey %s model found with keyword arguments: %s' % + (rel_model.__name__, fk_kwargs) + ) + + def verify_geom(self, geom, model_field): + """ + Verify the geometry -- construct and return a GeometryCollection + if necessary (for example if the model field is MultiPolygonField while + the mapped shapefile only contains Polygons). + """ + # Downgrade a 3D geom to a 2D one, if necessary. + if self.coord_dim != geom.coord_dim: + geom.coord_dim = self.coord_dim + + if self.make_multi(geom.geom_type, model_field): + # Constructing a multi-geometry type to contain the single geometry + multi_type = self.MULTI_TYPES[geom.geom_type.num] + g = OGRGeometry(multi_type) + g.add(geom) + else: + g = geom + + # Transforming the geometry with our Coordinate Transformation object, + # but only if the class variable `transform` is set w/a CoordTransform + # object. + if self.transform: + g.transform(self.transform) + + # Returning the WKT of the geometry. + return g.wkt + + # #### Other model methods #### + def coord_transform(self): + "Return the coordinate transformation object." + SpatialRefSys = self.spatial_backend.spatial_ref_sys() + try: + # Getting the target spatial reference system + target_srs = SpatialRefSys.objects.using(self.using).get(srid=self.geo_field.srid).srs + + # Creating the CoordTransform object + return CoordTransform(self.source_srs, target_srs) + except Exception as exc: + raise LayerMapError( + 'Could not translate between the data source and model geometry.' + ) from exc + + def geometry_field(self): + "Return the GeometryField instance associated with the geographic column." + # Use `get_field()` on the model's options so that we + # get the correct field instance if there's model inheritance. + opts = self.model._meta + return opts.get_field(self.geom_field) + + def make_multi(self, geom_type, model_field): + """ + Given the OGRGeomType for a geometry and its associated GeometryField, + determine whether the geometry should be turned into a GeometryCollection. + """ + return (geom_type.num in self.MULTI_TYPES and + model_field.__class__.__name__ == 'Multi%s' % geom_type.django) + + def save(self, verbose=False, fid_range=False, step=False, + progress=False, silent=False, stream=sys.stdout, strict=False): + """ + Save the contents from the OGR DataSource Layer into the database + according to the mapping dictionary given at initialization. + + Keyword Parameters: + verbose: + If set, information will be printed subsequent to each model save + executed on the database. + + fid_range: + May be set with a slice or tuple of (begin, end) feature ID's to map + from the data source. In other words, this keyword enables the user + to selectively import a subset range of features in the geographic + data source. + + step: + If set with an integer, transactions will occur at every step + interval. For example, if step=1000, a commit would occur after + the 1,000th feature, the 2,000th feature etc. + + progress: + When this keyword is set, status information will be printed giving + the number of features processed and successfully saved. By default, + progress information will pe printed every 1000 features processed, + however, this default may be overridden by setting this keyword with an + integer for the desired interval. + + stream: + Status information will be written to this file handle. Defaults to + using `sys.stdout`, but any object with a `write` method is supported. + + silent: + By default, non-fatal error notifications are printed to stdout, but + this keyword may be set to disable these notifications. + + strict: + Execution of the model mapping will cease upon the first error + encountered. The default behavior is to attempt to continue. + """ + # Getting the default Feature ID range. + default_range = self.check_fid_range(fid_range) + + # Setting the progress interval, if requested. + if progress: + if progress is True or not isinstance(progress, int): + progress_interval = 1000 + else: + progress_interval = progress + + def _save(feat_range=default_range, num_feat=0, num_saved=0): + if feat_range: + layer_iter = self.layer[feat_range] + else: + layer_iter = self.layer + + for feat in layer_iter: + num_feat += 1 + # Getting the keyword arguments + try: + kwargs = self.feature_kwargs(feat) + except LayerMapError as msg: + # Something borked the validation + if strict: + raise + elif not silent: + stream.write('Ignoring Feature ID %s because: %s\n' % (feat.fid, msg)) + else: + # Constructing the model using the keyword args + is_update = False + if self.unique: + # If we want unique models on a particular field, handle the + # geometry appropriately. + try: + # Getting the keyword arguments and retrieving + # the unique model. + u_kwargs = self.unique_kwargs(kwargs) + m = self.model.objects.using(self.using).get(**u_kwargs) + is_update = True + + # Getting the geometry (in OGR form), creating + # one from the kwargs WKT, adding in additional + # geometries, and update the attribute with the + # just-updated geometry WKT. + geom_value = getattr(m, self.geom_field) + if geom_value is None: + geom = OGRGeometry(kwargs[self.geom_field]) + else: + geom = geom_value.ogr + new = OGRGeometry(kwargs[self.geom_field]) + for g in new: + geom.add(g) + setattr(m, self.geom_field, geom.wkt) + except ObjectDoesNotExist: + # No unique model exists yet, create. + m = self.model(**kwargs) + else: + m = self.model(**kwargs) + + try: + # Attempting to save. + m.save(using=self.using) + num_saved += 1 + if verbose: + stream.write('%s: %s\n' % ('Updated' if is_update else 'Saved', m)) + except Exception as msg: + if strict: + # Bailing out if the `strict` keyword is set. + if not silent: + stream.write( + 'Failed to save the feature (id: %s) into the ' + 'model with the keyword arguments:\n' % feat.fid + ) + stream.write('%s\n' % kwargs) + raise + elif not silent: + stream.write('Failed to save %s:\n %s\nContinuing\n' % (kwargs, msg)) + + # Printing progress information, if requested. + if progress and num_feat % progress_interval == 0: + stream.write('Processed %d features, saved %d ...\n' % (num_feat, num_saved)) + + # Only used for status output purposes -- incremental saving uses the + # values returned here. + return num_saved, num_feat + + if self.transaction_decorator is not None: + _save = self.transaction_decorator(_save) + + nfeat = self.layer.num_feat + if step and isinstance(step, int) and step < nfeat: + # Incremental saving is requested at the given interval (step) + if default_range: + raise LayerMapError('The `step` keyword may not be used in conjunction with the `fid_range` keyword.') + beg, num_feat, num_saved = (0, 0, 0) + indices = range(step, nfeat, step) + n_i = len(indices) + + for i, end in enumerate(indices): + # Constructing the slice to use for this step; the last slice is + # special (e.g, [100:] instead of [90:100]). + if i + 1 == n_i: + step_slice = slice(beg, None) + else: + step_slice = slice(beg, end) + + try: + num_feat, num_saved = _save(step_slice, num_feat, num_saved) + beg = end + except Exception: # Deliberately catch everything + stream.write('%s\nFailed to save slice: %s\n' % ('=-' * 20, step_slice)) + raise + else: + # Otherwise, just calling the previously defined _save() function. + _save() diff --git a/venv/lib/python3.7/site-packages/django/contrib/gis/utils/ogrinspect.py b/venv/lib/python3.7/site-packages/django/contrib/gis/utils/ogrinspect.py new file mode 100644 index 0000000..f04974f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/gis/utils/ogrinspect.py @@ -0,0 +1,237 @@ +""" +This module is for inspecting OGR data sources and generating either +models for GeoDjango and/or mapping dictionaries for use with the +`LayerMapping` utility. +""" +from django.contrib.gis.gdal import DataSource +from django.contrib.gis.gdal.field import ( + OFTDate, OFTDateTime, OFTInteger, OFTInteger64, OFTReal, OFTString, + OFTTime, +) + + +def mapping(data_source, geom_name='geom', layer_key=0, multi_geom=False): + """ + Given a DataSource, generate a dictionary that may be used + for invoking the LayerMapping utility. + + Keyword Arguments: + `geom_name` => The name of the geometry field to use for the model. + + `layer_key` => The key for specifying which layer in the DataSource to use; + defaults to 0 (the first layer). May be an integer index or a string + identifier for the layer. + + `multi_geom` => Boolean (default: False) - specify as multigeometry. + """ + if isinstance(data_source, str): + # Instantiating the DataSource from the string. + data_source = DataSource(data_source) + elif isinstance(data_source, DataSource): + pass + else: + raise TypeError('Data source parameter must be a string or a DataSource object.') + + # Creating the dictionary. + _mapping = {} + + # Generating the field name for each field in the layer. + for field in data_source[layer_key].fields: + mfield = field.lower() + if mfield[-1:] == '_': + mfield += 'field' + _mapping[mfield] = field + gtype = data_source[layer_key].geom_type + if multi_geom: + gtype.to_multi() + _mapping[geom_name] = str(gtype).upper() + return _mapping + + +def ogrinspect(*args, **kwargs): + """ + Given a data source (either a string or a DataSource object) and a string + model name this function will generate a GeoDjango model. + + Usage: + + >>> from django.contrib.gis.utils import ogrinspect + >>> ogrinspect('/path/to/shapefile.shp','NewModel') + + ...will print model definition to stout + + or put this in a Python script and use to redirect the output to a new + model like: + + $ python generate_model.py > myapp/models.py + + # generate_model.py + from django.contrib.gis.utils import ogrinspect + shp_file = 'data/mapping_hacks/world_borders.shp' + model_name = 'WorldBorders' + + print(ogrinspect(shp_file, model_name, multi_geom=True, srid=4326, + geom_name='shapes', blank=True)) + + Required Arguments + `datasource` => string or DataSource object to file pointer + + `model name` => string of name of new model class to create + + Optional Keyword Arguments + `geom_name` => For specifying the model name for the Geometry Field. + Otherwise will default to `geom` + + `layer_key` => The key for specifying which layer in the DataSource to use; + defaults to 0 (the first layer). May be an integer index or a string + identifier for the layer. + + `srid` => The SRID to use for the Geometry Field. If it can be determined, + the SRID of the datasource is used. + + `multi_geom` => Boolean (default: False) - specify as multigeometry. + + `name_field` => String - specifies a field name to return for the + __str__() method (which will be generated if specified). + + `imports` => Boolean (default: True) - set to False to omit the + `from django.contrib.gis.db import models` code from the + autogenerated models thus avoiding duplicated imports when building + more than one model by batching ogrinspect() + + `decimal` => Boolean or sequence (default: False). When set to True + all generated model fields corresponding to the `OFTReal` type will + be `DecimalField` instead of `FloatField`. A sequence of specific + field names to generate as `DecimalField` may also be used. + + `blank` => Boolean or sequence (default: False). When set to True all + generated model fields will have `blank=True`. If the user wants to + give specific fields to have blank, then a list/tuple of OGR field + names may be used. + + `null` => Boolean (default: False) - When set to True all generated + model fields will have `null=True`. If the user wants to specify + give specific fields to have null, then a list/tuple of OGR field + names may be used. + + Note: Call the _ogrinspect() helper to do the heavy lifting. + """ + return '\n'.join(s for s in _ogrinspect(*args, **kwargs)) + + +def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=None, + multi_geom=False, name_field=None, imports=True, + decimal=False, blank=False, null=False): + """ + Helper routine for `ogrinspect` that generates GeoDjango models corresponding + to the given data source. See the `ogrinspect` docstring for more details. + """ + # Getting the DataSource + if isinstance(data_source, str): + data_source = DataSource(data_source) + elif isinstance(data_source, DataSource): + pass + else: + raise TypeError('Data source parameter must be a string or a DataSource object.') + + # Getting the layer corresponding to the layer key and getting + # a string listing of all OGR fields in the Layer. + layer = data_source[layer_key] + ogr_fields = layer.fields + + # Creating lists from the `null`, `blank`, and `decimal` + # keyword arguments. + def process_kwarg(kwarg): + if isinstance(kwarg, (list, tuple)): + return [s.lower() for s in kwarg] + elif kwarg: + return [s.lower() for s in ogr_fields] + else: + return [] + null_fields = process_kwarg(null) + blank_fields = process_kwarg(blank) + decimal_fields = process_kwarg(decimal) + + # Gets the `null` and `blank` keywords for the given field name. + def get_kwargs_str(field_name): + kwlist = [] + if field_name.lower() in null_fields: + kwlist.append('null=True') + if field_name.lower() in blank_fields: + kwlist.append('blank=True') + if kwlist: + return ', ' + ', '.join(kwlist) + else: + return '' + + # For those wishing to disable the imports. + if imports: + yield '# This is an auto-generated Django model module created by ogrinspect.' + yield 'from django.contrib.gis.db import models' + yield '' + yield '' + + yield 'class %s(models.Model):' % model_name + + for field_name, width, precision, field_type in zip( + ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types): + # The model field name. + mfield = field_name.lower() + if mfield[-1:] == '_': + mfield += 'field' + + # Getting the keyword args string. + kwargs_str = get_kwargs_str(field_name) + + if field_type is OFTReal: + # By default OFTReals are mapped to `FloatField`, however, they + # may also be mapped to `DecimalField` if specified in the + # `decimal` keyword. + if field_name.lower() in decimal_fields: + yield ' %s = models.DecimalField(max_digits=%d, decimal_places=%d%s)' % ( + mfield, width, precision, kwargs_str + ) + else: + yield ' %s = models.FloatField(%s)' % (mfield, kwargs_str[2:]) + elif field_type is OFTInteger: + yield ' %s = models.IntegerField(%s)' % (mfield, kwargs_str[2:]) + elif field_type is OFTInteger64: + yield ' %s = models.BigIntegerField(%s)' % (mfield, kwargs_str[2:]) + elif field_type is OFTString: + yield ' %s = models.CharField(max_length=%s%s)' % (mfield, width, kwargs_str) + elif field_type is OFTDate: + yield ' %s = models.DateField(%s)' % (mfield, kwargs_str[2:]) + elif field_type is OFTDateTime: + yield ' %s = models.DateTimeField(%s)' % (mfield, kwargs_str[2:]) + elif field_type is OFTTime: + yield ' %s = models.TimeField(%s)' % (mfield, kwargs_str[2:]) + else: + raise TypeError('Unknown field type %s in %s' % (field_type, mfield)) + + # TODO: Autodetection of multigeometry types (see #7218). + gtype = layer.geom_type + if multi_geom: + gtype.to_multi() + geom_field = gtype.django + + # Setting up the SRID keyword string. + if srid is None: + if layer.srs is None: + srid_str = 'srid=-1' + else: + srid = layer.srs.srid + if srid is None: + srid_str = 'srid=-1' + elif srid == 4326: + # WGS84 is already the default. + srid_str = '' + else: + srid_str = 'srid=%s' % srid + else: + srid_str = 'srid=%s' % srid + + yield ' %s = models.%s(%s)' % (geom_name, geom_field, srid_str) + + if name_field: + yield '' + yield ' def __str__(self): return self.%s' % name_field diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/humanize/__init__.py new file mode 100644 index 0000000..9ca1642 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/__init__.py @@ -0,0 +1 @@ +default_app_config = 'django.contrib.humanize.apps.HumanizeConfig' diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po new file mode 100644 index 0000000..55bf160 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/af/LC_MESSAGES/django.po @@ -0,0 +1,394 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# F Wolff , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-04 18:11+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"af/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanise" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}de" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}ste" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}ste" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f miljoen" +msgstr[1] "%(value).1f miljoen" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s miljoen" +msgstr[1] "%(value)s miljoen" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miljard" +msgstr[1] "%(value).1f miljard" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miljard" +msgstr[1] "%(value)s miljard" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f biljoen" +msgstr[1] "%(value).1f biljoen" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s biljoen" +msgstr[1] "%(value)s biljoen" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f biljard" +msgstr[1] "%(value).1f biljard" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s biljard" +msgstr[1] "%(value)s biljard" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f triljoen" +msgstr[1] "%(value).1f triljoen" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s triljoen" +msgstr[1] "%(value)s triljoen" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f triljard" +msgstr[1] "%(value).1f triljard" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s triljard" +msgstr[1] "%(value)s triljard" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kwadriljoen" +msgstr[1] "%(value).1f kwadriljoen" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kwadriljoen" +msgstr[1] "%(value)s kwadriljoen" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kwadriljard" +msgstr[1] "%(value).1f kwadriljard" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kwadriljard" +msgstr[1] "%(value)s kwadriljard" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kwintiljoen" +msgstr[1] "%(value).1f kwintiljoen" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kwintiljoen" +msgstr[1] "%(value)s kwintiljoen" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kwinteljard" +msgstr[1] "%(value).1f kwinteljard" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kwinteljard" +msgstr[1] "%(value)s kwinteljard" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "" +msgstr[1] "" + +msgid "one" +msgstr "een" + +msgid "two" +msgstr "twee" + +msgid "three" +msgstr "drie" + +msgid "four" +msgstr "vier" + +msgid "five" +msgstr "vyf" + +msgid "six" +msgstr "ses" + +msgid "seven" +msgstr "sewe" + +msgid "eight" +msgstr "agt" + +msgid "nine" +msgstr "nege" + +msgid "today" +msgstr "vandag" + +msgid "tomorrow" +msgstr "môre" + +msgid "yesterday" +msgstr "gister" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s gelede" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "’n uur gelede" +msgstr[1] "%(count)s ure gelede" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "’n minuut gelede" +msgstr[1] "%(count)s minute gelede" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "’n sekonde gelede" +msgstr[1] "%(count)s sekondes gelede" + +msgid "now" +msgstr "nou" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "oor ’n sekonde" +msgstr[1] "oor %(count)s sekondes" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "oor ’n minuut" +msgstr[1] "%(count)s minute van nou af" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "oor ’n uur" +msgstr[1] "oor %(count)s ure" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "oor %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaar" +msgstr[1] "%d jare" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d maand" +msgstr[1] "%d maande" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d week" +msgstr[1] "%d weke" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dae" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d uur" +msgstr[1] "%d ure" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuut" +msgstr[1] "%d minute" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaar" +msgstr[1] "%d jaar" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d maand" +msgstr[1] "%d maande" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d week" +msgstr[1] "%d weke" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dae" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d uur" +msgstr[1] "%d ure" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuut" +msgstr[1] "%d minute" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po new file mode 100644 index 0000000..50f4794 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ast/LC_MESSAGES/django.po @@ -0,0 +1,262 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ḷḷumex03 , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 19:51+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Asturian (http://www.transifex.com/django/django/language/" +"ast/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "ᵘ" + +msgid "st" +msgstr "ᵘ" + +msgid "nd" +msgstr "ᵘ" + +msgid "rd" +msgstr "ᵘ" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f millón" +msgstr[1] "%(value).1f millones" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s millón" +msgstr[1] "%(value)s millones" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f billón" +msgstr[1] "%(value).1f billones" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s billón" +msgstr[1] "%(value)s billones" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f trillón" +msgstr[1] "%(value).1f trillones" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s trillón" +msgstr[1] "%(value)s trillones" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f cuatrillón" +msgstr[1] "%(value).1f cuatrillones" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s cuatrillón" +msgstr[1] "%(value)s cuatrillones" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f quintillón" +msgstr[1] "%(value).1f quintillones" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s quintillón" +msgstr[1] "%(value)s quintillones" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextillón" +msgstr[1] "%(value).1f sextillones" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextillón" +msgstr[1] "%(value)s sextillones" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septillón" +msgstr[1] "%(value).1f septillones" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septillón" +msgstr[1] "%(value)s septillones" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octillón" +msgstr[1] "%(value).1f octillones" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octillón" +msgstr[1] "%(value)s octillones" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonillón" +msgstr[1] "%(value).1f nonillones" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonillón" +msgstr[1] "%(value)s nonillones" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f decillón" +msgstr[1] "%(value).1f decillones" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s decillón" +msgstr[1] "%(value)s decillones" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f gúgol" +msgstr[1] "%(value).1f gúgol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s gúgol" +msgstr[1] "%(value)s gúgol" + +msgid "one" +msgstr "un" + +msgid "two" +msgstr "dos" + +msgid "three" +msgstr "trés" + +msgid "four" +msgstr "cuatro" + +msgid "five" +msgstr "cinco" + +msgid "six" +msgstr "seis" + +msgid "seven" +msgstr "siete" + +msgid "eight" +msgstr "ocho" + +msgid "nine" +msgstr "nueve" + +msgid "today" +msgstr "güei" + +msgid "tomorrow" +msgstr "mañana" + +msgid "yesterday" +msgstr "ayeri" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "hai %(delta)s" + +msgid "now" +msgstr "agora" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s dende agora" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po new file mode 100644 index 0000000..03beb52 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/be/LC_MESSAGES/django.po @@ -0,0 +1,320 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2014-2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Viktar Palstsiuk \n" +"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"be/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "Humanize" +msgstr "Ачалавечваньне" + +msgid "th" +msgstr "-ы" + +msgid "st" +msgstr "-ы" + +msgid "nd" +msgstr "-і" + +msgid "rd" +msgstr "-і" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f мільён" +msgstr[1] "%(value).1f мільёны" +msgstr[2] "%(value).1f мільёнаў" +msgstr[3] "%(value).1f мільёнаў" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s мільён" +msgstr[1] "%(value)s мільёны" +msgstr[2] "%(value)s мільёнаў" +msgstr[3] "%(value)s мільёнаў" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f мільярд" +msgstr[1] "%(value).1f мільярды" +msgstr[2] "%(value).1f мільярдаў" +msgstr[3] "%(value).1f мільярдаў" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value).s мільярд" +msgstr[1] "%(value)s мільярды" +msgstr[2] "%(value)s мільярдаў" +msgstr[3] "%(value)s мільярдаў" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f трыльён" +msgstr[1] "%(value).1f трыльёны" +msgstr[2] "%(value).1f трыльёнаў" +msgstr[3] "%(value).1f трыльёнаў" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s трыльён" +msgstr[1] "%(value)s трыльёны" +msgstr[2] "%(value)s трыльёнаў" +msgstr[3] "%(value)s трыльёнаў" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f квадрыльён" +msgstr[1] "%(value).1f квадрыльёны" +msgstr[2] "%(value).1f квадрыльёнаў" +msgstr[3] "%(value).1f квадрыльёнаў" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s квадрыльён" +msgstr[1] "%(value)s квадрыльёны" +msgstr[2] "%(value)s квадрыльёнаў" +msgstr[3] "%(value)s квадрыльёнаў" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f квінтыльён" +msgstr[1] "%(value).1f квінтыльёны" +msgstr[2] "%(value).1f квінтыльёнаў" +msgstr[3] "%(value).1f квінтыльёнаў" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s квінтыльён" +msgstr[1] "%(value)s квінтыльёны" +msgstr[2] "%(value)s квінтыльёнаў" +msgstr[3] "%(value)s квінтыльёнаў" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f сэкстыльён" +msgstr[1] "%(value).1f сэкстыльёны" +msgstr[2] "%(value).1f сэкстыльёнаў" +msgstr[3] "%(value).1f сэкстыльёнаў" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s сэкстыльён" +msgstr[1] "%(value)s сэкстыльёны" +msgstr[2] "%(value)s сэкстыльёнаў" +msgstr[3] "%(value)s сэкстыльёнаў" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f сэптыльён" +msgstr[1] "%(value).1f сэптыльёны" +msgstr[2] "%(value).1f сэптыльёнаў" +msgstr[3] "%(value).1f сэптыльёнаў" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s сэптыльён" +msgstr[1] "%(value)s сэптыльёны" +msgstr[2] "%(value)s сэптыльёнаў" +msgstr[3] "%(value)s сэптыльёнаў" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f актыльён" +msgstr[1] "%(value).1f актыльёны" +msgstr[2] "%(value).1f актыльёнаў" +msgstr[3] "%(value).1f актыльёнаў" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s актыльён" +msgstr[1] "%(value)s актыльёны" +msgstr[2] "%(value)s актыльёнаў" +msgstr[3] "%(value)s актыльёнаў" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f нанільён" +msgstr[1] "%(value).1f нанільёны" +msgstr[2] "%(value).1f нанільёнаў" +msgstr[3] "%(value).1f нанільёнаў" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s нанільён" +msgstr[1] "%(value)s нанільёны" +msgstr[2] "%(value)s нанільёнаў" +msgstr[3] "%(value)s нанільёнаў" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f дэцыльён" +msgstr[1] "%(value).1f дэцыльёны" +msgstr[2] "%(value).1f дэцыльёнаў" +msgstr[3] "%(value).1f дэцыльёнаў" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s дэцыльён" +msgstr[1] "%(value)s дэцыльёны" +msgstr[2] "%(value)s дэцыльёнаў" +msgstr[3] "%(value)s дэцыльёнаў" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f ґуґал" +msgstr[1] "%(value).1f ґуґлы" +msgstr[2] "%(value).1f ґуґлаў" +msgstr[3] "%(value).1f ґуґлаў" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s ґуґал" +msgstr[1] "%(value)s ґуґлы" +msgstr[2] "%(value)s ґуґлаў" +msgstr[3] "%(value)s ґуґлаў" + +msgid "one" +msgstr "адзін" + +msgid "two" +msgstr "два" + +msgid "three" +msgstr "тры" + +msgid "four" +msgstr "чатыры" + +msgid "five" +msgstr "пяць" + +msgid "six" +msgstr "шэсьць" + +msgid "seven" +msgstr "сем" + +msgid "eight" +msgstr "восем" + +msgid "nine" +msgstr "дзевяць" + +msgid "today" +msgstr "сёньня" + +msgid "tomorrow" +msgstr "заўтра" + +msgid "yesterday" +msgstr "ўчора" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "%(delta)s таму" + +msgid "now" +msgstr "зараз" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "%(count)s сэкунду таму" +msgstr[1] "%(count)s сэкунды таму" +msgstr[2] "%(count)s сэкундаў таму" +msgstr[3] "%(count)s сэкундаў таму" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "%(count)s хвіліну таму" +msgstr[1] "%(count)s хвіліны таму" +msgstr[2] "%(count)s хвілінаў таму" +msgstr[3] "%(count)s хвілінаў таму" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "%(count)s гадзіну таму" +msgstr[1] "%(count)s гадзіны таму" +msgstr[2] "%(count)s гадзінаў таму" +msgstr[3] "%(count)s гадзінаў таму" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "праз %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "праз %(count)s сэкунду" +msgstr[1] "праз %(count)s сэкунды" +msgstr[2] "праз %(count)s сэкундаў" +msgstr[3] "праз %(count)s сэкундаў" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "праз %(count)s хвіліну" +msgstr[1] "праз %(count)s хвіліны" +msgstr[2] "праз %(count)s хвілінаў" +msgstr[3] "праз %(count)s хвілінаў" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "праз %(count)s гадзіну" +msgstr[1] "праз %(count)s гадзіны" +msgstr[2] "праз %(count)s гадзінаў" +msgstr[3] "праз %(count)s гадзінаў" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..994549d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,265 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Georgi Kostadinov , 2012 +# Jannis Leidel , 2011 +# Todor Lubenov , 2011,2015 +# Venelin Stoykov , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Venelin Stoykov \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Облагородявам" + +msgid "th" +msgstr "и" + +msgid "st" +msgstr "ви" + +msgid "nd" +msgstr "ри" + +msgid "rd" +msgstr "ти" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f милион" +msgstr[1] "%(value).1f милиона" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s милион" +msgstr[1] "%(value)s милиона" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f милиард" +msgstr[1] "%(value).1f милиарда" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s милиард" +msgstr[1] "%(value)s милиарда" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f трилион" +msgstr[1] "%(value).1f трилиона" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s трилион" +msgstr[1] "%(value)s трилиона" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f квадрилион" +msgstr[1] "%(value).1f квадрилиона" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s квадрилион" +msgstr[1] "%(value)s квадрилиона" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f квинтилион" +msgstr[1] "%(value).1f квинтилиона" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s квинтилион" +msgstr[1] "%(value)s квинтилиона" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f секстилион" +msgstr[1] "%(value).1f секстилиона" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s секстилион" +msgstr[1] "%(value)s секстилиона" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f септилион" +msgstr[1] "%(value).1f септилиона" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s септилион" +msgstr[1] "%(value)s септилиона" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f октилион" +msgstr[1] "%(value).1f октилиона" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s октилион" +msgstr[1] "%(value)s октилиона" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f нонилион" +msgstr[1] "%(value).1f нонилиона" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s нонилион" +msgstr[1] "%(value)s нонилиона" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f децилион" +msgstr[1] "%(value).1f децилиона" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s децилион" +msgstr[1] "%(value)s децилиона" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f гугол" +msgstr[1] "%(value).1f гугола" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s гугол" +msgstr[1] "%(value)s гугола" + +msgid "one" +msgstr "един" + +msgid "two" +msgstr "два" + +msgid "three" +msgstr "три" + +msgid "four" +msgstr "четири" + +msgid "five" +msgstr "пет" + +msgid "six" +msgstr "шест" + +msgid "seven" +msgstr "седем" + +msgid "eight" +msgstr "осем" + +msgid "nine" +msgstr "девет" + +msgid "today" +msgstr "днес" + +msgid "tomorrow" +msgstr "Утре" + +msgid "yesterday" +msgstr "вчера" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "преди %(delta)s" + +msgid "now" +msgstr "сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "преди секунда" +msgstr[1] "преди %(count)s секунди" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "преди минута" +msgstr[1] "преди %(count)s минути" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "преди един час" +msgstr[1] "преди %(count)s часа" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s от сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "след секунда" +msgstr[1] "%(count)s секунди от сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "след минута" +msgstr[1] "%(count)s минути от сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "след един час" +msgstr[1] "%(count)s часа от сега" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..042122a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..51108e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,292 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Filip Dupanović , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "-i" + +msgid "st" +msgstr "-vi" + +msgid "nd" +msgstr "-i" + +msgid "rd" +msgstr "-i" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f million" +msgstr[1] "%(value).1f miliona" +msgstr[2] "%(value).1f miliona" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milijarda" +msgstr[1] "%(value).1f milijarde" +msgstr[2] "%(value).1f milijardi" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f bilion" +msgstr[1] "%(value).1f biliona" +msgstr[2] "%(value).1f biliona" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "one" +msgstr "jedan" + +msgid "two" +msgstr "dva" + +msgid "three" +msgstr "tri" + +msgid "four" +msgstr "četiri" + +msgid "five" +msgstr "pet" + +msgid "six" +msgstr "šest" + +msgid "seven" +msgstr "sedam" + +msgid "eight" +msgstr "osam" + +msgid "nine" +msgstr "devet" + +msgid "today" +msgstr "deset" + +msgid "tomorrow" +msgstr "sutra" + +msgid "yesterday" +msgstr "jučer" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "" + +msgid "now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ecb63f3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..f59065b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,476 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Vláďa Macek , 2011,2014 +# Vláďa Macek , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-07-15 17:56+0000\n" +"Last-Translator: Vláďa Macek \n" +"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " +"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +msgid "Humanize" +msgstr "Polidštění" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milion" +msgstr[1] "%(value).1f miliony" +msgstr[2] "%(value).1f milionů" +msgstr[3] "%(value).1f milionů" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] " %(value)s milion" +msgstr[1] " %(value)s miliony" +msgstr[2] " %(value)s milionů" +msgstr[3] " %(value)s milionů" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miliarda" +msgstr[1] "%(value).1f miliardy" +msgstr[2] "%(value).1f miliard" +msgstr[3] "%(value).1f miliard" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miliarda" +msgstr[1] "%(value)s miliardy" +msgstr[2] "%(value)s miliard" +msgstr[3] "%(value)s miliard" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f bilion" +msgstr[1] "%(value).1f biliony" +msgstr[2] "%(value).1f bilionů" +msgstr[3] "%(value).1f bilionů" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s bilion" +msgstr[1] "%(value)s biliony" +msgstr[2] "%(value)s bilionů" +msgstr[3] "%(value)s bilionů" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f biliarda" +msgstr[1] "%(value).1f biliardy" +msgstr[2] "%(value).1f biliard" +msgstr[3] "%(value).1f biliard" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s biliarda" +msgstr[1] "%(value)s biliardy" +msgstr[2] "%(value)s biliard" +msgstr[3] "%(value)s biliard" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f trilion" +msgstr[1] "%(value).1f triliony" +msgstr[2] "%(value).1f trilionů" +msgstr[3] "%(value).1f trilionů" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s trilion" +msgstr[1] "%(value)s triliony" +msgstr[2] "%(value)s trilionů" +msgstr[3] "%(value)s trilionů" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f triliarda" +msgstr[1] "%(value).1f triliardy" +msgstr[2] "%(value).1f triliard" +msgstr[3] "%(value).1f triliard" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s triliarda" +msgstr[1] "%(value)s triliardy" +msgstr[2] "%(value)s triliard" +msgstr[3] "%(value)s triliard" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kvadrilion" +msgstr[1] "%(value).1f kvadriliony" +msgstr[2] "%(value).1f kvadrilionů" +msgstr[3] "%(value).1f kvadrilionů" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kvadrilion" +msgstr[1] "%(value)s kvadriliony" +msgstr[2] "%(value)s kvadrilionů" +msgstr[3] "%(value)s kvadrilionů" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kvadriliarda" +msgstr[1] "%(value).1f kvadriliardy" +msgstr[2] "%(value).1f kvadriliard" +msgstr[3] "%(value).1f kvadriliard" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kvadriliarda" +msgstr[1] "%(value)s kvadriliardy" +msgstr[2] "%(value)s kvadriliard" +msgstr[3] "%(value)s kvadriliard" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kvintilion" +msgstr[1] "%(value).1f kvintiliony" +msgstr[2] "%(value).1f kvintilionů" +msgstr[3] "%(value).1f kvintilionů" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kvintilion" +msgstr[1] "%(value)s kvintiliony" +msgstr[2] "%(value)s kvintilionů" +msgstr[3] "%(value)s kvintilionů" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kvintiliarda" +msgstr[1] "%(value).1f kvintiliardy" +msgstr[2] "%(value).1f kvintiliard" +msgstr[3] "%(value).1f kvintiliard" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kvintiliarda" +msgstr[1] "%(value)s kvintiliardy" +msgstr[2] "%(value)s kvintiliard" +msgstr[3] "%(value)s kvintiliard" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googoly" +msgstr[2] "%(value).1f googolů" +msgstr[3] "%(value).1f googolů" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googoly" +msgstr[2] "%(value)s googolů" +msgstr[3] "%(value)s googolů" + +msgid "one" +msgstr "jedna" + +msgid "two" +msgstr "dvě" + +msgid "three" +msgstr "tři" + +msgid "four" +msgstr "čtyři" + +msgid "five" +msgstr "pět" + +msgid "six" +msgstr "šest" + +msgid "seven" +msgstr "sedm" + +msgid "eight" +msgstr "osm" + +msgid "nine" +msgstr "devět" + +msgid "today" +msgstr "dnes" + +msgid "tomorrow" +msgstr "zítra" + +msgid "yesterday" +msgstr "včera" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "před %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "před hodinou" +msgstr[1] "před %(count)s hodinami" +msgstr[2] "před %(count)s hodinami" +msgstr[3] "před %(count)s hodinami" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "před minutou" +msgstr[1] "před %(count)s minutami" +msgstr[2] "před %(count)s minutami" +msgstr[3] "před %(count)s minutami" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "před sekundou" +msgstr[1] "před %(count)s sekundami" +msgstr[2] "před %(count)s sekundami" +msgstr[3] "před %(count)s sekundami" + +msgid "now" +msgstr "nyní" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "za sekundu" +msgstr[1] "za %(count)s sekundy" +msgstr[2] "za %(count)s sekund" +msgstr[3] "za %(count)s sekund" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "za minutu" +msgstr[1] "za %(count)s minuty" +msgstr[2] "za %(count)s minut" +msgstr[3] "za %(count)s minut" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "za hodinu" +msgstr[1] "za %(count)s hodiny" +msgstr[2] "za %(count)s hodin" +msgstr[3] "za %(count)s hodin" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "za %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d rokem" +msgstr[1] "%d lety" +msgstr[2] "%d lety" +msgstr[3] "%d lety" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d měsícem" +msgstr[1] "%d měsíci" +msgstr[2] "%d měsíci" +msgstr[3] "%d měsíci" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d týdnem" +msgstr[1] "%d týdny" +msgstr[2] "%d týdny" +msgstr[3] "%d týdny" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dnem" +msgstr[1] "%d dny" +msgstr[2] "%d dny" +msgstr[3] "%d dny" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hodinou" +msgstr[1] "%d hodinami" +msgstr[2] "%d hodinami" +msgstr[3] "%d hodinami" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minutou" +msgstr[1] "%d minutami" +msgstr[2] "%d minutami" +msgstr[3] "%d minutami" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d rok" +msgstr[1] "%d roky" +msgstr[2] "%d let" +msgstr[3] "%d let" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d měsíc" +msgstr[1] "%d měsíce" +msgstr[2] "%d měsíců" +msgstr[3] "%d měsíců" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d týden" +msgstr[1] "%d týdny" +msgstr[2] "%d týdnů" +msgstr[3] "%d týdnů" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d den" +msgstr[1] "%d dny" +msgstr[2] "%d dní" +msgstr[3] "%d dní" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hodina" +msgstr[1] "%d hodiny" +msgstr[2] "%d hodin" +msgstr[3] "%d hodin" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuta" +msgstr[1] "%d minuty" +msgstr[2] "%d minut" +msgstr[3] "%d minut" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..1feefe0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,396 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Christian Joergensen , 2012 +# Erik Wognsen , 2014,2018 +# Jannis Leidel , 2011 +# valberg , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-05-18 21:12+0000\n" +"Last-Translator: Erik Wognsen \n" +"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Menneskeliggør" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f million" +msgstr[1] "%(value).1f millioner" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s million" +msgstr[1] "%(value)s millioner" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milliard" +msgstr[1] "%(value).1f milliarder" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s milliard" +msgstr[1] "%(value)s milliarder" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billion" +msgstr[1] "%(value).1f billioner" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billion" +msgstr[1] "%(value)s billioner" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f billiard" +msgstr[1] "%(value).1f billiarder" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s billiard" +msgstr[1] "%(value)s billiarder" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f trillion" +msgstr[1] "%(value).1f trillioner" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s trillion" +msgstr[1] "%(value)s trillioner" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f trilliard" +msgstr[1] "%(value).1f trilliarder" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s trilliard" +msgstr[1] "%(value)s trilliarder" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kvadrillion" +msgstr[1] "%(value).1f kvadrillioner" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kvadrillion" +msgstr[1] "%(value)s kvadrillioner" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kvadrilliard" +msgstr[1] "%(value).1f kvadrilliarder" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kvadrilliard" +msgstr[1] "%(value)s kvadrilliarder" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kvintillion" +msgstr[1] "%(value).1f kvintillioner" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kvintillion" +msgstr[1] "%(value)s kvintillioner" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kvintilliard" +msgstr[1] "%(value).1f kvintilliarder" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kvintilliard" +msgstr[1] "%(value)s kvintilliarder" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f gogol" +msgstr[1] "%(value).1f gogoler" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s gogol" +msgstr[1] "%(value)s gogoler" + +msgid "one" +msgstr "en" + +msgid "two" +msgstr "to" + +msgid "three" +msgstr "tre" + +msgid "four" +msgstr "fire" + +msgid "five" +msgstr "fem" + +msgid "six" +msgstr "seks" + +msgid "seven" +msgstr "syv" + +msgid "eight" +msgstr "otte" + +msgid "nine" +msgstr "ni" + +msgid "today" +msgstr "i dag" + +msgid "tomorrow" +msgstr "i morgen" + +msgid "yesterday" +msgstr "i går" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s siden" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "en time siden" +msgstr[1] "%(count)s timer siden" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "et minut siden" +msgstr[1] "%(count)s minutter siden" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "et sekund siden" +msgstr[1] "%(count)s sekunder siden" + +msgid "now" +msgstr "nu" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "om et sekund" +msgstr[1] "om %(count)s sekunder" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "om et minut" +msgstr[1] "om %(count)s minutter" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "om en time" +msgstr[1] "om %(count)s timer" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s fra nu af" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d måned" +msgstr[1] "%d måneder" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d uge" +msgstr[1] "%d uger" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dage" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minutter" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d måned" +msgstr[1] "%d måneder" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d uge" +msgstr[1] "%d uger" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dage" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d time" +msgstr[1] "%d timer" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minutter" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bc66b48 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..90d90f0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,395 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Hagenbruch, 2011 +# Claude Paroz , 2013 +# Jannis Leidel , 2011,2013-2014,2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-08-14 08:29+0000\n" +"Last-Translator: Florian Apolloner \n" +"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanize" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f Million" +msgstr[1] "%(value).1f Millionen" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s Million" +msgstr[1] "%(value)s Millionen" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f Milliarde" +msgstr[1] "%(value).1f Milliarden" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s Milliarde" +msgstr[1] "%(value)s Milliarden" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f Billion" +msgstr[1] "%(value).1f Billionen" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s Billion" +msgstr[1] "%(value)s Billionen" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f Billiarde" +msgstr[1] "%(value).1f Billiarden" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s Billiarde" +msgstr[1] "%(value)s Billiarden" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f Trillion" +msgstr[1] "%(value).1f Trillionen" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s Trillion" +msgstr[1] "%(value)s Trillionen" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f Trilliarde" +msgstr[1] "%(value).1f Trilliarden" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s Trilliarde" +msgstr[1] "%(value)s Trilliarden" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f Quadrillion" +msgstr[1] "%(value).1f Quadrillionen" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s Quadrillion" +msgstr[1] "%(value)s Quadrillionen" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f Quadrilliarde" +msgstr[1] "%(value).1f Quadrilliarden" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s Quadrilliarde" +msgstr[1] "%(value)s Quadrilliarden" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f Quintillion" +msgstr[1] "%(value).1f Quintillionen" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s Quintillion" +msgstr[1] "%(value)s Quintillionen" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f Quintilliarde" +msgstr[1] "%(value).1f Quintilliarden" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s Quintilliarde" +msgstr[1] "%(value)s Quintilliarden" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f Sedezilliarde" +msgstr[1] "%(value).1f Sedezilliarden" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s Sedezilliarde" +msgstr[1] "%(value)s Sedezilliarden" + +msgid "one" +msgstr "eins" + +msgid "two" +msgstr "zwei" + +msgid "three" +msgstr "drei" + +msgid "four" +msgstr "vier" + +msgid "five" +msgstr "fünf" + +msgid "six" +msgstr "sechs" + +msgid "seven" +msgstr "sieben" + +msgid "eight" +msgstr "acht" + +msgid "nine" +msgstr "neun" + +msgid "today" +msgstr "heute" + +msgid "tomorrow" +msgstr "morgen" + +msgid "yesterday" +msgstr "gestern" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s her" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "vor einer Stunde" +msgstr[1] "vor %(count)s Stunden" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "vor einer Minute" +msgstr[1] "vor %(count)s Minuten" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "vor einer Sekunde" +msgstr[1] "vor %(count)s Sekunden" + +msgid "now" +msgstr "jetzt" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "in einer Sekunde" +msgstr[1] "in %(count)s Sekunden" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "in einer Minute" +msgstr[1] "in %(count)s Minuten" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "in einer Stunde" +msgstr[1] "in %(count)s Stunden" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s von jetzt an" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d Jahr" +msgstr[1] "%d Jahre" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d Monat" +msgstr[1] "%d Monate" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d Woche" +msgstr[1] "%d Wochen" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d Tag" +msgstr[1] "%d Tage" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d Stunde" +msgstr[1] "%d Stunden" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d Minute" +msgstr[1] "%d Minuten" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d Jahr" +msgstr[1] "%d Jahre" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d Monat" +msgstr[1] "%d Monate" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d Woche" +msgstr[1] "%d Wochen" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d Tag" +msgstr[1] "%d Tage" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d Stunde" +msgstr[1] "%d Stunden" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d Minute" +msgstr[1] "%d Minuten" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5b4868f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po new file mode 100644 index 0000000..6f1d0aa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,398 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Dimitris Glezos , 2011 +# Jannis Leidel , 2011 +# Kostas Papadimitriou , 2012 +# Nick Mavrakis , 2018 +# Nikolas Demiridis , 2014 +# Pãnoș , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-09-22 10:19+0000\n" +"Last-Translator: Nick Mavrakis \n" +"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Εξανθρώπιση" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}ο" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}ο" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f εκατομμύριο" +msgstr[1] "%(value).1f εκατομμύρια" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] " %(value)s εκατομμύριο" +msgstr[1] " %(value)s εκατομμύρια" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f δισεκατομμύριο" +msgstr[1] "%(value).1f δισεκατομμύρια" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s δισεκατομμύριο" +msgstr[1] "%(value)s δισεκατομμύρια" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f τρισεκατομμύριο" +msgstr[1] "%(value).1f τρισεκατομμύρια" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s τρισεκατομμύριο" +msgstr[1] "%(value)s τρισεκατομμύρια" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f τετράκις εκατομμύριο" +msgstr[1] "%(value).1f τετράκις εκατομμύρια" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s τετράκις εκατομμύριο" +msgstr[1] "%(value)s τετράκις εκατομμύρια" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f πεντάκις εκατομμύριo" +msgstr[1] "%(value).1f πεντάκις εκατομμύρια" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s πεντάκις εκατομμύριo" +msgstr[1] "%(value)s πεντάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f εξάκις εκατομμύριo" +msgstr[1] "%(value).1f εξάκις εκατομμύρια" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s εξάκις εκατομμύριo" +msgstr[1] "%(value)s εξάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f επτάκις εκατομμύριο" +msgstr[1] "%(value).1f επτάκις εκατομμύρια" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s επτάκις εκατομμύριο" +msgstr[1] "%(value)s επτάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f οκτάκις εκατομμύριο" +msgstr[1] "%(value).1f οκτάκις εκατομμύρια" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s οκτάκις εκατομμύριο" +msgstr[1] "%(value)s οκτάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f εννεάκις εκατομμύριο" +msgstr[1] "%(value).1f εννεάκις εκατομμύρια" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s εννεάκις εκατομμύριο" +msgstr[1] "%(value)s εννεάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f δεκάκις εκατομμύριο" +msgstr[1] "%(value).1f δεκάκις εκατομμύρια" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s δεκάκις εκατομμύριο" +msgstr[1] "%(value)s δεκάκις εκατομμύρια" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "ένα" + +msgid "two" +msgstr "δύο" + +msgid "three" +msgstr "τρία" + +msgid "four" +msgstr "τέσσερα" + +msgid "five" +msgstr "πέντε" + +msgid "six" +msgstr "έξι" + +msgid "seven" +msgstr "εφτά" + +msgid "eight" +msgstr "οκτώ" + +msgid "nine" +msgstr "εννιά" + +msgid "today" +msgstr "σήμερα" + +msgid "tomorrow" +msgstr "αύριο" + +msgid "yesterday" +msgstr "χθες" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "πριν από %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "μια ώρα πρίν" +msgstr[1] "%(count)s ώρες πρίν" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "ένα λεπτό πρίν" +msgstr[1] "%(count)s λεπτά πρίν" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "ένα δευτερόλεπτο πρίν" +msgstr[1] "%(count)s δευτερόλεπτα πρίν" + +msgid "now" +msgstr "τώρα" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "ένα δευτερόλεπτο από τώρα" +msgstr[1] "%(count)s δευτερόλεπτα από τώρα" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "ένα λεπτό από τώρα" +msgstr[1] "%(count)s λεπτά από τώρα" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "μία ώρα από τώρα" +msgstr[1] "%(count)s ώρες από τώρα" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "σε %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d χρόνος" +msgstr[1] "%d χρόνια" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d μήνας" +msgstr[1] "%d μήνες" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d εβδομάδα" +msgstr[1] "%d εβδομάδες" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d μέρα" +msgstr[1] "%d μέρες" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ώρα" +msgstr[1] "%d ώρες" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d λεπτό" +msgstr[1] "%d λεπτά" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d χρόνος" +msgstr[1] "%d χρόνια" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d μήνας" +msgstr[1] "%d μήνες" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d εβδομάδα" +msgstr[1] "%d εβδομάδες" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d μέρα" +msgstr[1] "%d μέρες" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ώρα" +msgstr[1] "%d ώρες" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d λεπτό" +msgstr[1] "%d λεπτά" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6c0df78 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po new file mode 100644 index 0000000..4f13eb3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/eo/LC_MESSAGES/django.po @@ -0,0 +1,394 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Baptiste Darthenay , 2014,2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-05-24 15:17+0000\n" +"Last-Translator: Baptiste Darthenay \n" +"Language-Team: Esperanto (http://www.transifex.com/django/django/language/" +"eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanigi" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}a" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}a" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milionoj" +msgstr[1] "%(value).1f milionoj" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milionoj" +msgstr[1] "%(value)s milionoj" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miliardoj" +msgstr[1] "%(value).1f miliardoj" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miliardoj" +msgstr[1] "%(value)s miliardoj" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f triiliono" +msgstr[1] "%(value).1f triiliono" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s triilionoj" +msgstr[1] "%(value)s triilionoj" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f kvariliono" +msgstr[1] "%(value).1f kvariliono" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s kvarilionoj" +msgstr[1] "%(value)s kvarilionoj" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f kvinilionoj" +msgstr[1] "%(value).1f kvinilionoj" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s kvinilionoj" +msgstr[1] "%(value)s kvinilionoj" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sesilionoj" +msgstr[1] "%(value).1f sesilionoj" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sesilionoj" +msgstr[1] "%(value)s sesilionoj" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f sepilionoj" +msgstr[1] "%(value).1f sepilionoj" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s sepilionoj" +msgstr[1] "%(value)s sepilionoj" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f okilionoj" +msgstr[1] "%(value).1f okilionoj" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s okilionoj" +msgstr[1] "%(value)s okilionoj" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f naŭilionoj" +msgstr[1] "%(value).1f naŭilionoj" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s naŭilionoj" +msgstr[1] "%(value)s naŭilionoj" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f dekilionoj" +msgstr[1] "%(value).1f dekilionoj" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s dekilionoj" +msgstr[1] "%(value)s dekilionoj" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f guglo" +msgstr[1] "%(value).1f guglo" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s gugloj" +msgstr[1] "%(value)s gugloj" + +msgid "one" +msgstr "unu" + +msgid "two" +msgstr "du" + +msgid "three" +msgstr "tri" + +msgid "four" +msgstr "kvar" + +msgid "five" +msgstr "kvin" + +msgid "six" +msgstr "ses" + +msgid "seven" +msgstr "sep" + +msgid "eight" +msgstr "ok" + +msgid "nine" +msgstr "naŭ" + +msgid "today" +msgstr "hodiaŭ" + +msgid "tomorrow" +msgstr "morgaŭ" + +msgid "yesterday" +msgstr "hieraŭ" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "antaŭ %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "horo antaŭe" +msgstr[1] "%(count)s horoj antaŭe" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "minuto antaŭe" +msgstr[1] "%(count)s minutoj antaŭe" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "sekundo antaŭe" +msgstr[1] "%(count)s sekundoj antaŭe" + +msgid "now" +msgstr "nun" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "post sekundo" +msgstr[1] "post %(count)s sekundoj" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "post minuto" +msgstr[1] "post %(count)s minutoj" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "post horo" +msgstr[1] "post %(count)s horoj" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "antaŭ %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaro" +msgstr[1] "%d jaroj" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d monato" +msgstr[1] "%d monatoj" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semajno" +msgstr[1] "%d semajnoj" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d tago" +msgstr[1] "%d tagoj" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horo" +msgstr[1] "%d horoj" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutoj" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d jaro" +msgstr[1] "%d jaroj" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d monato" +msgstr[1] "%d monatoj" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semajno" +msgstr[1] "%d semajnoj" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d tago" +msgstr[1] "%d tagoj" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horo" +msgstr[1] "%d horoj" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutoj" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000..84f3d22 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..195f29a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,401 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2012 +# Ernesto Avilés Vázquez , 2014 +# Ignacio José Lizarán Rus , 2019 +# Jannis Leidel , 2011 +# Leonardo J. Caballero G. , 2011 +# Luigy, 2019 +# ntrrgc , 2014 +# Veronicabh , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-19 08:55+0000\n" +"Last-Translator: Ignacio José Lizarán Rus \n" +"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanizar" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}º" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}º" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f millón" +msgstr[1] "%(value).1f millón" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s millon" +msgstr[1] "%(value)s millones" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f millardo" +msgstr[1] "%(value).1f millardos" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s millardo" +msgstr[1] "%(value)s millardos" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billón" +msgstr[1] "%(value).1f billón" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billón" +msgstr[1] "%(value)s billones" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f billardo" +msgstr[1] "%(value).1f billardos" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s billardos" +msgstr[1] "%(value)s billardos" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f trillón" +msgstr[1] "%(value).1f trillones" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s trillón" +msgstr[1] "%(value)s trillones" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f trillardo" +msgstr[1] "%(value).1f trillardos" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s trillardo" +msgstr[1] "%(value)s trillardos" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f cuatrillón" +msgstr[1] "%(value).1f cuatrillones" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s cuatrillón" +msgstr[1] "%(value)s cuatrillones" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f cuatrillardo" +msgstr[1] "%(value).1f cuatrillardos" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s cuatrillardo" +msgstr[1] "%(value)s cuatrillardos" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f quintillón" +msgstr[1] "%(value).1f quintillones" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s quintillón" +msgstr[1] "%(value)s quintillones" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f quintillardo" +msgstr[1] "%(value).1f quintillardos" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s quintillardo" +msgstr[1] "%(value)s quintillardos" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] " %(value)s googol" +msgstr[1] " %(value)s googol" + +msgid "one" +msgstr "uno" + +msgid "two" +msgstr "dos" + +msgid "three" +msgstr "tres" + +msgid "four" +msgstr "cuatro" + +msgid "five" +msgstr "cinco" + +msgid "six" +msgstr "seis" + +msgid "seven" +msgstr "siete" + +msgid "eight" +msgstr "ocho" + +msgid "nine" +msgstr "nueve" + +msgid "today" +msgstr "hoy" + +msgid "tomorrow" +msgstr "mañana" + +msgid "yesterday" +msgstr "ayer" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "hace %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "hace una hora" +msgstr[1] "hace %(count)s horas" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "hace un minuto" +msgstr[1] "hace %(count)s minutos" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "hace un segundo" +msgstr[1] "hace %(count)s segundos" + +msgid "now" +msgstr "ahora" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "un segundo a partir de ahora" +msgstr[1] "%(count)s segundos a partir de ahora" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "un minuto a partir de ahora" +msgstr[1] "%(count)s minutos a partir de ahora" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "una hora a partir de ahora" +msgstr[1] "%(count)s horas a partir de ahora" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s desde ahora" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d año" +msgstr[1] "%d años" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mes" +msgstr[1] "%d meses" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d día" +msgstr[1] "%d días" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d año" +msgstr[1] "%d años" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mes" +msgstr[1] "%d meses" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d día" +msgstr[1] "%d días" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po new file mode 100644 index 0000000..b3f666b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/es_MX/LC_MESSAGES/django.po @@ -0,0 +1,264 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abraham Estrada, 2011-2012 +# Alex Dzul , 2015 +# Juan Pablo Flores , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 18:03+0000\n" +"Last-Translator: Juan Pablo Flores \n" +"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" +"language/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanizar" + +msgid "th" +msgstr "to" + +msgid "st" +msgstr "ro" + +msgid "nd" +msgstr "do" + +msgid "rd" +msgstr "ro" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f millón" +msgstr[1] "%(value).1f millones" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s millones" +msgstr[1] "%(value)s millones" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f billón" +msgstr[1] "%(value).1f billones" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s billiones" +msgstr[1] "%(value)s billiones" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f trillón" +msgstr[1] "%(value).1f trillones" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s trilliones" +msgstr[1] "%(value)s trilliones" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f cuatrillón" +msgstr[1] "%(value).1f cuatrillones" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s cuatrillón" +msgstr[1] "%(value)s cuatrillones" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f quintillón" +msgstr[1] "%(value).1f quintillones" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s quintillón" +msgstr[1] "%(value)s quintillones" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextillón" +msgstr[1] "%(value).1f sextillones" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextillón" +msgstr[1] "%(value)s sextillones" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septillón" +msgstr[1] "%(value).1f septillones" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septillón" +msgstr[1] "%(value)s septillones" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octillón" +msgstr[1] "%(value).1f octillones" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octillón" +msgstr[1] "%(value)s octillones" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonillion" +msgstr[1] "%(value).1f nonillion" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonillón" +msgstr[1] "%(value)s nonillones" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f decillón" +msgstr[1] "%(value).1f decillones" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s decillón" +msgstr[1] "%(value)s decillones" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googoles" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googoles" + +msgid "one" +msgstr "uno" + +msgid "two" +msgstr "dos" + +msgid "three" +msgstr "tres" + +msgid "four" +msgstr "cuatro" + +msgid "five" +msgstr "cinco" + +msgid "six" +msgstr "seis" + +msgid "seven" +msgstr "siete" + +msgid "eight" +msgstr "ocho" + +msgid "nine" +msgstr "nueve" + +msgid "today" +msgstr "hoy" + +msgid "tomorrow" +msgstr "mañana" + +msgid "yesterday" +msgstr "ayer" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "hace %(delta)s" + +msgid "now" +msgstr "ahora" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "hace un segundo" +msgstr[1] "Hace %(count)s segundos" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "hace un minuto" +msgstr[1] "Hace %(count)s minutos" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "hace una hora" +msgstr[1] "Hace %(count)s horas" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s a partir de ahora" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "Un segundo desde ahora" +msgstr[1] "%(count)s desde ahora" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po new file mode 100644 index 0000000..04520cd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fa/LC_MESSAGES/django.po @@ -0,0 +1,400 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Nikneshan , 2012 +# Alireza Savand , 2012 +# Claude Paroz , 2013 +# Jannis Leidel , 2011 +# MJafar Mashhadi , 2018 +# Mohammad Hossein Mojtahedi , 2016 +# Reza Mohammadi , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-06-23 23:07+0000\n" +"Last-Translator: MJafar Mashhadi \n" +"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Humanize" +msgstr "انسانی‌سازی" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}ین" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}م" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}م" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f میلیون" +msgstr[1] "%(value).1f میلیون" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s میلیون" +msgstr[1] "%(value)s میلیون" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f بیلیون" +msgstr[1] "%(value).1f بیلیون" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s میلیارد" +msgstr[1] "%(value)s میلیارد" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f تریلون" +msgstr[1] "%(value).1f تریلون" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s تریلیون" +msgstr[1] "%(value)s تریلیون" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f کوادریلیون" +msgstr[1] "%(value).1f کوادریلیون" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s کوادریلیون" +msgstr[1] "%(value)s کوادریلیون" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f کوانتینیوم" +msgstr[1] "%(value).1f کوانتینیوم" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s کوانتینیوم" +msgstr[1] "%(value)s کوانتینیوم" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f با ۲۱ صفر" +msgstr[1] "%(value).1f با ۲۱ صفر" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s با ۲۱ صفر" +msgstr[1] "%(value)s با ۲۱ صفر" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f سپتیلیون" +msgstr[1] "%(value).1f سپتیلیون" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s سپتیلیون" +msgstr[1] "%(value)s سپتیلیون" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octillion" +msgstr[1] "%(value).1f octillion" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octillion" +msgstr[1] "%(value)s octillion" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] " %(value).1f با ۵۴ صفر" +msgstr[1] " %(value).1f با ۵۴ صفر" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s با ۵۴ صفر" +msgstr[1] "%(value)s با ۵۴ صفر" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f با شصت صفر" +msgstr[1] "%(value).1f با شصت صفر" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s با شصت صفر" +msgstr[1] "%(value)s با شصت صفر" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f گوگُل" +msgstr[1] "%(value).1f گوگُل" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s گوگُل" +msgstr[1] "%(value)s گوگُل" + +msgid "one" +msgstr "یک" + +msgid "two" +msgstr "دو" + +msgid "three" +msgstr "سه" + +msgid "four" +msgstr "چهار" + +msgid "five" +msgstr "پنج" + +msgid "six" +msgstr "شش" + +msgid "seven" +msgstr "هفت" + +msgid "eight" +msgstr "هشت" + +msgid "nine" +msgstr "نُه" + +msgid "today" +msgstr "امروز" + +msgid "tomorrow" +msgstr "فردا" + +msgid "yesterday" +msgstr "دیروز" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s پیش" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "%(count)s ساعت پیش" +msgstr[1] "%(count)s ساعت پیش" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "%(count)s دقیقه پیش" +msgstr[1] "%(count)s دقیقه پیش" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "%(count)s ثانیه پیش" +msgstr[1] "%(count)s ثانیه پیش" + +msgid "now" +msgstr "اکنون" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "%(count)s ثانیه دیگر" +msgstr[1] "%(count)s ثانیه دیگر" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "%(count)s دقیقه دیگر" +msgstr[1] "%(count)s دقیقه دیگر" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "%(count)s ساعت دیگر" +msgstr[1] "%(count)s ساعت دیگر" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s دیگر" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d سال" +msgstr[1] "%d سال" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ماه" +msgstr[1] "%d ماه" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d هفته" +msgstr[1] "%d هفته" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d روز" +msgstr[1] "%d روز" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ساعت" +msgstr[1] "%d ساعت" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d دقیقه" +msgstr[1] "%d دقیقه" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d سال" +msgstr[1] "%d سال" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ماه" +msgstr[1] "%d ماه" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d هفته" +msgstr[1] "%d هفته" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d روز" +msgstr[1] "%d روز" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ساعت" +msgstr[1] "%d ساعت" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d دقیقه" +msgstr[1] "%d دقیقه" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..5e9a42f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,396 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2013-2014,2018-2019 +# Claude Paroz , 2011 +# Jannis Leidel , 2011 +# Jean-Baptiste Mora, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-03-02 14:04+0000\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Humanize" +msgstr "Humanisation" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}er" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}e" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}e" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f million" +msgstr[1] "%(value).1f millions" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s million" +msgstr[1] "%(value)s millions" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milliard" +msgstr[1] "%(value).1f milliards" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s milliard" +msgstr[1] "%(value)s milliards" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billion" +msgstr[1] "%(value).1f billions" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billion" +msgstr[1] "%(value)s billions" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f quadrillion" +msgstr[1] "%(value).1f quadrillions" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s quadrillion" +msgstr[1] "%(value)s quadrillions" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f quintillion" +msgstr[1] "%(value).1f quintillions" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s quintillion" +msgstr[1] "%(value)s quintillions" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextillion" +msgstr[1] "%(value).1f sextillions" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextillion" +msgstr[1] "%(value)s sextillion" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septillion" +msgstr[1] "%(value).1f septillions" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septillion" +msgstr[1] "%(value)s septillions" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octillion" +msgstr[1] "%(value).1f octillions" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octillion" +msgstr[1] "%(value)s octillions" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonillion" +msgstr[1] "%(value).1f nonillions" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonillion" +msgstr[1] "%(value)s nonillions" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f décillion" +msgstr[1] "%(value).1f décillions" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s décillion" +msgstr[1] "%(value)s décillions" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f gogol" +msgstr[1] "%(value).1f gogols" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s gogol" +msgstr[1] "%(value)s gogols" + +msgid "one" +msgstr "un" + +msgid "two" +msgstr "deux" + +msgid "three" +msgstr "trois" + +msgid "four" +msgstr "quatre" + +msgid "five" +msgstr "cinq" + +msgid "six" +msgstr "six" + +msgid "seven" +msgstr "sept" + +msgid "eight" +msgstr "huit" + +msgid "nine" +msgstr "neuf" + +msgid "today" +msgstr "aujourd'hui" + +msgid "tomorrow" +msgstr "demain" + +msgid "yesterday" +msgstr "hier" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "il y a %(delta)s" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "il y a une heure" +msgstr[1] "il y a %(count)s heures" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "il y a une minute" +msgstr[1] "il y a %(count)s minutes" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "il y a une seconde" +msgstr[1] "il y a %(count)s secondes" + +msgid "now" +msgstr "maintenant" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "dans une seconde" +msgstr[1] "dans %(count)s secondes" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "dans une minute" +msgstr[1] "dans %(count)s minutes" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "dans une heure" +msgstr[1] "dans %(count)s heures" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "dans %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d année" +msgstr[1] "%d ans" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mois" +msgstr[1] "%d mois" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semaine" +msgstr[1] "%d semaines" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d jour" +msgstr[1] "%d jours" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d heure" +msgstr[1] "%d heures" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minute" +msgstr[1] "%d minutes" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d année" +msgstr[1] "%d ans" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mois" +msgstr[1] "%d mois" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semaine" +msgstr[1] "%d semaines" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d jour" +msgstr[1] "%d jours" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d heure" +msgstr[1] "%d heures" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minute" +msgstr[1] "%d minutes" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..489bbab Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po new file mode 100644 index 0000000..2ae2bf8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/fy/LC_MESSAGES/django.po @@ -0,0 +1,261 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Western Frisian (http://www.transifex.com/projects/p/django/" +"language/fy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "" + +msgid "st" +msgstr "" + +msgid "nd" +msgstr "" + +msgid "rd" +msgstr "" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "" +msgstr[1] "" + +msgid "one" +msgstr "" + +msgid "two" +msgstr "" + +msgid "three" +msgstr "" + +msgid "four" +msgstr "" + +msgid "five" +msgstr "" + +msgid "six" +msgstr "" + +msgid "seven" +msgstr "" + +msgid "eight" +msgstr "" + +msgid "nine" +msgstr "" + +msgid "today" +msgstr "" + +msgid "tomorrow" +msgstr "" + +msgid "yesterday" +msgstr "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "" + +msgid "now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1fb51b9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ga/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..028d6e7 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gd/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..11ae732 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..42fcea6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..90759c7 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,397 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016,2018 +# Attila Nagy <>, 2012 +# Jannis Leidel , 2011 +# János R (Hangya), 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-07-31 07:43+0000\n" +"Last-Translator: András Veres-Szentkirályi\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Emberi formázás" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value)1f millió" +msgstr[1] "%(value)1f millió" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s millió" +msgstr[1] "%(value)s millió" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value)1f milliárd" +msgstr[1] "%(value)1f milliárd" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] " %(value)s milliárd" +msgstr[1] " %(value)s milliárd" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value)1f trilliárd" +msgstr[1] "%(value)1f trilliárd" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billió" +msgstr[1] "%(value)s billió" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f billiárd" +msgstr[1] "%(value).1f billiárd" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s billiárd" +msgstr[1] "%(value)s billiárd" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f trillió" +msgstr[1] "%(value).1f trillió" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s trillió" +msgstr[1] "%(value)s trillió" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f trilliárd" +msgstr[1] "%(value).1f trilliárd" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s trilliárd" +msgstr[1] "%(value)s trilliárd" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kvadrillió" +msgstr[1] "%(value).1f kvadrillió" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kvadrillió" +msgstr[1] "%(value)s kvadrillió" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kvadrilliárd" +msgstr[1] "%(value).1f kvadrilliárd" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kvadrilliárd" +msgstr[1] "%(value)s kvadrilliárd" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kvintillió" +msgstr[1] "%(value).1f kvintillió" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kvintillió" +msgstr[1] "%(value)s kvintillió" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kvintilliárd" +msgstr[1] "%(value).1f kvintilliárd" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kvintilliárd" +msgstr[1] "%(value)s kvintilliárd" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "egy" + +msgid "two" +msgstr "kettő" + +msgid "three" +msgstr "három" + +msgid "four" +msgstr "négy" + +msgid "five" +msgstr "öt" + +msgid "six" +msgstr "hat" + +msgid "seven" +msgstr "hét" + +msgid "eight" +msgstr "nyolc" + +msgid "nine" +msgstr "kilenc" + +msgid "today" +msgstr "ma" + +msgid "tomorrow" +msgstr "holnap" + +msgid "yesterday" +msgstr "tegnap" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr " %(delta)s ezelőtt" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "egy órája" +msgstr[1] "%(count)s órája" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "egy perce" +msgstr[1] "%(count)s perce" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "egy másodperce" +msgstr[1] "%(count)s másodperce" + +msgid "now" +msgstr "most" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "egy másodperc múlva" +msgstr[1] "%(count)s másodperc múlva" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "egy perc múlva" +msgstr[1] "%(count)s perc múlva" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "egy óra múlva" +msgstr[1] "%(count)s óra múlva" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s múlva" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d évvel" +msgstr[1] "%d évvel" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d hónappal" +msgstr[1] "%d hónappal" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d héttel" +msgstr[1] "%d héttel" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d nappal" +msgstr[1] "%d nappal" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d órával" +msgstr[1] "%d órával" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d perccel" +msgstr[1] "%d perccel" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d év" +msgstr[1] "%d év" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d hónap" +msgstr[1] "%d hónap" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hét" +msgstr[1] "%d hét" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d nap" +msgstr[1] "%d nap" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d óra" +msgstr[1] "%d óra" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d perc" +msgstr[1] "%d perc" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..d9b14c0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,399 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# gudmundur , 2012 +# Hafsteinn Einarsson , 2012 +# Jannis Leidel , 2011 +# Matt R, 2018 +# Thordur Sigurdsson , 2016,2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 03:49+0000\n" +"Last-Translator: Thordur Sigurdsson \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +msgid "Humanize" +msgstr "" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milljón" +msgstr[1] "%(value).1f milljónir" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milljón" +msgstr[1] "%(value)s milljónir" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milljarður" +msgstr[1] "%(value).1f milljarðar" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s milljarður" +msgstr[1] "%(value)s milljarðar" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billjarður" +msgstr[1] "%(value).1f billjónir" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billjón" +msgstr[1] "%(value)s billjónir" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f billjarður" +msgstr[1] "%(value).1f billjarðar" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s billjarður" +msgstr[1] "%(value)s billjarðar" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f trilljón" +msgstr[1] "%(value).1f trilljónir" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s trilljón" +msgstr[1] "%(value)s trilljónir" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f trilljarður" +msgstr[1] "%(value).1f trilljarðar" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s trilljarður" +msgstr[1] "%(value)s trilljarðar" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kvaðrilljón" +msgstr[1] "%(value).1f kvaðrilljónir" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kvaðrilljón" +msgstr[1] "%(value)s kvaðrilljónir" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kvaðrilljarður" +msgstr[1] "%(value).1f kvaðrilljarðar" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kvaðrilljarður" +msgstr[1] "%(value)s kvaðrilljarðar" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kvintilljón" +msgstr[1] "%(value).1f kvintilljónir" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kvintilljón" +msgstr[1] "%(value)s kvintilljónir" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kvintilljarður" +msgstr[1] "%(value).1f kvintilljarðar" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kvintilljarður" +msgstr[1] "%(value)s kvintilljarðar" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "einn" + +msgid "two" +msgstr "tveir" + +msgid "three" +msgstr "þrír" + +msgid "four" +msgstr "fjórir" + +msgid "five" +msgstr "fimm" + +msgid "six" +msgstr "sex" + +msgid "seven" +msgstr "sjö" + +msgid "eight" +msgstr "átta" + +msgid "nine" +msgstr "níu" + +msgid "today" +msgstr "í dag" + +msgid "tomorrow" +msgstr "á morgun" + +msgid "yesterday" +msgstr "í gær" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "" + +#. Translators: 'naturaltime-past' strings will be included in +#. '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "now" +msgstr "núna" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "" + +#. Translators: 'naturaltime-future' strings will be included in +#. '%(delta)s from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3644d33 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..d87a1ad --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,404 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Carlo Miron , 2014 +# Carlo Miron , 2018 +# Federico Capoano , 2011 +# Jannis Leidel , 2011 +# Luca Manlio De Lisi , 2011 +# Marco Bonetti, 2014 +# Mirco Grillo , 2018 +# Nicola Larosa , 2011 +# palmux , 2015 +# Stefano Brentegani , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-07-30 21:09+0000\n" +"Last-Translator: Carlo Miron \n" +"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Umanizzazione " + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}esimo" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}esimo" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milione" +msgstr[1] "%(value).1f milioni" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milione" +msgstr[1] "%(value)s milioni" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miliardo" +msgstr[1] "%(value).1f miliardi" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miliardo" +msgstr[1] "%(value)s miliardi" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f migliaio di miliardi" +msgstr[1] "%(value).1f migliaia di miliardi" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s migliaio di miliardi" +msgstr[1] "%(value)s migliaia di miliardi" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f milione di miliardi" +msgstr[1] "%(value).1f milioni di miliardi" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s milione di miliardi" +msgstr[1] "%(value)s milioni di miliardi" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f miliardo di miliardi" +msgstr[1] "%(value).1f miliardi di miliardi" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s miliardo di miliardi" +msgstr[1] "%(value)s miliardi di miliardi" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f migliaio di miliardi di miliardi" +msgstr[1] "%(value).1f migliaia di miliardi di miliardi" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s migliaio di miliardi di miliardi" +msgstr[1] "%(value)s migliaia di miliardi di miliardi" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f milione di miliardi di miliardi" +msgstr[1] "%(value).1f milioni di miliardi di miliardi" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s milione di miliardi di miliardi" +msgstr[1] "%(value)s milioni di miliardi di miliardi" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f miliardo di miliardi di miliardi" +msgstr[1] "%(value).1f miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s miliardo di miliardi di miliardi" +msgstr[1] "%(value)s miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f migliaio di miliardi di miliardi di miliardi" +msgstr[1] "%(value).1f migliaia di miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s migliaio di miliardi di miliardi di miliardi" +msgstr[1] "%(value)s migliaia di miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f milione di miliardi di miliardi di miliardi" +msgstr[1] "%(value).1f milioni di miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s milione di miliardi di miliardi di miliardi" +msgstr[1] "%(value)s milioni di miliardi di miliardi di miliardi" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "uno" + +msgid "two" +msgstr "due" + +msgid "three" +msgstr "tre" + +msgid "four" +msgstr "quattro" + +msgid "five" +msgstr "cinque" + +msgid "six" +msgstr "sei" + +msgid "seven" +msgstr "sette" + +msgid "eight" +msgstr "otto" + +msgid "nine" +msgstr "nove" + +msgid "today" +msgstr "oggi" + +msgid "tomorrow" +msgstr "domani" + +msgid "yesterday" +msgstr "ieri" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s fa" + +#. Translators: 'naturaltime-past' strings will be included in +#. '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d anni" +msgstr[1] "%d anni" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mesi" +msgstr[1] "%d mesi" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d settimane" +msgstr[1] "%d settimane" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d giorni" +msgstr[1] "%d giorni" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ore" +msgstr[1] "%d ore" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuti" +msgstr[1] "%d minuti" + +msgid "now" +msgstr "adesso" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "un secondo fa" +msgstr[1] "%(count)s secondi fa" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "un minuto fa" +msgstr[1] "%(count)s minuti fa" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "un ora fa" +msgstr[1] "%(count)s ore fa" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s da adesso" + +#. Translators: 'naturaltime-future' strings will be included in +#. '%(delta)s from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d anni" +msgstr[1] "%d anni" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mesi" +msgstr[1] "%d mesi" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d settimane" +msgstr[1] "%d settimane" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d giorni" +msgstr[1] "%d giorni" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d ore" +msgstr[1] "%d ore" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuti" +msgstr[1] "%d minuti" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "tra un secondo" +msgstr[1] "tra %(count)s secondi" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "tra un minuto" +msgstr[1] "tra %(count)s minuti" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "tra un'ora" +msgstr[1] "tra %(count)s ore" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bf15948 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ko/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5b7937f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6d99979 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/lv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po new file mode 100644 index 0000000..136b20b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mk/LC_MESSAGES/django.po @@ -0,0 +1,262 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Vasil Vangelovski , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 19:05+0000\n" +"Last-Translator: dekomote \n" +"Language-Team: Macedonian (http://www.transifex.com/django/django/language/" +"mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +msgid "Humanize" +msgstr "Хуманизирање" + +msgid "th" +msgstr "ти" + +msgid "st" +msgstr "ви" + +msgid "nd" +msgstr "ри" + +msgid "rd" +msgstr "ти" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f милион" +msgstr[1] "%(value).1f милиони" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s милион" +msgstr[1] "%(value)s милиони" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f милијарда" +msgstr[1] "%(value).1f милијарди" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s милијарда" +msgstr[1] "%(value)s милијарди" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f трилион" +msgstr[1] "%(value).1f трилиони" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s трилион" +msgstr[1] "%(value)s трилиони" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f квадрилион" +msgstr[1] "%(value).1f квадрилиони" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s квадрилион" +msgstr[1] "%(value)s квадрилиони" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f квинтилион" +msgstr[1] "%(value).1f квинтилиони" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s квинтилион" +msgstr[1] "%(value)s квинтилиони" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f секстилион" +msgstr[1] "%(value).1f секстилиони" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s секстилион" +msgstr[1] "%(value)s секстилиони" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f септилион" +msgstr[1] "%(value).1f септилиони" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s септилион" +msgstr[1] "%(value)s септилиони" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f октилион" +msgstr[1] "%(value).1f октилиони" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s октилион" +msgstr[1] "%(value)s октилиони" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f нонилион" +msgstr[1] "%(value).1f нонилиони" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s нонилион" +msgstr[1] "%(value)s нонилиони" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f децилион" +msgstr[1] "%(value).1f децилиони" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s децилион" +msgstr[1] "%(value)s децилиони" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f гугол" +msgstr[1] "%(value).1f гуголи" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s гугол" +msgstr[1] "%(value)s гуголи" + +msgid "one" +msgstr "еден" + +msgid "two" +msgstr "две" + +msgid "three" +msgstr "три" + +msgid "four" +msgstr "четри" + +msgid "five" +msgstr "пет" + +msgid "six" +msgstr "шест" + +msgid "seven" +msgstr "седум" + +msgid "eight" +msgstr "осум" + +msgid "nine" +msgstr "девет" + +msgid "today" +msgstr "денес" + +msgid "tomorrow" +msgstr "утре" + +msgid "yesterday" +msgstr "вчера" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "пред %(delta)s" + +msgid "now" +msgstr "сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "пред %(count)s секундa" +msgstr[1] "пред %(count)s секунди" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "пред %(count)s минутa" +msgstr[1] "пред %(count)s минути" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "пред %(count)s час" +msgstr[1] "пред %(count)s часа" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s од сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "за %(count)s секундa од сега" +msgstr[1] "за %(count)s секунди од сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "за %(count)s минута од сега" +msgstr[1] "за %(count)s минути од сега" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "за %(count)s час од сега" +msgstr[1] "за %(count)s часа од сега" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6cb3d2c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ml/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po new file mode 100644 index 0000000..8b2de47 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po @@ -0,0 +1,398 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bayarkhuu Bataa, 2014 +# Bayarkhuu Bataa, 2013 +# Zorig, 2013 +# Zorig, 2019 +# Анхбаяр Анхаа , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-19 02:28+0000\n" +"Last-Translator: Zorig\n" +"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Хүнчлэх" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{} дахь" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{} дахь" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{} дахь" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{} дэхь" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{} дэхь" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f сая" +msgstr[1] "%(value).1f сая" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s сая" +msgstr[1] "%(value)s сая" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f тэрбум" +msgstr[1] "%(value).1f тэрбум" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s тэрбум" +msgstr[1] "%(value)s тэрбум" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f наяд" +msgstr[1] "%(value).1f наяд" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s наяд" +msgstr[1] "%(value)s наяд" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f тунамал" +msgstr[1] "%(value).1f тунамал" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s тунамал" +msgstr[1] "%(value)s тунамал" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f их ингүүмэл " +msgstr[1] "%(value).1f их ингүүмэл " + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s их ингүүмэл " +msgstr[1] "%(value)s их ингүүмэл " + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f ялгаруулагч" +msgstr[1] "%(value).1f ялгаруулагч" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s ялгаруулагч" +msgstr[1] "%(value)s ялгаруулагч" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f их өөр дээр " +msgstr[1] "%(value).1f их өөр дээр " + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s их өөр дээр " +msgstr[1] "%(value)s их өөр дээр " + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f өөр дээр " +msgstr[1] "%(value).1f өөр дээр " + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s өөр дээр " +msgstr[1] "%(value)s өөр дээр " + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f их шалтгааны үзэгдэл" +msgstr[1] "%(value).1f их шалтгааны үзэгдэл" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s их шалтгааны үзэгдэл" +msgstr[1] "%(value)s их шалтгааны үзэгдэл" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f эрхэт" +msgstr[1] "%(value).1f эрхэт" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s эрхэт" +msgstr[1] "%(value)s эрхэт" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "нэг" + +msgid "two" +msgstr "хоёр" + +msgid "three" +msgstr "гурав" + +msgid "four" +msgstr "дөрөв" + +msgid "five" +msgstr "тав" + +msgid "six" +msgstr "зургаа" + +msgid "seven" +msgstr "долоо" + +msgid "eight" +msgstr "найм" + +msgid "nine" +msgstr "ес" + +msgid "today" +msgstr "өнөөдөр" + +msgid "tomorrow" +msgstr "маргааш" + +msgid "yesterday" +msgstr "өчигдөр" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s ѳмнѳ" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "1 цагийн өмнө" +msgstr[1] "%(count)s цагийн өмнө" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "1 минутын өмнө" +msgstr[1] "%(count)s минутын өмнө" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "1 секундын өмнө" +msgstr[1] "%(count)s секундын өмнө" + +msgid "now" +msgstr "одоо" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "1 секундын дараа" +msgstr[1] "%(count)s секундын дараа" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "1 минутын дараа" +msgstr[1] "%(count)s минутын дараа" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "1 цагийн дараа" +msgstr[1] "%(count)s цагийн дараа" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "одооноос %(delta)s " + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d жил" +msgstr[1] "%d жилүүд" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d сар" +msgstr[1] "%d сар" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d долоо хоног" +msgstr[1] "%d долоо хоног" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d өдөр" +msgstr[1] "%d өдөр" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d цаг" +msgstr[1] "%d цаг" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минут" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d жил" +msgstr[1] "%d жил" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d сар" +msgstr[1] "%d сар" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d долоо хоног" +msgstr[1] "%d долоо хоног" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d өдөр" +msgstr[1] "%d өдөр" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d цаг" +msgstr[1] "%d цаг" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d минут" +msgstr[1] "%d минут" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..183b3d1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po new file mode 100644 index 0000000..a3fe48c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/my/LC_MESSAGES/django.po @@ -0,0 +1,234 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Yhal Htet Aung , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Burmese (http://www.transifex.com/django/django/language/" +"my/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: my\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "မြောက်" + +msgid "st" +msgstr "မြောက်" + +msgid "nd" +msgstr "မြောက်" + +msgid "rd" +msgstr "မြောက်" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f မီလီယံ" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s မီလီယံ" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f ဘီလီယံ" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s ဘီလီယံ" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f တရီလျံ" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s တရီလျံ" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f ကွပ်ဒရီလျံ" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s ကွပ်ဒရီလျံ" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f ကွင့်တီလျံ" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s ကွင့်တီလျံ" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f ဆက်တီလျံ" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s ဆက်တီလျံ" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f ဆပ်တီလျံ" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s ဆပ်တီလျံ" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f အော့တီလျံ" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s အော့တီလျံ" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f နိုနီလျံ" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s နိုနီလျံ" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f ဒက်စီလျံ" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s ဒက်စီလျံ" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f ဂူးဂေါ်" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s ဂူးဂေါ်" + +msgid "one" +msgstr "တစ်" + +msgid "two" +msgstr "နှစ်" + +msgid "three" +msgstr "သံုး" + +msgid "four" +msgstr "လေး" + +msgid "five" +msgstr "ငါး" + +msgid "six" +msgstr "ခြောက်" + +msgid "seven" +msgstr "ခုနစ်" + +msgid "eight" +msgstr "ရှစ်" + +msgid "nine" +msgstr "ကိုး" + +msgid "today" +msgstr "ယနေ့" + +msgid "tomorrow" +msgstr "မနက်ဖြန်" + +msgid "yesterday" +msgstr "မနေ့" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "%(delta)s အခါက" + +msgid "now" +msgstr "ယခု" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s ယခုမှ" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..29c709d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..ca73983 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,263 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# velmont , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" +"language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "." + +msgid "st" +msgstr "." + +msgid "nd" +msgstr "." + +msgid "rd" +msgstr "." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f million" +msgstr[1] "%(value).1f millionar" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s million" +msgstr[1] "%(value)s millionar" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milliard" +msgstr[1] "%(value).1f milliardar" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s milliard" +msgstr[1] "%(value)s milliardar" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f billion" +msgstr[1] "%(value).1f billionar" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s billion" +msgstr[1] "%(value)s billionar" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f kvadrillion" +msgstr[1] "%(value).1f kvadrillionar" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s kvadrillion" +msgstr[1] "%(value)s kvadrillionar" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f kvintillion" +msgstr[1] "%(value).1f kvintillionar" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s kvintillion" +msgstr[1] "%(value)s kvintillionar" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sekstillion" +msgstr[1] "%(value).1f sekstilionar" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sekstillion" +msgstr[1] "%(value)s sekstillionar" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septillion" +msgstr[1] "%(value).1f septillionar" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septillion" +msgstr[1] "%(value)s septillionar" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f oktillion" +msgstr[1] "%(value).1f oktillionar" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s oktillion" +msgstr[1] "%(value)s oktillionar" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonillion" +msgstr[1] "%(value).1f nonillionar" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonillion" +msgstr[1] "%(value)s nonillionar" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f desillion" +msgstr[1] "%(value).1f desillionar" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s desillion" +msgstr[1] "%(value)s desillionar" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googolar" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googolar" + +msgid "one" +msgstr "éin" + +msgid "two" +msgstr "to" + +msgid "three" +msgstr "tre" + +msgid "four" +msgstr "fire" + +msgid "five" +msgstr "fem" + +msgid "six" +msgstr "seks" + +msgid "seven" +msgstr "sju" + +msgid "eight" +msgstr "åtte" + +msgid "nine" +msgstr "ni" + +msgid "today" +msgstr "i dag" + +msgid "tomorrow" +msgstr "i morgon" + +msgid "yesterday" +msgstr "i går" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "%(delta)s sidan" + +msgid "now" +msgstr "no" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "%(delta)s frå no" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" +msgstr[1] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" +msgstr[1] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..8a9d8b4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,398 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Henrique Azevedo , 2018 +# Jannis Leidel , 2011 +# jorgecarleitao , 2014 +# Nuno Mariz , 2012-2013,2018 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-12-20 15:27+0000\n" +"Last-Translator: Nuno Mariz \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanizar" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}.º" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}.º" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milhão" +msgstr[1] "%(value).1f milhões" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milhão" +msgstr[1] "%(value)s milhões" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f bilião" +msgstr[1] "%(value).1f biliões" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s bilião" +msgstr[1] "%(value)s biliões" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f trilião" +msgstr[1] "%(value).1f triliões" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s trilião" +msgstr[1] "%(value)s triliões" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f quadrilião" +msgstr[1] "%(value).1f quatriliões" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s quadrilião" +msgstr[1] "%(value)s quatriliões" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f quintilião" +msgstr[1] "%(value).1f quintiliões" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s quintilião" +msgstr[1] "%(value)s quintiliões" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextilião" +msgstr[1] "%(value).1f sextiliões" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextilião" +msgstr[1] "%(value)s sextiliões" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septilião" +msgstr[1] "%(value).1f septiliões" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septilião" +msgstr[1] "%(value)s septiliões" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octilião" +msgstr[1] "%(value).1f octiliões" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octilião" +msgstr[1] "%(value)s octiliões" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonilião" +msgstr[1] "%(value).1f noniliões" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonilião" +msgstr[1] "%(value)s noniliões" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f decilião" +msgstr[1] "%(value).1f deciliões" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s decilião" +msgstr[1] "%(value)s deciliões" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "um" + +msgid "two" +msgstr "dois" + +msgid "three" +msgstr "três" + +msgid "four" +msgstr "quatro" + +msgid "five" +msgstr "cinco" + +msgid "six" +msgstr "seis" + +msgid "seven" +msgstr "sete" + +msgid "eight" +msgstr "oito" + +msgid "nine" +msgstr "nove" + +msgid "today" +msgstr "hoje" + +msgid "tomorrow" +msgstr "amanhã" + +msgid "yesterday" +msgstr "ontem" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s atrás" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "há uma hora atrás" +msgstr[1] "há %(count)s horas atrás" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "há um minuto atrás" +msgstr[1] "há %(count)s minutos atrás" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "há um segundo atrás" +msgstr[1] "há %(count)s segundos atrás" + +msgid "now" +msgstr "agora" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "daqui a um segundo" +msgstr[1] "daqui a %(count)s segundos" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "daqui a um minuto" +msgstr[1] "daqui a %(count)s minutos" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "daqui a uma hora" +msgstr[1] "daqui a %(count)s horas" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s a partir de agora" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d ano" +msgstr[1] "%d anos" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d meses" +msgstr[1] "%d meses" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semanas" +msgstr[1] "%d semanas" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dia" +msgstr[1] "%d dias" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d horas" +msgstr[1] "%d horas" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d ano" +msgstr[1] "%d anos" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mês" +msgstr[1] "%d meses" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dia" +msgstr[1] "%d dias" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..a9c57d4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,441 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bogdan Mateescu, 2018 +# Daniel Ursache-Dogariu, 2011 +# Denis Darii , 2014 +# Jannis Leidel , 2011 +# Razvan Stefanescu , 2016 +# Sorin Sbarnea, 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 06:45+0000\n" +"Last-Translator: Bogdan Mateescu\n" +"Language-Team: Romanian (http://www.transifex.com/django/django/language/" +"ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +msgid "Humanize" +msgstr "Umanizare" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "al {}-lea" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "al {}-lea" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milion" +msgstr[1] "%(value).1f milioane" +msgstr[2] "%(value).1f de milioane" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milion" +msgstr[1] "%(value)s milioane" +msgstr[2] "%(value)s de milioane" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miliard" +msgstr[1] "%(value).1f miliarde" +msgstr[2] "%(value).1f de miliarde" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miliard" +msgstr[1] "%(value)s miliarde" +msgstr[2] "%(value)s de miliarde" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f trilion" +msgstr[1] "%(value).1f trilioane" +msgstr[2] "%(value).1f de trilioane" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s trilion" +msgstr[1] "%(value)s trilioane" +msgstr[2] "%(value)s de trilioane" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f cuadrilion" +msgstr[1] "%(value).1f cuadrilioane" +msgstr[2] "%(value).1f de cuadrilioane" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s cuadrilion" +msgstr[1] "%(value)s cuadrilioane" +msgstr[2] "%(value)s de cuadrilioane" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f cuntilion" +msgstr[1] "%(value).1f cuntilioane" +msgstr[2] "%(value).1f de cuntilioane" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s cuntilion" +msgstr[1] "%(value)s cuntilioane" +msgstr[2] "%(value)s de cuntilioane" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextilion" +msgstr[1] "%(value).1f sextilioane" +msgstr[2] "%(value).1f de sextilioane" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextilion" +msgstr[1] "%(value)s sextilioane" +msgstr[2] "%(value)s de sextilioane" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septilion" +msgstr[1] "%(value).1f septilioane" +msgstr[2] "%(value).1f de septilioane" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septilion" +msgstr[1] "%(value)s septilioane" +msgstr[2] "%(value)s de septilioane" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octilion" +msgstr[1] "%(value).1f octilioane" +msgstr[2] "%(value).1f de octilioane" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octilion" +msgstr[1] "%(value)s octilioane" +msgstr[2] "%(value)s de octilioane" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonilion" +msgstr[1] "%(value).1f nonilioane" +msgstr[2] "%(value).1f de nonilioane" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonilion" +msgstr[1] "%(value)s nonilioane" +msgstr[2] "%(value)s de nonilioane" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f decilion" +msgstr[1] "%(value).1f decilioane" +msgstr[2] "%(value).1f de decilioane" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s decilion" +msgstr[1] "%(value)s decilioane" +msgstr[2] "%(value)s de decilioane" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" +msgstr[2] "%(value).1f de googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" +msgstr[2] "%(value)s de googol" + +msgid "one" +msgstr "unu" + +msgid "two" +msgstr "doi" + +msgid "three" +msgstr "trei" + +msgid "four" +msgstr "patru" + +msgid "five" +msgstr "cinci" + +msgid "six" +msgstr "șase" + +msgid "seven" +msgstr "șapte" + +msgid "eight" +msgstr "opt" + +msgid "nine" +msgstr "nouă" + +msgid "today" +msgstr "astăzi" + +msgid "tomorrow" +msgstr "mâine" + +msgid "yesterday" +msgstr "ieri" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "Acum %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in +#. '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d an" +msgstr[1] "%d ani" +msgstr[2] "%d de ani" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d lună" +msgstr[1] "%d luni" +msgstr[2] "%d de luni" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d săptămână" +msgstr[1] "%d săptămâni" +msgstr[2] "%d de săptămâni" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d zi" +msgstr[1] "%d zile" +msgstr[2] "%d de zile" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d oră" +msgstr[1] "%d ore" +msgstr[2] "%d de ore" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minute" +msgstr[2] "%d de minute" + +msgid "now" +msgstr "acum" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "Acum o secundă" +msgstr[1] "Acum %(count)s secunde" +msgstr[2] "Acum %(count)s de secunde" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "Acum un minut" +msgstr[1] "Acum %(count)s minute" +msgstr[2] "Acum %(count)s de minute" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "Acum o oră" +msgstr[1] "Acum %(count)s ore" +msgstr[2] "Acum %(count)s de ore" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "În %(delta)s" + +#. Translators: 'naturaltime-future' strings will be included in +#. '%(delta)s from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d an" +msgstr[1] "%d ani" +msgstr[2] "%d de ani" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d lună" +msgstr[1] "%d luni" +msgstr[2] "%d de luni" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d săptămână" +msgstr[1] "%d săptămâni" +msgstr[2] "%d de săptămâni" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d zi" +msgstr[1] "%d zile" +msgstr[2] "%d de zile" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d oră" +msgstr[1] "%d ore" +msgstr[2] "%d de ore" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minute" +msgstr[2] "%d de minute" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "Într-o secundă" +msgstr[1] "În %(count)s secunde" +msgstr[2] "În %(count)s de secunde" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "Într-un minut" +msgstr[1] "În %(count)s minute" +msgstr[2] "În %(count)s de minute" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "Într-o oră" +msgstr[1] "În %(count)s ore" +msgstr[2] "În %(count)s de ore" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9d5f9aa Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..89c2def Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po new file mode 100644 index 0000000..81376db --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sv/LC_MESSAGES/django.po @@ -0,0 +1,398 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Andreas Pelme , 2011-2012,2014 +# Jannis Leidel , 2011 +# Jonathan Lindén, 2014 +# Petter Strandmark , 2019 +# Rasmus Précenth , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-01-29 12:35+0000\n" +"Last-Translator: Petter Strandmark \n" +"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Humanize" +msgstr "Humanisera" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}:a" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}:a" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}:e" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}:e" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f miljon" +msgstr[1] "%(value).1f miljoner" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s miljon" +msgstr[1] "%(value)s miljoner" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f miljard" +msgstr[1] "%(value).1f miljarder" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s miljard" +msgstr[1] "%(value)s miljarder" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f biljon" +msgstr[1] "%(value).1f biljoner" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s triljon" +msgstr[1] "%(value)s triljoner" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f biljard" +msgstr[1] "%(value).1f biljarder" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s biljard" +msgstr[1] "%(value)s biljarder" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f kvintiljon" +msgstr[1] "%(value).1f kvintiljoner" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s kvintiljon" +msgstr[1] "%(value)s kvintiljoner" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f triljard" +msgstr[1] "%(value).1f triljarder" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s triljard" +msgstr[1] "%(value)s triljarder" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f kvadriljon" +msgstr[1] "%(value).1f kvadriljoner" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s kvadriljon" +msgstr[1] "%(value)s kvadriljoner" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f kvadriljard" +msgstr[1] "%(value).1f kvadriljarder" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s kvadriljard" +msgstr[1] "%(value)s kvadriljarder" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f kvintiljon" +msgstr[1] "%(value).1f kvintiljoner" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s kvintiljon" +msgstr[1] "%(value)s kvintiljoner" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f kvintiljard" +msgstr[1] "%(value).1f kvintiljarder" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s kvintiljard" +msgstr[1] "%(value)s kvintiljarder" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googoler" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googoler" + +msgid "one" +msgstr "ett" + +msgid "two" +msgstr "två" + +msgid "three" +msgstr "tre" + +msgid "four" +msgstr "fyra" + +msgid "five" +msgstr "fem" + +msgid "six" +msgstr "sex" + +msgid "seven" +msgstr "sju" + +msgid "eight" +msgstr "åtta" + +msgid "nine" +msgstr "nio" + +msgid "today" +msgstr "idag" + +msgid "tomorrow" +msgstr "imorgon" + +msgid "yesterday" +msgstr "igår" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s sedan" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "en timme sedan" +msgstr[1] "%(count)s timmar sedan" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "en minut sedan" +msgstr[1] "%(count)s minuter sedan" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "en sekund sedan" +msgstr[1] "%(count)s sekunder sedan" + +msgid "now" +msgstr "nu" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "en sekund från nu" +msgstr[1] "om %(count)s sekunder" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "en minut från nu" +msgstr[1] "om %(count)s minuter" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "en timme från nu" +msgstr[1] "om %(count)s timmar" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "om %(delta)s" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d månad" +msgstr[1] "%d månader" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d vecka" +msgstr[1] "%d veckor" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dagar" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d timme" +msgstr[1] "%d timmar" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minut" +msgstr[1] "%d minuter" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d år" +msgstr[1] "%d år" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d månad" +msgstr[1] "%d månader" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d vecka" +msgstr[1] "%d veckor" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dag" +msgstr[1] "%d dagar" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d timme" +msgstr[1] "%d timmar" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuter" +msgstr[1] "%d minuter" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c0b7891 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/sw/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo new file mode 100644 index 0000000..77e9f9b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ta/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..e713265 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,357 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kowit Charoenratchatabhan , 2012,2018 +# Perry Roper , 2017 +# sipp11 , 2014 +# Vichai Vongvorakul , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2018-05-18 01:38+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Humanize" +msgstr "ทำเป็นภาษามนุษย์" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f หนึ่งล้าน" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s ล้าน" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f สิบล้าน" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s พันล้าน" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f ร้อยล้าน" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] " %(value)s ล้านล้าน" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f quadrillion" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s quadrillion" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f quintillion" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s quintillion" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f sextillion" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s sextillion" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septillion" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septillion" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f octillion" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s octillion" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonillion" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonillion" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f decillion" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s decillion" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" + +msgid "one" +msgstr "หนึ่ง" + +msgid "two" +msgstr "สอง" + +msgid "three" +msgstr "สาม" + +msgid "four" +msgstr "สี่" + +msgid "five" +msgstr "ห้า" + +msgid "six" +msgstr "หก" + +msgid "seven" +msgstr "เจ็ด" + +msgid "eight" +msgstr "แปด" + +msgid "nine" +msgstr "เก้า" + +msgid "today" +msgstr "วันนี้" + +msgid "tomorrow" +msgstr "พรุ่งนี้" + +msgid "yesterday" +msgstr "เมื่อวานนี้" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "%(count)s ชั่วโมงที่ผ่านมา" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "%(count)s นาทีที่ผ่านมา" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "%(count)s วินาทีที่ผ่านมา" + +msgid "now" +msgstr "ขณะนี้" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "%(count)s วินาทีต่อจากนี้" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "%(count)s นาทีต่อจากนี้" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "%(count)s ชั่วโมงต่อจากนี้" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..9238c99 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..9bb2363 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,400 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ahmet Emre Aladağ , 2013 +# BouRock, 2018 +# BouRock, 2014 +# Jannis Leidel , 2011 +# Metin Amiroff , 2012 +# Murat Sahin , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 09:57+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Humanize" +msgstr "İnsansı" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}." + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{}." + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f milyon" +msgstr[1] "%(value).1f milyon" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s milyon" +msgstr[1] "%(value)s milyon" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f milyar" +msgstr[1] "%(value).1f milyar" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s milyar" +msgstr[1] "%(value)s milyar" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f trilyon" +msgstr[1] "%(value).1f trilyon" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s trilyon" +msgstr[1] "%(value)s trilyon" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f katrilyon" +msgstr[1] "%(value).1f katrilyon" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s katrilyon" +msgstr[1] "%(value)s katrilyon" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f kentilyon" +msgstr[1] "%(value).1f kentilyon" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s kentilyon" +msgstr[1] "%(value)s kentilyon" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f seksilyon" +msgstr[1] "%(value).1f seksilyon" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s seksilyon" +msgstr[1] "%(value)s seksilyon" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f septilyon" +msgstr[1] "%(value).1f septilyon" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s septilyon" +msgstr[1] "%(value)s septilyon" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f oktilyon" +msgstr[1] "%(value).1f oktilyon" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s oktilyon" +msgstr[1] "%(value)s oktilyon" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f nonilyon" +msgstr[1] "%(value).1f nonilyon" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s nonilyon" +msgstr[1] "%(value)s nonilyon" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f desilyon" +msgstr[1] "%(value).1f desilyon" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s desilyon" +msgstr[1] "%(value)s desilyon" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f googol" +msgstr[1] "%(value).1f googol" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s googol" +msgstr[1] "%(value)s googol" + +msgid "one" +msgstr "bir" + +msgid "two" +msgstr "iki" + +msgid "three" +msgstr "üç" + +msgid "four" +msgstr "dört" + +msgid "five" +msgstr "beş" + +msgid "six" +msgstr "altı" + +msgid "seven" +msgstr "yedi" + +msgid "eight" +msgstr "sekiz" + +msgid "nine" +msgstr "dokuz" + +msgid "today" +msgstr "bugün" + +msgid "tomorrow" +msgstr "yarın" + +msgid "yesterday" +msgstr "dün" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s önce" + +#. Translators: 'naturaltime-past' strings will be included in +#. '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d yıl" +msgstr[1] "%d yıl" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ay" +msgstr[1] "%d ay" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hafta" +msgstr[1] "%d hafta" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dakika" +msgstr[1] "%d dakika" + +msgid "now" +msgstr "şimdi" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "bir saniye önce" +msgstr[1] "%(count)s saniye önce" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "bir dakika önce" +msgstr[1] "%(count)s dakika önce" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "bir saat önce" +msgstr[1] "%(count)s saat önce" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "şu andan itibaren %(delta)s" + +#. Translators: 'naturaltime-future' strings will be included in +#. '%(delta)s from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d yıl" +msgstr[1] "%d yıl" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d ay" +msgstr[1] "%d ay" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d hafta" +msgstr[1] "%d hafta" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d saat" +msgstr[1] "%d saat" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d dakika" +msgstr[1] "%d dakika" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "şu andan itibaren bir saniye" +msgstr[1] "şu andan itibaren %(count)s saniye" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "şu andan itibaren bir dakika" +msgstr[1] "şu andan itibaren %(count)s dakika" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "şu andan itibaren bir saat" +msgstr[1] "şu andan itibaren %(count)s saat" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo new file mode 100644 index 0000000..af7ab53 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po new file mode 100644 index 0000000..3508cf8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/udm/LC_MESSAGES/django.po @@ -0,0 +1,233 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:13+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Udmurt (http://www.transifex.com/projects/p/django/language/" +"udm/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: udm\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Humanize" +msgstr "" + +msgid "th" +msgstr "" + +msgid "st" +msgstr "" + +msgid "nd" +msgstr "" + +msgid "rd" +msgstr "" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "" + +msgid "one" +msgstr "" + +msgid "two" +msgstr "" + +msgid "three" +msgstr "" + +msgid "four" +msgstr "" + +msgid "five" +msgstr "" + +msgid "six" +msgstr "" + +msgid "seven" +msgstr "" + +msgid "eight" +msgstr "" + +msgid "nine" +msgstr "" + +msgid "today" +msgstr "" + +msgid "tomorrow" +msgstr "" + +msgid "yesterday" +msgstr "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s ago" +msgstr "" + +msgid "now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "" + +#, python-format +msgctxt "naturaltime" +msgid "%(delta)s from now" +msgstr "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "" + +#. Translators: please keep a non-breaking space (U+00A0) +#. between count and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fe9442d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/uk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..078d2e9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/ur/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6b5a01b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..d35f2bc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/humanize/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,362 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Jenny Qian , 2018 +# Lele Long , 2015 +# Ronald White , 2014 +# Suntravel Chris , 2019 +# wang zhao <672565116@qq.com>, 2018 +# Xiang Yu , 2014 +# ced773123cfad7b4e8b79ca80f736af9, 2011 +# Kevin Sze , 2012 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-16 20:42+0100\n" +"PO-Revision-Date: 2019-02-01 07:30+0000\n" +"Last-Translator: Suntravel Chris \n" +"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"language/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Humanize" +msgstr "人性化" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "第{}" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "第{}" + +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f 百万" + +#, python-format +msgid "%(value)s million" +msgid_plural "%(value)s million" +msgstr[0] "%(value)s 百万" + +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f 十亿" + +#, python-format +msgid "%(value)s billion" +msgid_plural "%(value)s billion" +msgstr[0] "%(value)s 十亿" + +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f 万亿" + +#, python-format +msgid "%(value)s trillion" +msgid_plural "%(value)s trillion" +msgstr[0] "%(value)s 万亿" + +#, python-format +msgid "%(value).1f quadrillion" +msgid_plural "%(value).1f quadrillion" +msgstr[0] "%(value).1f 1000的5次方" + +#, python-format +msgid "%(value)s quadrillion" +msgid_plural "%(value)s quadrillion" +msgstr[0] "%(value)s 1000的5次方" + +#, python-format +msgid "%(value).1f quintillion" +msgid_plural "%(value).1f quintillion" +msgstr[0] "%(value).1f 1000的4次方" + +#, python-format +msgid "%(value)s quintillion" +msgid_plural "%(value)s quintillion" +msgstr[0] "%(value)s 1000的4次方" + +#, python-format +msgid "%(value).1f sextillion" +msgid_plural "%(value).1f sextillion" +msgstr[0] "%(value).1f 1000的7次方" + +#, python-format +msgid "%(value)s sextillion" +msgid_plural "%(value)s sextillion" +msgstr[0] "%(value)s 1000的7次方" + +#, python-format +msgid "%(value).1f septillion" +msgid_plural "%(value).1f septillion" +msgstr[0] "%(value).1f 1000的8次方" + +#, python-format +msgid "%(value)s septillion" +msgid_plural "%(value)s septillion" +msgstr[0] "%(value)s 1000的8次方" + +#, python-format +msgid "%(value).1f octillion" +msgid_plural "%(value).1f octillion" +msgstr[0] "%(value).1f 1000的9次方" + +#, python-format +msgid "%(value)s octillion" +msgid_plural "%(value)s octillion" +msgstr[0] "%(value)s 1000的9次方" + +#, python-format +msgid "%(value).1f nonillion" +msgid_plural "%(value).1f nonillion" +msgstr[0] "%(value).1f 1000的10次方" + +#, python-format +msgid "%(value)s nonillion" +msgid_plural "%(value)s nonillion" +msgstr[0] "%(value)s 1000的10次方" + +#, python-format +msgid "%(value).1f decillion" +msgid_plural "%(value).1f decillion" +msgstr[0] "%(value).1f 1000的11次方" + +#, python-format +msgid "%(value)s decillion" +msgid_plural "%(value)s decillion" +msgstr[0] "%(value)s 1000的11次方" + +#, python-format +msgid "%(value).1f googol" +msgid_plural "%(value).1f googol" +msgstr[0] "%(value).1f 10的100次方" + +#, python-format +msgid "%(value)s googol" +msgid_plural "%(value)s googol" +msgstr[0] "%(value)s 10的100次方" + +msgid "one" +msgstr "一" + +msgid "two" +msgstr "二" + +msgid "three" +msgstr "三" + +msgid "four" +msgstr "四" + +msgid "five" +msgstr "五" + +msgid "six" +msgstr "六" + +msgid "seven" +msgstr "七" + +msgid "eight" +msgstr "八" + +msgid "nine" +msgstr "九" + +msgid "today" +msgstr "今天" + +msgid "tomorrow" +msgstr "明天" + +msgid "yesterday" +msgstr "昨天" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s ago" +msgstr "%(delta)s前" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour ago" +msgid_plural "%(count)s hours ago" +msgstr[0] "%(count)s小时之前" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute ago" +msgid_plural "%(count)s minutes ago" +msgstr[0] "%(count)s分钟之前" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second ago" +msgid_plural "%(count)s seconds ago" +msgstr[0] "%(count)s秒之前" + +msgid "now" +msgstr "现在" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a second from now" +msgid_plural "%(count)s seconds from now" +msgstr[0] "%(count)s秒以后" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "a minute from now" +msgid_plural "%(count)s minutes from now" +msgstr[0] "%(count)s分钟以后" + +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. +#, python-format +msgid "an hour from now" +msgid_plural "%(count)s hours from now" +msgstr[0] "%(count)s小时以后" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "%(delta)s之后" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d 年" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d月" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d 周" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d天" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d 小时" + +#, python-format +msgctxt "naturaltime-past" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d 分" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d 年" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d 月" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d 周" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d 天" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d 小时" + +#, python-format +msgctxt "naturaltime-future" +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d 分" diff --git a/venv/lib/python3.7/site-packages/django/contrib/messages/middleware.py b/venv/lib/python3.7/site-packages/django/contrib/messages/middleware.py new file mode 100644 index 0000000..d5b787c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/messages/middleware.py @@ -0,0 +1,26 @@ +from django.conf import settings +from django.contrib.messages.storage import default_storage +from django.utils.deprecation import MiddlewareMixin + + +class MessageMiddleware(MiddlewareMixin): + """ + Middleware that handles temporary messages. + """ + + def process_request(self, request): + request._messages = default_storage(request) + + def process_response(self, request, response): + """ + Update the storage backend (i.e., save the messages). + + Raise ValueError if not all messages could be stored and DEBUG is True. + """ + # A higher middleware layer may return a request which does not contain + # messages storage, so make no assumption that it will be there. + if hasattr(request, '_messages'): + unstored_messages = request._messages.update(response) + if unstored_messages and settings.DEBUG: + raise ValueError('Not all temporary messages could be stored.') + return response diff --git a/venv/lib/python3.7/site-packages/django/contrib/messages/storage/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/messages/storage/__init__.py new file mode 100644 index 0000000..373dbba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/messages/storage/__init__.py @@ -0,0 +1,12 @@ +from django.conf import settings +from django.utils.module_loading import import_string + + +def default_storage(request): + """ + Callable with the same interface as the storage classes. + + This isn't just default_storage = import_string(settings.MESSAGE_STORAGE) + to avoid accessing the settings at the module level. + """ + return import_string(settings.MESSAGE_STORAGE)(request) diff --git a/venv/lib/python3.7/site-packages/django/contrib/messages/storage/base.py b/venv/lib/python3.7/site-packages/django/contrib/messages/storage/base.py new file mode 100644 index 0000000..fd5d0c2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/messages/storage/base.py @@ -0,0 +1,170 @@ +from django.conf import settings +from django.contrib.messages import constants, utils + +LEVEL_TAGS = utils.get_level_tags() + + +class Message: + """ + Represent an actual message that can be stored in any of the supported + storage classes (typically session- or cookie-based) and rendered in a view + or template. + """ + + def __init__(self, level, message, extra_tags=None): + self.level = int(level) + self.message = message + self.extra_tags = extra_tags + + def _prepare(self): + """ + Prepare the message for serialization by forcing the ``message`` + and ``extra_tags`` to str in case they are lazy translations. + """ + self.message = str(self.message) + self.extra_tags = str(self.extra_tags) if self.extra_tags is not None else None + + def __eq__(self, other): + return isinstance(other, Message) and self.level == other.level and \ + self.message == other.message + + def __str__(self): + return str(self.message) + + @property + def tags(self): + return ' '.join(tag for tag in [self.extra_tags, self.level_tag] if tag) + + @property + def level_tag(self): + return LEVEL_TAGS.get(self.level, '') + + +class BaseStorage: + """ + This is the base backend for temporary message storage. + + This is not a complete class; to be a usable storage backend, it must be + subclassed and the two methods ``_get`` and ``_store`` overridden. + """ + + def __init__(self, request, *args, **kwargs): + self.request = request + self._queued_messages = [] + self.used = False + self.added_new = False + super().__init__(*args, **kwargs) + + def __len__(self): + return len(self._loaded_messages) + len(self._queued_messages) + + def __iter__(self): + self.used = True + if self._queued_messages: + self._loaded_messages.extend(self._queued_messages) + self._queued_messages = [] + return iter(self._loaded_messages) + + def __contains__(self, item): + return item in self._loaded_messages or item in self._queued_messages + + @property + def _loaded_messages(self): + """ + Return a list of loaded messages, retrieving them first if they have + not been loaded yet. + """ + if not hasattr(self, '_loaded_data'): + messages, all_retrieved = self._get() + self._loaded_data = messages or [] + return self._loaded_data + + def _get(self, *args, **kwargs): + """ + Retrieve a list of stored messages. Return a tuple of the messages + and a flag indicating whether or not all the messages originally + intended to be stored in this storage were, in fact, stored and + retrieved; e.g., ``(messages, all_retrieved)``. + + **This method must be implemented by a subclass.** + + If it is possible to tell if the backend was not used (as opposed to + just containing no messages) then ``None`` should be returned in + place of ``messages``. + """ + raise NotImplementedError('subclasses of BaseStorage must provide a _get() method') + + def _store(self, messages, response, *args, **kwargs): + """ + Store a list of messages and return a list of any messages which could + not be stored. + + One type of object must be able to be stored, ``Message``. + + **This method must be implemented by a subclass.** + """ + raise NotImplementedError('subclasses of BaseStorage must provide a _store() method') + + def _prepare_messages(self, messages): + """ + Prepare a list of messages for storage. + """ + for message in messages: + message._prepare() + + def update(self, response): + """ + Store all unread messages. + + If the backend has yet to be iterated, store previously stored messages + again. Otherwise, only store messages added after the last iteration. + """ + self._prepare_messages(self._queued_messages) + if self.used: + return self._store(self._queued_messages, response) + elif self.added_new: + messages = self._loaded_messages + self._queued_messages + return self._store(messages, response) + + def add(self, level, message, extra_tags=''): + """ + Queue a message to be stored. + + The message is only queued if it contained something and its level is + not less than the recording level (``self.level``). + """ + if not message: + return + # Check that the message level is not less than the recording level. + level = int(level) + if level < self.level: + return + # Add the message. + self.added_new = True + message = Message(level, message, extra_tags=extra_tags) + self._queued_messages.append(message) + + def _get_level(self): + """ + Return the minimum recorded level. + + The default level is the ``MESSAGE_LEVEL`` setting. If this is + not found, the ``INFO`` level is used. + """ + if not hasattr(self, '_level'): + self._level = getattr(settings, 'MESSAGE_LEVEL', constants.INFO) + return self._level + + def _set_level(self, value=None): + """ + Set a custom minimum recorded level. + + If set to ``None``, the default level will be used (see the + ``_get_level`` method). + """ + if value is None and hasattr(self, '_level'): + del self._level + else: + self._level = int(value) + + level = property(_get_level, _set_level, _set_level) diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/aggregates/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/aggregates/__init__.py new file mode 100644 index 0000000..4bfbd52 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/aggregates/__init__.py @@ -0,0 +1,2 @@ +from .general import * # NOQA +from .statistics import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/apps.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/apps.py new file mode 100644 index 0000000..97475de --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/apps.py @@ -0,0 +1,66 @@ +from psycopg2.extras import ( + DateRange, DateTimeRange, DateTimeTZRange, NumericRange, +) + +from django.apps import AppConfig +from django.db import connections +from django.db.backends.signals import connection_created +from django.db.migrations.writer import MigrationWriter +from django.db.models import CharField, TextField +from django.test.signals import setting_changed +from django.utils.translation import gettext_lazy as _ + +from .lookups import SearchLookup, TrigramSimilar, Unaccent +from .serializers import RangeSerializer +from .signals import register_type_handlers + +RANGE_TYPES = (DateRange, DateTimeRange, DateTimeTZRange, NumericRange) + + +def uninstall_if_needed(setting, value, enter, **kwargs): + """ + Undo the effects of PostgresConfig.ready() when django.contrib.postgres + is "uninstalled" by override_settings(). + """ + if not enter and setting == 'INSTALLED_APPS' and 'django.contrib.postgres' not in set(value): + connection_created.disconnect(register_type_handlers) + CharField._unregister_lookup(Unaccent) + TextField._unregister_lookup(Unaccent) + CharField._unregister_lookup(SearchLookup) + TextField._unregister_lookup(SearchLookup) + CharField._unregister_lookup(TrigramSimilar) + TextField._unregister_lookup(TrigramSimilar) + # Disconnect this receiver until the next time this app is installed + # and ready() connects it again to prevent unnecessary processing on + # each setting change. + setting_changed.disconnect(uninstall_if_needed) + MigrationWriter.unregister_serializer(RANGE_TYPES) + + +class PostgresConfig(AppConfig): + name = 'django.contrib.postgres' + verbose_name = _('PostgreSQL extensions') + + def ready(self): + setting_changed.connect(uninstall_if_needed) + # Connections may already exist before we are called. + for conn in connections.all(): + if conn.vendor == 'postgresql': + conn.introspection.data_types_reverse.update({ + 3802: 'django.contrib.postgres.fields.JSONField', + 3904: 'django.contrib.postgres.fields.IntegerRangeField', + 3906: 'django.contrib.postgres.fields.DecimalRangeField', + 3910: 'django.contrib.postgres.fields.DateTimeRangeField', + 3912: 'django.contrib.postgres.fields.DateRangeField', + 3926: 'django.contrib.postgres.fields.BigIntegerRangeField', + }) + if conn.connection is not None: + register_type_handlers(conn) + connection_created.connect(register_type_handlers) + CharField.register_lookup(Unaccent) + TextField.register_lookup(Unaccent) + CharField.register_lookup(SearchLookup) + TextField.register_lookup(SearchLookup) + CharField.register_lookup(TrigramSimilar) + TextField.register_lookup(TrigramSimilar) + MigrationWriter.register_serializer(RANGE_TYPES, RangeSerializer) diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/hstore.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/hstore.py new file mode 100644 index 0000000..91d58fd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/hstore.py @@ -0,0 +1,112 @@ +import json + +from django.contrib.postgres import forms, lookups +from django.contrib.postgres.fields.array import ArrayField +from django.core import exceptions +from django.db.models import Field, TextField, Transform +from django.utils.translation import gettext_lazy as _ + +from .mixins import CheckFieldDefaultMixin + +__all__ = ['HStoreField'] + + +class HStoreField(CheckFieldDefaultMixin, Field): + empty_strings_allowed = False + description = _('Map of strings to strings/nulls') + default_error_messages = { + 'not_a_string': _('The value of "%(key)s" is not a string or null.'), + } + _default_hint = ('dict', '{}') + + def db_type(self, connection): + return 'hstore' + + def get_transform(self, name): + transform = super().get_transform(name) + if transform: + return transform + return KeyTransformFactory(name) + + def validate(self, value, model_instance): + super().validate(value, model_instance) + for key, val in value.items(): + if not isinstance(val, str) and val is not None: + raise exceptions.ValidationError( + self.error_messages['not_a_string'], + code='not_a_string', + params={'key': key}, + ) + + def to_python(self, value): + if isinstance(value, str): + value = json.loads(value) + return value + + def value_to_string(self, obj): + return json.dumps(self.value_from_object(obj)) + + def formfield(self, **kwargs): + return super().formfield(**{ + 'form_class': forms.HStoreField, + **kwargs, + }) + + def get_prep_value(self, value): + value = super().get_prep_value(value) + + if isinstance(value, dict): + prep_value = {} + for key, val in value.items(): + key = str(key) + if val is not None: + val = str(val) + prep_value[key] = val + value = prep_value + + if isinstance(value, list): + value = [str(item) for item in value] + + return value + + +HStoreField.register_lookup(lookups.DataContains) +HStoreField.register_lookup(lookups.ContainedBy) +HStoreField.register_lookup(lookups.HasKey) +HStoreField.register_lookup(lookups.HasKeys) +HStoreField.register_lookup(lookups.HasAnyKeys) + + +class KeyTransform(Transform): + output_field = TextField() + + def __init__(self, key_name, *args, **kwargs): + super().__init__(*args, **kwargs) + self.key_name = key_name + + def as_sql(self, compiler, connection): + lhs, params = compiler.compile(self.lhs) + return '(%s -> %%s)' % lhs, tuple(params) + (self.key_name,) + + +class KeyTransformFactory: + + def __init__(self, key_name): + self.key_name = key_name + + def __call__(self, *args, **kwargs): + return KeyTransform(self.key_name, *args, **kwargs) + + +@HStoreField.register_lookup +class KeysTransform(Transform): + lookup_name = 'keys' + function = 'akeys' + output_field = ArrayField(TextField()) + + +@HStoreField.register_lookup +class ValuesTransform(Transform): + lookup_name = 'values' + function = 'avals' + output_field = ArrayField(TextField()) diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/ranges.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/ranges.py new file mode 100644 index 0000000..0e8a347 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/fields/ranges.py @@ -0,0 +1,274 @@ +import datetime +import json + +from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange, Range + +from django.contrib.postgres import forms, lookups +from django.db import models + +from .utils import AttributeSetter + +__all__ = [ + 'RangeField', 'IntegerRangeField', 'BigIntegerRangeField', + 'DecimalRangeField', 'DateTimeRangeField', 'DateRangeField', + 'FloatRangeField', +] + + +class RangeField(models.Field): + empty_strings_allowed = False + + def __init__(self, *args, **kwargs): + # Initializing base_field here ensures that its model matches the model for self. + if hasattr(self, 'base_field'): + self.base_field = self.base_field() + super().__init__(*args, **kwargs) + + @property + def model(self): + try: + return self.__dict__['model'] + except KeyError: + raise AttributeError("'%s' object has no attribute 'model'" % self.__class__.__name__) + + @model.setter + def model(self, model): + self.__dict__['model'] = model + self.base_field.model = model + + def get_prep_value(self, value): + if value is None: + return None + elif isinstance(value, Range): + return value + elif isinstance(value, (list, tuple)): + return self.range_type(value[0], value[1]) + return value + + def to_python(self, value): + if isinstance(value, str): + # Assume we're deserializing + vals = json.loads(value) + for end in ('lower', 'upper'): + if end in vals: + vals[end] = self.base_field.to_python(vals[end]) + value = self.range_type(**vals) + elif isinstance(value, (list, tuple)): + value = self.range_type(value[0], value[1]) + return value + + def set_attributes_from_name(self, name): + super().set_attributes_from_name(name) + self.base_field.set_attributes_from_name(name) + + def value_to_string(self, obj): + value = self.value_from_object(obj) + if value is None: + return None + if value.isempty: + return json.dumps({"empty": True}) + base_field = self.base_field + result = {"bounds": value._bounds} + for end in ('lower', 'upper'): + val = getattr(value, end) + if val is None: + result[end] = None + else: + obj = AttributeSetter(base_field.attname, val) + result[end] = base_field.value_to_string(obj) + return json.dumps(result) + + def formfield(self, **kwargs): + kwargs.setdefault('form_class', self.form_field) + return super().formfield(**kwargs) + + +class IntegerRangeField(RangeField): + base_field = models.IntegerField + range_type = NumericRange + form_field = forms.IntegerRangeField + + def db_type(self, connection): + return 'int4range' + + +class BigIntegerRangeField(RangeField): + base_field = models.BigIntegerField + range_type = NumericRange + form_field = forms.IntegerRangeField + + def db_type(self, connection): + return 'int8range' + + +class DecimalRangeField(RangeField): + base_field = models.DecimalField + range_type = NumericRange + form_field = forms.DecimalRangeField + + def db_type(self, connection): + return 'numrange' + + +class FloatRangeField(RangeField): + system_check_deprecated_details = { + 'msg': ( + 'FloatRangeField is deprecated and will be removed in Django 3.1.' + ), + 'hint': 'Use DecimalRangeField instead.', + 'id': 'fields.W902', + } + base_field = models.FloatField + range_type = NumericRange + form_field = forms.FloatRangeField + + def db_type(self, connection): + return 'numrange' + + +class DateTimeRangeField(RangeField): + base_field = models.DateTimeField + range_type = DateTimeTZRange + form_field = forms.DateTimeRangeField + + def db_type(self, connection): + return 'tstzrange' + + +class DateRangeField(RangeField): + base_field = models.DateField + range_type = DateRange + form_field = forms.DateRangeField + + def db_type(self, connection): + return 'daterange' + + +RangeField.register_lookup(lookups.DataContains) +RangeField.register_lookup(lookups.ContainedBy) +RangeField.register_lookup(lookups.Overlap) + + +class DateTimeRangeContains(models.Lookup): + """ + Lookup for Date/DateTimeRange containment to cast the rhs to the correct + type. + """ + lookup_name = 'contains' + + def process_rhs(self, compiler, connection): + # Transform rhs value for db lookup. + if isinstance(self.rhs, datetime.date): + output_field = models.DateTimeField() if isinstance(self.rhs, datetime.datetime) else models.DateField() + value = models.Value(self.rhs, output_field=output_field) + self.rhs = value.resolve_expression(compiler.query) + return super().process_rhs(compiler, connection) + + def as_sql(self, compiler, connection): + lhs, lhs_params = self.process_lhs(compiler, connection) + rhs, rhs_params = self.process_rhs(compiler, connection) + params = lhs_params + rhs_params + # Cast the rhs if needed. + cast_sql = '' + if ( + isinstance(self.rhs, models.Expression) and + self.rhs._output_field_or_none and + # Skip cast if rhs has a matching range type. + not isinstance(self.rhs._output_field_or_none, self.lhs.output_field.__class__) + ): + cast_internal_type = self.lhs.output_field.base_field.get_internal_type() + cast_sql = '::{}'.format(connection.data_types.get(cast_internal_type)) + return '%s @> %s%s' % (lhs, rhs, cast_sql), params + + +DateRangeField.register_lookup(DateTimeRangeContains) +DateTimeRangeField.register_lookup(DateTimeRangeContains) + + +class RangeContainedBy(models.Lookup): + lookup_name = 'contained_by' + type_mapping = { + 'integer': 'int4range', + 'bigint': 'int8range', + 'double precision': 'numrange', + 'date': 'daterange', + 'timestamp with time zone': 'tstzrange', + } + + def as_sql(self, qn, connection): + field = self.lhs.output_field + if isinstance(field, models.FloatField): + sql = '%s::numeric <@ %s::{}'.format(self.type_mapping[field.db_type(connection)]) + else: + sql = '%s <@ %s::{}'.format(self.type_mapping[field.db_type(connection)]) + lhs, lhs_params = self.process_lhs(qn, connection) + rhs, rhs_params = self.process_rhs(qn, connection) + params = lhs_params + rhs_params + return sql % (lhs, rhs), params + + def get_prep_lookup(self): + return RangeField().get_prep_value(self.rhs) + + +models.DateField.register_lookup(RangeContainedBy) +models.DateTimeField.register_lookup(RangeContainedBy) +models.IntegerField.register_lookup(RangeContainedBy) +models.BigIntegerField.register_lookup(RangeContainedBy) +models.FloatField.register_lookup(RangeContainedBy) + + +@RangeField.register_lookup +class FullyLessThan(lookups.PostgresSimpleLookup): + lookup_name = 'fully_lt' + operator = '<<' + + +@RangeField.register_lookup +class FullGreaterThan(lookups.PostgresSimpleLookup): + lookup_name = 'fully_gt' + operator = '>>' + + +@RangeField.register_lookup +class NotLessThan(lookups.PostgresSimpleLookup): + lookup_name = 'not_lt' + operator = '&>' + + +@RangeField.register_lookup +class NotGreaterThan(lookups.PostgresSimpleLookup): + lookup_name = 'not_gt' + operator = '&<' + + +@RangeField.register_lookup +class AdjacentToLookup(lookups.PostgresSimpleLookup): + lookup_name = 'adjacent_to' + operator = '-|-' + + +@RangeField.register_lookup +class RangeStartsWith(models.Transform): + lookup_name = 'startswith' + function = 'lower' + + @property + def output_field(self): + return self.lhs.output_field.base_field + + +@RangeField.register_lookup +class RangeEndsWith(models.Transform): + lookup_name = 'endswith' + function = 'upper' + + @property + def output_field(self): + return self.lhs.output_field.base_field + + +@RangeField.register_lookup +class IsEmpty(models.Transform): + lookup_name = 'isempty' + function = 'isempty' + output_field = models.BooleanField() diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/functions.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/functions.py new file mode 100644 index 0000000..819ce05 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/functions.py @@ -0,0 +1,11 @@ +from django.db.models import DateTimeField, Func, UUIDField + + +class RandomUUID(Func): + template = 'GEN_RANDOM_UUID()' + output_field = UUIDField() + + +class TransactionNow(Func): + template = 'CURRENT_TIMESTAMP' + output_field = DateTimeField() diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html b/venv/lib/python3.7/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html new file mode 100644 index 0000000..32fda82 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/jinja2/postgres/widgets/split_array.html @@ -0,0 +1 @@ +{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d7b2064 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3ec4c9b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..05c9162 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,112 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Emin Mastizada , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-09-09 13:45+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL uzantıları" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Array-dəki %(nth)s element təsdiqlənə bilmir:" + +msgid "Nested arrays must have the same length." +msgstr "İç-içə array-lərin uzunluğu eyni olmalıdır." + +msgid "Map of strings to strings/nulls" +msgstr "String-lərin string/null-lara xəritələnmə cədvəli" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "\"%(key)s\" dəyəri string və ya null deyil." + +msgid "A JSON object" +msgstr "JSON obyekt" + +msgid "Value must be valid JSON." +msgstr "Dəyər düzgün JSON olmalıdır." + +msgid "Could not load JSON data." +msgstr "JSON məlumat yüklənə bilmir." + +msgid "Input must be a JSON dictionary." +msgstr "Giriş JSON lüğət olmalıdır." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' dəyəri düzgün JSON olmalıdır." + +msgid "Enter two valid values." +msgstr "İki düzgün dəyər daxil edin." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Aralığın başlanğıcı bitişindən böyük ola bilməz." + +msgid "Enter two whole numbers." +msgstr "İki tam rəqəm daxil edin." + +msgid "Enter two numbers." +msgstr "İki rəqəm daxil edin." + +msgid "Enter two valid date/times." +msgstr "İki düzgün tarix/vaxt daxil edin." + +msgid "Enter two valid dates." +msgstr "İki düzgün tarix daxil edin." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər." +msgstr[1] "" +"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər." +msgstr[1] "" +"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Bəzi açarlar əksikdir: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Bəzi bilinməyən açarlar təchiz edilib: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Bu aralığın %(limit_value)s və ya daha az olduğuna əmin olun." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Bu aralığın %(limit_value)s və ya daha böyük olduğuna əmin olun." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po new file mode 100644 index 0000000..31bc191 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/be/LC_MESSAGES/django.po @@ -0,0 +1,132 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2015 +# znotdead , 2016-2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-21 22:44+0000\n" +"Last-Translator: znotdead \n" +"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"be/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "PostgreSQL extensions" +msgstr "Пашырэнні PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate: " +msgstr "Элемент масіву нумар %(nth)s не прайшоў праверкі:" + +msgid "Nested arrays must have the same length." +msgstr "Укладзенныя масівы павінны мець аднолькавую даўжыню." + +msgid "Map of strings to strings/nulls" +msgstr "Адпаведнасць радкоў у радкі/нулі" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Значэнне \"%(key)s\" не з'яўляецца радком ці нулём." + +msgid "A JSON object" +msgstr "JSON аб’ект" + +msgid "Value must be valid JSON." +msgstr "Значэнне павінна быць сапраўдным JSON." + +msgid "Could not load JSON data." +msgstr "Не атрымалася загрузіць дадзеныя JSON." + +msgid "Input must be a JSON dictionary." +msgstr "Значэнне павінна быць JSON слоўнікам. " + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' значэнне павінна быць сапраўдным JSON." + +msgid "Enter two valid values." +msgstr "Увядзіце два сапраўдных значэнні." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Пачатак дыяпазону не павінен перавышаць канец дыяпазону." + +msgid "Enter two whole numbers." +msgstr "Увядзіце два цэлых лікі." + +msgid "Enter two numbers." +msgstr "Увядзіце два лікі." + +msgid "Enter two valid date/times." +msgstr "Увядзіце дзве/два сапраўдных даты/часу." + +msgid "Enter two valid dates." +msgstr "Увядзіце дзве сапраўдных даты." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Спіс мае %(show_value)d элемент, ён павінен мець не болей чым " +"%(limit_value)d." +msgstr[1] "" +"Спіс мае %(show_value)d элемента, ён павінен мець не болей чым " +"%(limit_value)d." +msgstr[2] "" +"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым " +"%(limit_value)d." +msgstr[3] "" +"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Спіс мае %(show_value)d элемент, ён павінен мець не менш чым %(limit_value)d." +msgstr[1] "" +"Спіс мае %(show_value)d элемента, ён павінен мець не менш чым " +"%(limit_value)d." +msgstr[2] "" +"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым " +"%(limit_value)d." +msgstr[3] "" +"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Не хапае нейкіх ключоў: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Дадзены нейкія невядомыя ключы: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Упэўніцеся, что ўсе элементы гэтага інтэрвалу менш ці раўны %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Упэўніцеся, что ўсе элементы гэтага інтэрвалу больш ці раўны %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..fa3b714 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,121 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2015,2017 +# duub qnnp, 2015 +# Gil Obradors Via , 2019 +# Roger Pons , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2019-01-29 07:53+0000\n" +"Last-Translator: Gil Obradors Via \n" +"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "Extensions de PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "L'element %(nth)s de la matriu no s'ha pogut validar:" + +msgid "Nested arrays must have the same length." +msgstr "Les matrius niades han de tenir la mateixa longitud." + +msgid "Map of strings to strings/nulls" +msgstr "Mapa de cadenes a cadenes/nuls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "El valor de \"%(key)s no és ni una cadena ni un nul." + +msgid "A JSON object" +msgstr "Un objecte JSON" + +msgid "Value must be valid JSON." +msgstr "El valor ha de ser JSON vàlid." + +msgid "Could not load JSON data." +msgstr "No es poden carregar les dades JSON" + +msgid "Input must be a JSON dictionary." +msgstr "L'entrada ha de ser un diccionari JSON" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "El valor '%(value)s' ha de ser JSON vàlid." + +msgid "Enter two valid values." +msgstr "Introdueixi dos valors vàlids." + +msgid "The start of the range must not exceed the end of the range." +msgstr "L'inici del rang no pot excedir el seu final." + +msgid "Enter two whole numbers." +msgstr "Introduïu dos números enters positius." + +msgid "Enter two numbers." +msgstr "Introduïu dos números." + +msgid "Enter two valid date/times." +msgstr "Introduïu dues data/hora vàlides." + +msgid "Enter two valid dates." +msgstr "Introduïu dos dates vàlides." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"La llista conté %(show_value)d element, no n'hauria de tenir més de " +"%(limit_value)d." +msgstr[1] "" +"La llista conté %(show_value)d elements, no n'hauria de tenir més de " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"La llista conté %(show_value)d element, no n'hauria de contenir menys de " +"%(limit_value)d." +msgstr[1] "" +"La llista conté %(show_value)d elements, no n'hauria de contenir menys de " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Algunes claus no hi són: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "S'han facilitat claus desconegudes: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Asseguri's que aquest rang és completament menor o igual a %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Asseguri's que aquest rang és completament major o igual a %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ad310e8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..ae494de --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,120 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Erik Wognsen , 2015-2018 +# valberg , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 20:41+0000\n" +"Last-Translator: Erik Wognsen \n" +"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL udvidelser" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Element %(nth)s i array'et blev ikke valideret:" + +msgid "Nested arrays must have the same length." +msgstr "Indlejrede arrays skal have den samme længde." + +msgid "Map of strings to strings/nulls" +msgstr "Afbildning fra strenge til strenge/nulls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Værdien af \"%(key)s\" er ikke en streng eller null." + +msgid "A JSON object" +msgstr "Et JSON-objekt." + +msgid "Value must be valid JSON." +msgstr "Værdien skal være gyldig JSON." + +msgid "Could not load JSON data." +msgstr "Kunne ikke indlæse JSON-data." + +msgid "Input must be a JSON dictionary." +msgstr "Input skal være et JSON-dictionary." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s'-værdien skal være gyldig JSON." + +msgid "Enter two valid values." +msgstr "Indtast to gyldige værdier." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Starten af intervallet kan ikke overstige slutningen af intervallet." + +msgid "Enter two whole numbers." +msgstr "Indtast to heltal." + +msgid "Enter two numbers." +msgstr "Indtast to tal." + +msgid "Enter two valid date/times." +msgstr "Indtast to gyldige dato/tider." + +msgid "Enter two valid dates." +msgstr "Indtast to gyldige datoer." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Listen indeholder %(show_value)d element, en bør ikke indeholde mere end " +"%(limit_value)d." +msgstr[1] "" +"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mere end " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Listen indeholder %(show_value)d element, den bør ikke indeholde mindre end " +"%(limit_value)d." +msgstr[1] "" +"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mindre " +"end %(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Nøgler mangler: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Ukendte nøgler angivet: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Sørg for at dette interval er fuldstændigt mindre end eller lig med " +"%(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Sørg for at dette interval er fuldstændigt større end eller lig med " +"%(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..af9b2fd --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,128 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2015-01-18 20:56+0100\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: contrib/postgres/apps.py:13 +msgid "PostgreSQL extensions" +msgstr "" + +#: contrib/postgres/fields/array.py:22 contrib/postgres/forms/array.py:16 +#: contrib/postgres/forms/array.py:170 +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "" + +#: contrib/postgres/fields/array.py:23 +msgid "Nested arrays must have the same length." +msgstr "" + +#: contrib/postgres/fields/hstore.py:16 +msgid "Map of strings to strings/nulls" +msgstr "" + +#: contrib/postgres/fields/hstore.py:18 +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "" + +#: contrib/postgres/fields/jsonb.py:32 +msgid "A JSON object" +msgstr "" + +#: contrib/postgres/fields/jsonb.py:34 +msgid "Value must be valid JSON." +msgstr "" + +#: contrib/postgres/forms/hstore.py:16 +msgid "Could not load JSON data." +msgstr "" + +#: contrib/postgres/forms/hstore.py:17 +msgid "Input must be a JSON dictionary." +msgstr "" + +#: contrib/postgres/forms/jsonb.py:19 +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "" + +#: contrib/postgres/forms/ranges.py:16 +msgid "Enter two valid values." +msgstr "" + +#: contrib/postgres/forms/ranges.py:17 +msgid "The start of the range must not exceed the end of the range." +msgstr "" + +#: contrib/postgres/forms/ranges.py:64 +msgid "Enter two whole numbers." +msgstr "" + +#: contrib/postgres/forms/ranges.py:70 +msgid "Enter two numbers." +msgstr "" + +#: contrib/postgres/forms/ranges.py:76 +msgid "Enter two valid date/times." +msgstr "" + +#: contrib/postgres/forms/ranges.py:82 +msgid "Enter two valid dates." +msgstr "" + +#: contrib/postgres/validators.py:12 +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#: contrib/postgres/validators.py:19 +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#: contrib/postgres/validators.py:29 +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "" + +#: contrib/postgres/validators.py:30 +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "" + +#: contrib/postgres/validators.py:70 +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" + +#: contrib/postgres/validators.py:76 +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..43ba4dc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,118 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ramiro Morales, 2015-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-07-31 16:47+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "Extensiones PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "La validación del ítem %(nth)s del arreglo falló:" + +msgid "Nested arrays must have the same length." +msgstr "Los arreglos anidados deben ser de la misma longitud." + +msgid "Map of strings to strings/nulls" +msgstr "Mapa de cadenas a cadenas/nulos" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "El valor de \"%(key)s\" no es una cadena o nulo." + +msgid "A JSON object" +msgstr "Un objeto JSON" + +msgid "Value must be valid JSON." +msgstr "El valor debe ser JSON válido." + +msgid "Could not load JSON data." +msgstr "No se han podido cargar los datos JSON." + +msgid "Input must be a JSON dictionary." +msgstr "debe ser un diccionario JSON." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "El valor de '%(value)s' debe ser JSON válido." + +msgid "Enter two valid values." +msgstr "Introduzca dos valores válidos." + +msgid "The start of the range must not exceed the end of the range." +msgstr "El inicio del rango no debe ser mayor que el fin del rango." + +msgid "Enter two whole numbers." +msgstr "Introduzca dos números enteros." + +msgid "Enter two numbers." +msgstr "Introduzca dos números." + +msgid "Enter two valid date/times." +msgstr "Introduzca dos fechas/horas válidas." + +msgid "Enter two valid dates." +msgstr "Introduzca dos fechas válidas." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"La lista contiene %(show_value)d ítem, debe contener no mas de " +"%(limit_value)d." +msgstr[1] "" +"La lista contiene %(show_value)d ítems, debe contener no mas de " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"La lista contiene %(show_value)d ítem, debe contener no mas de " +"%(limit_value)d." +msgstr[1] "" +"La lista contiene %(show_value)d ítems, debe contener no menos de " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "No se encontraron algunas llaves: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Algunas de las llaves provistas son desconocidas: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Asegúrese de que este rango es completamente menor o igual a %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Asegúrese de que este rango es completamente mayor o igual a %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e5222a3 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2437a00 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/eu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2189a01 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..38abae1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,120 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015,2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-21 22:44+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL-laajennukset" + +#, python-format +msgid "Item %(nth)s in the array did not validate: " +msgstr "Taulukon %(nth)s alkio ei ole kelvollinen:" + +msgid "Nested arrays must have the same length." +msgstr "Sisäkkäisillä taulukoilla tulee olla sama pituus." + +msgid "Map of strings to strings/nulls" +msgstr "Kartta merkkijonoista merkkijonoihin tai tyhjiin (null)" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Avaimen \"%(key)s\" arvo ei ole merkkijono tai tyhjä (null)." + +msgid "A JSON object" +msgstr "JSON-tietue" + +msgid "Value must be valid JSON." +msgstr "Arvon pitää olla kelvollista JSONia." + +msgid "Could not load JSON data." +msgstr "JSON-dataa ei voitu ladata." + +msgid "Input must be a JSON dictionary." +msgstr "Syötteen tulee olla JSON-sanakirja." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "%(value)s-arvo tulee olla kelvollista JSONia." + +msgid "Enter two valid values." +msgstr "Anna kaksi oikeaa arvoa." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Alueen alku pitää olla pienempi kuin alueen loppu." + +msgid "Enter two whole numbers." +msgstr "Anna kaksi kokonaislukua." + +msgid "Enter two numbers." +msgstr "Anna kaksi lukua." + +msgid "Enter two valid date/times." +msgstr "Anna kaksi oikeaa päivämäärää/kellonaikaa." + +msgid "Enter two valid dates." +msgstr "Anna kaksi oikeaa päivämäärää." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Listassa on %(show_value)d arvo, mutta siinä ei saa olla enempää kuin " +"%(limit_value)d." +msgstr[1] "" +"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla enempää kuin " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Listassa on %(show_value)d arvo, mutta siinä ei saa olla vähempää kuin " +"%(limit_value)d arvoa." +msgstr[1] "" +"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla vähempää kuin " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Joitain avaimia puuttuu: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Tuntemattomia avaimia annettiin: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Tämän alueen tulee olla kokonaisuudessaan yhtäsuuri tai pienempi kuin " +"%(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Tämän alueen tulee olla kokonaisuudessaan yhtäsuuri tai suurempi kuin " +"%(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..24b48dc Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/gd/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..37a014e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..29812f4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,129 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-26 10:59+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "PostgreSQL extensions" +msgstr "Rozšěrjenja PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Zapisk %(nth)s w pólnym wariabli njeje so wokrućił:" + +msgid "Nested arrays must have the same length." +msgstr "Zakašćikowane pólne wariable maja samsnu dołhosć." + +msgid "Map of strings to strings/nulls" +msgstr "Konwertowanje znamješkowych rjećazkow do znamješkowych rjećazkow/nulow" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Hódnota \" %(key)s\" znamješkowy rjećazk abo null njeje." + +msgid "A JSON object" +msgstr "JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Hódnota dyrbi płaćiwy JSON być." + +msgid "Could not load JSON data." +msgstr "JSON-daty njedachu so začitać." + +msgid "Input must be a JSON dictionary." +msgstr "Zapodaće dyrbi JSON-słownik być." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "Hódnota '%(value)s' dyrbi płaćiwy JSON być." + +msgid "Enter two valid values." +msgstr "Zapodajće dwě płaćiwej hódnoće." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Spočatk wobłuka njesmě kónc wobłuka překročić." + +msgid "Enter two whole numbers." +msgstr "Zapodajće dwě cyłej ličbje." + +msgid "Enter two numbers." +msgstr "Zapodajće dwě ličbje." + +msgid "Enter two valid date/times." +msgstr "Zapódajće dwě płaćiwej datowej/časowej podaći." + +msgid "Enter two valid dates." +msgstr "Zapodajće dwě płaćiwej datowej podaći." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Lisćina %(show_value)d element wobsahuje, wona njeměła wjace hač " +"%(limit_value)d wobsahować." +msgstr[1] "" +"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła wjace hač " +"%(limit_value)d wobsahować." +msgstr[2] "" +"Lisćina %(show_value)d elementy wobsahuje, wona njeměła wjace hač " +"%(limit_value)d wobsahować." +msgstr[3] "" +"Lisćina %(show_value)d elementow wobsahuje, wona njeměła wjace hač " +"%(limit_value)d wobsahować." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Lisćina %(show_value)d element wobsahuje, wona njeměła mjenje hač " +"%(limit_value)d wobsahować." +msgstr[1] "" +"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła mjenje hač " +"%(limit_value)d wobsahować." +msgstr[2] "" +"Lisćina %(show_value)d elementy wobsahuje, wona njeměła mjenje hač " +"%(limit_value)d wobsahować." +msgstr[3] "" +"Lisćina %(show_value)d elementow wobsahuje, wona njeměła mjenje hač " +"%(limit_value)d wobsahować." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Někotre kluče faluje: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Někotre njeznate kluče su so podali: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Zawěsćće. zo tutón wobłuk je mjeńši hač abo runja %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Zawěsćće, zo tutón wobłuk je wjetši hač abo runja %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 0000000..b548ba9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,119 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-11-01 20:43+0000\n" +"Last-Translator: Ruben Harutyunov \n" +"Language-Team: Armenian (http://www.transifex.com/django/django/language/" +"hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL հավելվածներ" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "" + +msgid "Nested arrays must have the same length." +msgstr "Ներդրված մասսիվները պետք է ունենան նույն երկարությունը" + +msgid "Map of strings to strings/nulls" +msgstr "" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "" + +msgid "A JSON object" +msgstr "JSON օբյեկտ" + +msgid "Value must be valid JSON." +msgstr "Արժեքը պետք է լինի վավերական JSON" + +msgid "Could not load JSON data." +msgstr "Չհաջողվեց բեռնել JSON տվյալները" + +msgid "Input must be a JSON dictionary." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' արժեքը պետք է լինի վավերական JSON" + +msgid "Enter two valid values." +msgstr "Մուտքագրեք երկու վավերական արժեք" + +msgid "The start of the range must not exceed the end of the range." +msgstr "Ինտերվալի սկիզբը չպետք է գերազանցի նրա ավարտը" + +msgid "Enter two whole numbers." +msgstr "Մուտքագրեք երկու ամբողջ թիվ" + +msgid "Enter two numbers." +msgstr "Մուտքագրեք երկու թիվ" + +msgid "Enter two valid date/times." +msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր/ժամանակ" + +msgid "Enter two valid dates." +msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " +"%(limit_value)d֊ից ոչ ավելի էլեմենտ" +msgstr[1] "" +"Ցուցակը պարունակում է %(show_value)d էլեմենտները, բայց այն պետք է պարունակի " +"%(limit_value)d֊ից ոչ ավելի էլեմենտ" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " +"%(limit_value)d֊ից ոչ պակաս էլեմենտ" +msgstr[1] "" +"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի " +"%(limit_value)d֊ից ոչ պակաս էլեմենտ" + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Որոշ բանալիներ պակասում են՝ %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Տրամադրվել են որոշ անհայտ բանալիներ՝ %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Համոզվեք, որ տիրույթին պատկանող արժեքները փոքր են, կամ հավասար " +"%(limit_value)s֊ի" + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Համոզվեք, որ տիրույթին պատկանող արժեքները մեծ են, կամ հավասար " +"%(limit_value)s֊ի" diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..d9c741d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,108 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-19 16:49+0100\n" +"PO-Revision-Date: 2017-09-21 22:44+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "Extensiones PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate: " +msgstr "Le elemento %(nth)s in le array non passava validation:" + +msgid "Nested arrays must have the same length." +msgstr "Arrays annidate debe haber le mesme longitude." + +msgid "Map of strings to strings/nulls" +msgstr "" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "" + +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + +msgid "Could not load JSON data." +msgstr "" + +msgid "Input must be a JSON dictionary." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "" + +msgid "Enter two valid values." +msgstr "" + +msgid "The start of the range must not exceed the end of the range." +msgstr "" + +msgid "Enter two whole numbers." +msgstr "" + +msgid "Enter two numbers." +msgstr "" + +msgid "Enter two valid date/times." +msgstr "" + +msgid "Enter two valid dates." +msgstr "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1e043bd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..acf7fb3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,118 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Thordur Sigurdsson , 2016-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-07-19 02:52+0000\n" +"Last-Translator: Thordur Sigurdsson \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL viðbætur" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Hlutur %(nth)s í listanum er ógildur:" + +msgid "Nested arrays must have the same length." +msgstr "Faldaðir (nested) listar verða að vera af sömu lengd." + +msgid "Map of strings to strings/nulls" +msgstr "Möppun strengja í strengi/null" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Gildið á \"%(key)s\" er ekki strengur eða null." + +msgid "A JSON object" +msgstr "JSON hlutur" + +msgid "Value must be valid JSON." +msgstr "Gildi verður að vera gilt JSON." + +msgid "Could not load JSON data." +msgstr "Gat ekki hlaðið inn JSON gögnum." + +msgid "Input must be a JSON dictionary." +msgstr "Inntak verður að vera JSON hlutur (dictionary)." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "Gildi '%(value)s' verður að vera gilt JSON." + +msgid "Enter two valid values." +msgstr "Sláðu inn tvö gild gildi." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Upphaf bils má ekki ná yfir endalok bils." + +msgid "Enter two whole numbers." +msgstr "Sláðu inn tvær heilar tölur." + +msgid "Enter two numbers." +msgstr "Sláðu inn tvær tölur." + +msgid "Enter two valid date/times." +msgstr "Sláðu inn tvær gildar dagsetningar ásamt tíma." + +msgid "Enter two valid dates." +msgstr "Sláðu inn tvær gildar dagsetningar." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda fleiri en " +"%(limit_value)d." +msgstr[1] "" +"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda fleiri en " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda færri en " +"%(limit_value)d." +msgstr[1] "" +"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda færri en " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Þessa lykla vantar: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Þessir óþekktu lyklar fundust: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Gakktu úr skugga um að þetta bil sé minna eða jafnt og %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Gakktu úr skugga um að þetta bil sé stærra eða jafnt og %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..c52dcfa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,108 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# André Bouatchidzé , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 03:42+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL-ის გაფართოებები" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "" + +msgid "Nested arrays must have the same length." +msgstr "" + +msgid "Map of strings to strings/nulls" +msgstr "" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "" + +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + +msgid "Could not load JSON data." +msgstr "" + +msgid "Input must be a JSON dictionary." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "" + +msgid "Enter two valid values." +msgstr "" + +msgid "The start of the range must not exceed the end of the range." +msgstr "" + +msgid "Enter two whole numbers." +msgstr "შეიყვანეთ ორი მთელი რიცხვი." + +msgid "Enter two numbers." +msgstr "შეიყვანეთ ორი რიცხვი." + +msgid "Enter two valid date/times." +msgstr "" + +msgid "Enter two valid dates." +msgstr "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d602e5b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po new file mode 100644 index 0000000..267dbd3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/kk/LC_MESSAGES/django.po @@ -0,0 +1,107 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Leo Trubach , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 03:42+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kk\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL кеңейтулері" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "" + +msgid "Nested arrays must have the same length." +msgstr "Бір-бірін ішіне салынған ауқымдардың ұзындықтары бірдей болу керек" + +msgid "Map of strings to strings/nulls" +msgstr "" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "" + +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + +msgid "Could not load JSON data." +msgstr "" + +msgid "Input must be a JSON dictionary." +msgstr "" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "" + +msgid "Enter two valid values." +msgstr "" + +msgid "The start of the range must not exceed the end of the range." +msgstr "" + +msgid "Enter two whole numbers." +msgstr "" + +msgid "Enter two numbers." +msgstr "" + +msgid "Enter two valid date/times." +msgstr "" + +msgid "Enter two valid dates." +msgstr "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a7695cb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..7fc5841 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,114 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# hoseung2 , 2017 +# Gihun Ham , 2018 +# JunGu Kang , 2015 +# 조민권 , 2016 +# minsung kang, 2015 +# Subin Choi , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-10-07 03:06+0000\n" +"Last-Translator: Gihun Ham \n" +"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL 확장" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "배열 안에 있는 항목 1%(nth)s가 올바르지 않습니다:" + +msgid "Nested arrays must have the same length." +msgstr "네스팅된 배열은 반드시 같은 길이를 가져야 합니다." + +msgid "Map of strings to strings/nulls" +msgstr "문자열을 문자열/null 에 매핑" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "\"%(key)s\"의 값은 문자열 또는 null이 아닙니다." + +msgid "A JSON object" +msgstr "JSON 객체" + +msgid "Value must be valid JSON." +msgstr "올바른 JSON 형식이여야 합니다." + +msgid "Could not load JSON data." +msgstr "JSON 데이터를 불러오지 못했습니다." + +msgid "Input must be a JSON dictionary." +msgstr "입력은 JSON 사전이어야만 합니다." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' 값은 올바른 JSON 형식이여야 합니다." + +msgid "Enter two valid values." +msgstr "유효한 두 값을 입력하세요." + +msgid "The start of the range must not exceed the end of the range." +msgstr "범위의 시작은 끝보다 클 수 없습니다." + +msgid "Enter two whole numbers." +msgstr "두 정수를 입력하세요." + +msgid "Enter two numbers." +msgstr "두 숫자를 입력하세요." + +msgid "Enter two valid date/times." +msgstr "올바른 날짜/시각 두 개를 입력하세요." + +msgid "Enter two valid dates." +msgstr "올바른 날짜 두 개를 입력하세요." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"리스트는 %(show_value)d 아이템들을 포함하며, %(limit_value)d를 초과해서 포함" +"할 수 없습니다." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"리스트는 %(show_value)d 아이템들을 포함하며, %(limit_value)d 이상 포함해야 합" +"니다." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "일부 키가 누락되어있습니다: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "일부 알 수 없는 키가 제공되었습니다. : %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "주어진 범위가 %(limit_value)s 보다 작거나 같은지 확인하십시오." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "주어진 범위가 %(limit_value)s 보다 크거나 같은지 확인하십시오." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..de56075 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,130 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Matas Dailyda , 2015-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 08:24+0000\n" +"Last-Translator: Matas Dailyda \n" +"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" +"lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " +"11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " +"1 : n % 1 != 0 ? 2: 3);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL plėtiniai" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "%(nth)s elementų masyve yra nevalidžių:" + +msgid "Nested arrays must have the same length." +msgstr "Iterpti vienas į kitą masyvai turi būti vienodo ilgio." + +msgid "Map of strings to strings/nulls" +msgstr "Susietos tekstinės reikšmės su tekstinėmis reikšmėmis/nulls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "\"%(key)s\" reikšmė nėra tekstinė arba null." + +msgid "A JSON object" +msgstr "JSON objektas" + +msgid "Value must be valid JSON." +msgstr "Reikšmė turi būti tinkamas JSON." + +msgid "Could not load JSON data." +msgstr "Nepavyko užkrauti JSON duomenų." + +msgid "Input must be a JSON dictionary." +msgstr "Įvestis turi būti JSON žodynas." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' reikšmė turi būti tinkamas JSON." + +msgid "Enter two valid values." +msgstr "Įveskite dvi tinkamas reikšmes." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Diapazono pradžia negali būti didesnė už diapazono pabaigą." + +msgid "Enter two whole numbers." +msgstr "Įveskite du sveikus skaičius." + +msgid "Enter two numbers." +msgstr "Įveskite du skaičius." + +msgid "Enter two valid date/times." +msgstr "Įveskite dvi tinkamas datas/laikus." + +msgid "Enter two valid dates." +msgstr "Įveskite dvi tinkamas datas." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Sąrašas turi %(show_value)d elementą. Sąrašas neturėtų turėti daugiau " +"elementų nei %(limit_value)d." +msgstr[1] "" +"Sąrašas turi %(show_value)d elementus. Sąrašas neturėtų turėti daugiau " +"elementų nei %(limit_value)d." +msgstr[2] "" +"Sąrašas turi %(show_value)d elementų. Sąrašas neturėtų turėti daugiau " +"elementų nei %(limit_value)d." +msgstr[3] "" +"Sąrašas turi %(show_value)d elementų. Sąrašas neturėtų turėti daugiau " +"elementų nei %(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Sąrašas turi %(show_value)d elementą. Sąrašas turėtų turėti daugiau elementų " +"nei %(limit_value)d." +msgstr[1] "" +"Sąrašas turi %(show_value)d elementus. Sąrašas turėtų turėti daugiau " +"elementų nei %(limit_value)d." +msgstr[2] "" +"Sąrašas turi %(show_value)d elementų. Sąrašas turėtų turėti daugiau elementų " +"nei %(limit_value)d." +msgstr[3] "" +"Sąrašas turi %(show_value)d elementų. Sąrašas turėtų turėti daugiau elementų " +"nei %(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Kai kurių reikšmių nėra: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Buvo pateiktos kelios nežinomos reikšmės: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Įsitikinkite kad diapazonas yra mažesnis arba lygus %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Įsitikinkite kad diapazonas yra didesnis arba lygus %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2fc4c59 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d363633 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/mn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..c154fcb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,117 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jon , 2015-2016 +# Jon , 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-07-30 11:31+0000\n" +"Last-Translator: Jon \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL-utvidelser" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Element %(nth)s i arrayen validerte ikke:" + +msgid "Nested arrays must have the same length." +msgstr "Nøstede arrays må ha samme lengde." + +msgid "Map of strings to strings/nulls" +msgstr "Oversikt over strenger til strenger/nulls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Verdien av \"%(key)s\" er ikke en streng eller null." + +msgid "A JSON object" +msgstr "Et JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Verdi må være gyldig JSON." + +msgid "Could not load JSON data." +msgstr "Kunne ikke laste JSON-data." + +msgid "Input must be a JSON dictionary." +msgstr "Input må være en JSON-dictionary." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s'-verdien må være gyldig JSON." + +msgid "Enter two valid values." +msgstr "Oppgi to gyldige verdier." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Starten på serien må ikke overstige enden av serien." + +msgid "Enter two whole numbers." +msgstr "Oppgi to heltall." + +msgid "Enter two numbers." +msgstr "Oppgi to tall." + +msgid "Enter two valid date/times." +msgstr "Oppgi to gyldige datoer og tidspunkter." + +msgid "Enter two valid dates." +msgstr "Oppgi to gyldige datoer." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Listen inneholder %(show_value)d element, den bør ikke inneholde mer enn " +"%(limit_value)d." +msgstr[1] "" +"Listen inneholder %(show_value)d elementer, den bør ikke inneholde mer enn " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Listen inneholder %(show_value)d element, den bør ikke inneholde færre enn " +"%(limit_value)d." +msgstr[1] "" +"Listen inneholder %(show_value)d elementer, den bør ikke inneholde færre enn " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Noen nøkler manglet: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Noen ukjente nøkler ble oppgitt: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Sørg for at denne serien er helt mindre enn eller lik %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Sørg for at denne serien er helt større enn eller lik %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0c8f012 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c02061e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..4c6fe38 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..f02af8d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,126 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Andre Machado , 2016 +# Carlos Leite , 2016 +# Claudemiro Alves Feitosa Neto , 2015 +# Fábio C. Barrionuevo da Luz , 2015 +# Lucas Infante , 2015 +# Luiz Boaretto , 2017 +# Marcelo Moro Brondani , 2018 +# Rafael Ribeiro , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-06-25 18:11+0000\n" +"Last-Translator: Marcelo Moro Brondani \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "PostgreSQL extensions" +msgstr "Extensões para PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "O item %(nth)s na matriz não validou:" + +msgid "Nested arrays must have the same length." +msgstr "Matrizes aninhadas devem ter o mesmo comprimento." + +msgid "Map of strings to strings/nulls" +msgstr "Mapa de strings para strings/nulls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "O valor de \"%(key)s\" não é uma string ou null." + +msgid "A JSON object" +msgstr "Um objeto JSON" + +msgid "Value must be valid JSON." +msgstr "O valor deve ser um JSON válido." + +msgid "Could not load JSON data." +msgstr "Não foi possível carregar dados JSON." + +msgid "Input must be a JSON dictionary." +msgstr "Input deve ser um dicionário JSON" + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' deve ser um JSON válido." + +msgid "Enter two valid values." +msgstr "Insira dois valores válidos." + +msgid "The start of the range must not exceed the end of the range." +msgstr "O inicio do intervalo não deve exceder o fim do intervalo." + +msgid "Enter two whole numbers." +msgstr "Insira dois números cheios." + +msgid "Enter two numbers." +msgstr "Insira dois números" + +msgid "Enter two valid date/times." +msgstr "Insira duas datas/horas válidas." + +msgid "Enter two valid dates." +msgstr "Insira duas datas válidas." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"A lista contém um item %(show_value)d, não deveria conter mais que " +"%(limit_value)d." +msgstr[1] "" +"A lista contém itens %(show_value)d, não deveria conter mais que " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"A lista contém um item %(show_value)d, deveria conter não menos que " +"%(limit_value)d." +msgstr[1] "" +"A lista contém %(show_value)d itens, deveria conter não menos que " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Algumas chaves estavam faltando: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Algumas chaves desconhecidas foram fornecidos: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Certifique-se que o intervalo é completamente menor que %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Certifique-se que este intervalo é completamente maior ou igual a " +"%(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1b39441 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c2600d2 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..e749e40 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,128 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martin Tóth , 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-09-05 17:06+0000\n" +"Last-Translator: Martin Tóth \n" +"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n " +">= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL rozšírenia" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "%(nth)s. položka poľa je neplatná:" + +msgid "Nested arrays must have the same length." +msgstr "Vnorené polia musia mať rovnakú dĺžku." + +msgid "Map of strings to strings/nulls" +msgstr "Mapovanie reťazcov na reťazce/NULL" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Hodnota s kľúčom \"%(key)s\" nie je reťazec ani NULL." + +msgid "A JSON object" +msgstr "Objekt JSON" + +msgid "Value must be valid JSON." +msgstr "Musí byť v platnom formáte JSON." + +msgid "Could not load JSON data." +msgstr "Údaje typu JSON sa nepodarilo načítať." + +msgid "Input must be a JSON dictionary." +msgstr "Vstup musí byť slovník vo formáte JSON." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "Hodnota '%(value)s' musí byť v platnom formáte JSON." + +msgid "Enter two valid values." +msgstr "Zadajte dve platné hodnoty." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Začiatočná hodnota rozsahu nesmie býť vyššia ako koncová hodnota." + +msgid "Enter two whole numbers." +msgstr "Zadajte dve celé čísla." + +msgid "Enter two numbers." +msgstr "Zadajte dve čísla." + +msgid "Enter two valid date/times." +msgstr "Zadajte dva platné dátumy/časy." + +msgid "Enter two valid dates." +msgstr "Zadajte dva platné dátumy." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " +"%(limit_value)d." +msgstr[1] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " +"%(limit_value)d." +msgstr[2] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " +"%(limit_value)d." +msgstr[3] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať viac ako " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " +"%(limit_value)d." +msgstr[1] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " +"%(limit_value)d." +msgstr[2] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " +"%(limit_value)d." +msgstr[3] "" +"Zoznam obsahuje %(show_value)d položku, ale nemal by obsahovať menej ako " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Niektoré kľúče chýbajú: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Boli zadané neznáme kľúče: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Hodnota rozsahu musí byť celá menšia alebo rovná %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Hodnota rozsahu musí byť celá väčšia alebo rovná %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..3220782 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,117 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 09:27+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "Zgjerime PostgreSQL" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Objekti %(nth)s te vargu nuk u vleftësua:" + +msgid "Nested arrays must have the same length." +msgstr "Vargjet brenda vargjesh duhet të kenë të njëjtën gjatësi." + +msgid "Map of strings to strings/nulls" +msgstr "Hartë vargjesh te strings/nulls" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Vlera e \"%(key)s\" s’është varg ose nul." + +msgid "A JSON object" +msgstr "Një objekt JSON" + +msgid "Value must be valid JSON." +msgstr "Vlera duhet të jetë JSON i vlefshëm." + +msgid "Could not load JSON data." +msgstr "S’u ngarkuan dot të dhëna JSON." + +msgid "Input must be a JSON dictionary." +msgstr "Vlera duhet të jetë një fjalor JSON." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "Vlera '%(value)s' duhet të jetë JSON i vlefshëm." + +msgid "Enter two valid values." +msgstr "Jepni dy vlera të vlefshme." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Fillimi i një intervali s’duhet të tejkalojë fundin e një intervali." + +msgid "Enter two whole numbers." +msgstr "Jepni dy vlera të plota numrash." + +msgid "Enter two numbers." +msgstr "Jepni dy numra." + +msgid "Enter two valid date/times." +msgstr "Jepni dy data/kohë të vlefshme." + +msgid "Enter two valid dates." +msgstr "Jepni dy data të vlefshme." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Lista përmban %(show_value)d element, duhet të përmbajë jo më shumë se " +"%(limit_value)d." +msgstr[1] "" +"Lista përmban %(show_value)d elementë, duhet të përmbajë jo më shumë se " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Lista përmban %(show_value)d element, duhet të përmbajë jo më pak " +"%(limit_value)d." +msgstr[1] "" +"Lista përmban %(show_value)d elementë, duhet të përmbajë jo më pak " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Mungojnë ca kyçe: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Janë dhënë kyçe të panjohur: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Sigurohuni që ky interval është më pak ose baras me %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Sigurohuni që ky interval është më i madh ose baras me %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..aabfcba Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..27a30d0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,123 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-07-04 19:55+0000\n" +"Last-Translator: Branko Kokanovic \n" +"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL екстензије" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Ставка %(nth)s у низу није валидирана:" + +msgid "Nested arrays must have the same length." +msgstr "Угњеждени низови морају да буду исте дужине." + +msgid "Map of strings to strings/nulls" +msgstr "Мапа знаковних ниски на знаковне ниске/null-ове" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "Вредност кључа \"%(key)s\" није знаковна ниска или null." + +msgid "A JSON object" +msgstr "JSON објекат" + +msgid "Value must be valid JSON." +msgstr "Вредност мора бити исправни JSON." + +msgid "Could not load JSON data." +msgstr "Не могу да учитам JSON податке." + +msgid "Input must be a JSON dictionary." +msgstr "Улазна вредност мора бити JSON dict." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' вредност мора бити исправни JSON." + +msgid "Enter two valid values." +msgstr "Унесите две исправне вредности." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Почетак опсега не може бити преко краја опсега." + +msgid "Enter two whole numbers." +msgstr "Унесите два цела броја." + +msgid "Enter two numbers." +msgstr "Унесите два броја." + +msgid "Enter two valid date/times." +msgstr "Унесите два исправна датума/времена." + +msgid "Enter two valid dates." +msgstr "Унесите два исправна датума." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Листа садржи %(show_value)dставку, не би требало да садржи више од " +"%(limit_value)d." +msgstr[1] "" +"Листа садржи %(show_value)d ставке, не би требало да садржи више од " +"%(limit_value)d." +msgstr[2] "" +"Листа садржи %(show_value)d ставки, не би требало да садржи више од " +"%(limit_value)d." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Листа садржи %(show_value)d ставку, не би требало да садржи мање од " +"%(limit_value)d." +msgstr[1] "" +"Листа садржи %(show_value)d ставке, не би требало да садржи мање од " +"%(limit_value)d." +msgstr[2] "" +"Листа садржи %(show_value)d ставки, не би требало да садржи мање од " +"%(limit_value)d." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Неки кључеви недостају: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Дати су неки непознати кључеви: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "Овај опсег мора бити укупно мањи или једнак %(limit_value)s." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "Овај опсег мора бити укупно већи или једнак %(limit_value)s." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8e16545 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..9745b03 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,119 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# BouRock, 2015-2018 +# BouRock, 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-05-17 11:49+0200\n" +"PO-Revision-Date: 2018-05-18 10:06+0000\n" +"Last-Translator: BouRock\n" +"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "PostgreSQL extensions" +msgstr "PostgreSQL uzantıları" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "Dizilimdeki %(nth)s öğesi doğrulanmadı:" + +msgid "Nested arrays must have the same length." +msgstr "İç içe dizilimler aynı uzunlukta olmak zorunda." + +msgid "Map of strings to strings/nulls" +msgstr "Dizgiler/boşlar olarak dizgilerin eşlemesi" + +#, python-format +msgid "The value of \"%(key)s\" is not a string or null." +msgstr "\"%(key)s\" değeri bir dizgi ya da boş değil." + +msgid "A JSON object" +msgstr "JSON nesnesi" + +msgid "Value must be valid JSON." +msgstr "Değer geçerli JSON olmak zorundadır." + +msgid "Could not load JSON data." +msgstr "JSON verisi yüklenemedi." + +msgid "Input must be a JSON dictionary." +msgstr "Bir JSON dizini girilmek zorundadır." + +#, python-format +msgid "'%(value)s' value must be valid JSON." +msgstr "'%(value)s' değeri geçerli JSON olmak zorundadır." + +msgid "Enter two valid values." +msgstr "Iki geçerli değer girin." + +msgid "The start of the range must not exceed the end of the range." +msgstr "Aralığın başlangıcı aralığın bitişini aşmamak zorundadır." + +msgid "Enter two whole numbers." +msgstr "Bütün iki sayıyı girin." + +msgid "Enter two numbers." +msgstr "İki sayı girin." + +msgid "Enter two valid date/times." +msgstr "Geçerli iki tarih/saat girin." + +msgid "Enter two valid dates." +msgstr "Geçerli iki tarih girin." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha fazla " +"içermemelidir." +msgstr[1] "" +"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha fazla " +"içermemelidir." + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha az " +"içermemelidir." +msgstr[1] "" +"Liste %(show_value)d öğe içeriyor, %(limit_value)d değerden daha az " +"içermemelidir." + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "Bazı anahtarlar eksik: %(keys)s" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "Bazı bilinmeyen anahtarlar verilmiş: %(keys)s" + +#, python-format +msgid "" +"Ensure that this range is completely less than or equal to %(limit_value)s." +msgstr "" +"Bu aralığın %(limit_value)s değerinden küçük veya eşit olduğundan emin olun." + +#, python-format +msgid "" +"Ensure that this range is completely greater than or equal to " +"%(limit_value)s." +msgstr "" +"Bu aralığın %(limit_value)s değerinden büyük veya eşit olduğundan emin olun." diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/operations.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/operations.py new file mode 100644 index 0000000..95e7edc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/operations.py @@ -0,0 +1,77 @@ +from django.contrib.postgres.signals import ( + get_citext_oids, get_hstore_oids, register_type_handlers, +) +from django.db.migrations.operations.base import Operation + + +class CreateExtension(Operation): + reversible = True + + def __init__(self, name): + self.name = name + + def state_forwards(self, app_label, state): + pass + + def database_forwards(self, app_label, schema_editor, from_state, to_state): + if schema_editor.connection.vendor != 'postgresql': + return + schema_editor.execute("CREATE EXTENSION IF NOT EXISTS %s" % schema_editor.quote_name(self.name)) + # Clear cached, stale oids. + get_hstore_oids.cache_clear() + get_citext_oids.cache_clear() + # Registering new type handlers cannot be done before the extension is + # installed, otherwise a subsequent data migration would use the same + # connection. + register_type_handlers(schema_editor.connection) + + def database_backwards(self, app_label, schema_editor, from_state, to_state): + schema_editor.execute("DROP EXTENSION %s" % schema_editor.quote_name(self.name)) + # Clear cached, stale oids. + get_hstore_oids.cache_clear() + get_citext_oids.cache_clear() + + def describe(self): + return "Creates extension %s" % self.name + + +class BtreeGinExtension(CreateExtension): + + def __init__(self): + self.name = 'btree_gin' + + +class BtreeGistExtension(CreateExtension): + + def __init__(self): + self.name = 'btree_gist' + + +class CITextExtension(CreateExtension): + + def __init__(self): + self.name = 'citext' + + +class CryptoExtension(CreateExtension): + + def __init__(self): + self.name = 'pgcrypto' + + +class HStoreExtension(CreateExtension): + + def __init__(self): + self.name = 'hstore' + + +class TrigramExtension(CreateExtension): + + def __init__(self): + self.name = 'pg_trgm' + + +class UnaccentExtension(CreateExtension): + + def __init__(self): + self.name = 'unaccent' diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/search.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/search.py new file mode 100644 index 0000000..08d92e3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/search.py @@ -0,0 +1,239 @@ +from django.db.models import CharField, Field, FloatField, TextField +from django.db.models.expressions import CombinedExpression, Func, Value +from django.db.models.functions import Cast, Coalesce +from django.db.models.lookups import Lookup + + +class SearchVectorExact(Lookup): + lookup_name = 'exact' + + def process_rhs(self, qn, connection): + if not hasattr(self.rhs, 'resolve_expression'): + config = getattr(self.lhs, 'config', None) + self.rhs = SearchQuery(self.rhs, config=config) + rhs, rhs_params = super().process_rhs(qn, connection) + return rhs, rhs_params + + def as_sql(self, qn, connection): + lhs, lhs_params = self.process_lhs(qn, connection) + rhs, rhs_params = self.process_rhs(qn, connection) + params = lhs_params + rhs_params + return '%s @@ %s = true' % (lhs, rhs), params + + +class SearchVectorField(Field): + + def db_type(self, connection): + return 'tsvector' + + +class SearchQueryField(Field): + + def db_type(self, connection): + return 'tsquery' + + +class SearchVectorCombinable: + ADD = '||' + + def _combine(self, other, connector, reversed): + if not isinstance(other, SearchVectorCombinable) or not self.config == other.config: + raise TypeError('SearchVector can only be combined with other SearchVectors') + if reversed: + return CombinedSearchVector(other, connector, self, self.config) + return CombinedSearchVector(self, connector, other, self.config) + + +class SearchVector(SearchVectorCombinable, Func): + function = 'to_tsvector' + arg_joiner = " || ' ' || " + output_field = SearchVectorField() + config = None + + def __init__(self, *expressions, **extra): + super().__init__(*expressions, **extra) + self.config = self.extra.get('config', self.config) + weight = self.extra.get('weight') + if weight is not None and not hasattr(weight, 'resolve_expression'): + weight = Value(weight) + self.weight = weight + + def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False): + resolved = super().resolve_expression(query, allow_joins, reuse, summarize, for_save) + if self.config: + if not hasattr(self.config, 'resolve_expression'): + resolved.config = Value(self.config).resolve_expression(query, allow_joins, reuse, summarize, for_save) + else: + resolved.config = self.config.resolve_expression(query, allow_joins, reuse, summarize, for_save) + return resolved + + def as_sql(self, compiler, connection, function=None, template=None): + clone = self.copy() + clone.set_source_expressions([ + Coalesce( + expression + if isinstance(expression.output_field, (CharField, TextField)) + else Cast(expression, TextField()), + Value('') + ) for expression in clone.get_source_expressions() + ]) + config_params = [] + if template is None: + if clone.config: + config_sql, config_params = compiler.compile(clone.config) + template = '%(function)s({}::regconfig, %(expressions)s)'.format(config_sql.replace('%', '%%')) + else: + template = clone.template + sql, params = super(SearchVector, clone).as_sql(compiler, connection, function=function, template=template) + extra_params = [] + if clone.weight: + weight_sql, extra_params = compiler.compile(clone.weight) + sql = 'setweight({}, {})'.format(sql, weight_sql) + return sql, config_params + params + extra_params + + +class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): + def __init__(self, lhs, connector, rhs, config, output_field=None): + self.config = config + super().__init__(lhs, connector, rhs, output_field) + + +class SearchQueryCombinable: + BITAND = '&&' + BITOR = '||' + + def _combine(self, other, connector, reversed): + if not isinstance(other, SearchQueryCombinable): + raise TypeError( + 'SearchQuery can only be combined with other SearchQuerys, ' + 'got {}.'.format(type(other)) + ) + if reversed: + return CombinedSearchQuery(other, connector, self, self.config) + return CombinedSearchQuery(self, connector, other, self.config) + + # On Combinable, these are not implemented to reduce confusion with Q. In + # this case we are actually (ab)using them to do logical combination so + # it's consistent with other usage in Django. + def __or__(self, other): + return self._combine(other, self.BITOR, False) + + def __ror__(self, other): + return self._combine(other, self.BITOR, True) + + def __and__(self, other): + return self._combine(other, self.BITAND, False) + + def __rand__(self, other): + return self._combine(other, self.BITAND, True) + + +class SearchQuery(SearchQueryCombinable, Value): + output_field = SearchQueryField() + SEARCH_TYPES = { + 'plain': 'plainto_tsquery', + 'phrase': 'phraseto_tsquery', + 'raw': 'to_tsquery', + } + + def __init__(self, value, output_field=None, *, config=None, invert=False, search_type='plain'): + self.config = config + self.invert = invert + if search_type not in self.SEARCH_TYPES: + raise ValueError("Unknown search_type argument '%s'." % search_type) + self.search_type = search_type + super().__init__(value, output_field=output_field) + + def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False, for_save=False): + resolved = super().resolve_expression(query, allow_joins, reuse, summarize, for_save) + if self.config: + if not hasattr(self.config, 'resolve_expression'): + resolved.config = Value(self.config).resolve_expression(query, allow_joins, reuse, summarize, for_save) + else: + resolved.config = self.config.resolve_expression(query, allow_joins, reuse, summarize, for_save) + return resolved + + def as_sql(self, compiler, connection): + params = [self.value] + function = self.SEARCH_TYPES[self.search_type] + if self.config: + config_sql, config_params = compiler.compile(self.config) + template = '{}({}::regconfig, %s)'.format(function, config_sql) + params = config_params + [self.value] + else: + template = '{}(%s)'.format(function) + if self.invert: + template = '!!({})'.format(template) + return template, params + + def _combine(self, other, connector, reversed): + combined = super()._combine(other, connector, reversed) + combined.output_field = SearchQueryField() + return combined + + def __invert__(self): + return type(self)(self.value, config=self.config, invert=not self.invert) + + def __str__(self): + result = super().__str__() + return ('~%s' % result) if self.invert else result + + +class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): + def __init__(self, lhs, connector, rhs, config, output_field=None): + self.config = config + super().__init__(lhs, connector, rhs, output_field) + + def __str__(self): + return '(%s)' % super().__str__() + + +class SearchRank(Func): + function = 'ts_rank' + output_field = FloatField() + + def __init__(self, vector, query, **extra): + if not hasattr(vector, 'resolve_expression'): + vector = SearchVector(vector) + if not hasattr(query, 'resolve_expression'): + query = SearchQuery(query) + weights = extra.get('weights') + if weights is not None and not hasattr(weights, 'resolve_expression'): + weights = Value(weights) + self.weights = weights + super().__init__(vector, query, **extra) + + def as_sql(self, compiler, connection, function=None, template=None): + extra_params = [] + extra_context = {} + if template is None and self.extra.get('weights'): + if self.weights: + template = '%(function)s(%(weights)s, %(expressions)s)' + weight_sql, extra_params = compiler.compile(self.weights) + extra_context['weights'] = weight_sql + sql, params = super().as_sql( + compiler, connection, + function=function, template=template, **extra_context + ) + return sql, extra_params + params + + +SearchVectorField.register_lookup(SearchVectorExact) + + +class TrigramBase(Func): + output_field = FloatField() + + def __init__(self, expression, string, **extra): + if not hasattr(string, 'resolve_expression'): + string = Value(string) + super().__init__(expression, string, **extra) + + +class TrigramSimilarity(TrigramBase): + function = 'SIMILARITY' + + +class TrigramDistance(TrigramBase): + function = '' + arg_joiner = ' <-> ' diff --git a/venv/lib/python3.7/site-packages/django/contrib/postgres/utils.py b/venv/lib/python3.7/site-packages/django/contrib/postgres/utils.py new file mode 100644 index 0000000..f3c022f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/postgres/utils.py @@ -0,0 +1,29 @@ +from django.core.exceptions import ValidationError +from django.utils.functional import SimpleLazyObject +from django.utils.text import format_lazy + + +def prefix_validation_error(error, prefix, code, params): + """ + Prefix a validation error message while maintaining the existing + validation data structure. + """ + if error.error_list == [error]: + error_params = error.params or {} + return ValidationError( + # We can't simply concatenate messages since they might require + # their associated parameters to be expressed correctly which + # is not something `format_lazy` does. For example, proxied + # ngettext calls require a count parameter and are converted + # to an empty string if they are missing it. + message=format_lazy( + '{} {}', + SimpleLazyObject(lambda: prefix % params), + SimpleLazyObject(lambda: error.message % error_params), + ), + code=code, + params={**error_params, **params}, + ) + return ValidationError([ + prefix_validation_error(e, prefix, code, params) for e in error.error_list + ]) diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1c66c35 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6d2d993 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ast/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1363a5e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po new file mode 100644 index 0000000..f9c1dcb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/be/LC_MESSAGES/django.po @@ -0,0 +1,52 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viktar Palstsiuk , 2015 +# znotdead , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: znotdead \n" +"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"be/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: be\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "Redirects" +msgstr "Перанакіраванні" + +msgid "site" +msgstr "сайт" + +msgid "redirect from" +msgstr "накіраваць з" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Тут мусіць быць поўны шлях бяз назвы дамэна. Прыклад: «/events/search/»." + +msgid "redirect to" +msgstr "накіраваць да" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Тут, як і ўверсе, мусіць быць поўны шлях, або поўная сеціўная спасылка, якая " +"пачынаецца з «http://»." + +msgid "redirect" +msgstr "накіраваньне" + +msgid "redirects" +msgstr "накіраваньні" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f986b59 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..b53731a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,52 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Carles Barrobés , 2014 +# Jannis Leidel , 2011 +# Roger Pons , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Roger Pons \n" +"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Redireccions" + +msgid "site" +msgstr "lloc" + +msgid "redirect from" +msgstr "redirecció des de" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Aquesta ruta hauria de ser un camí absolut, excloent-ne el nom del domini. " +"Exemple '/events/search/'." + +msgid "redirect to" +msgstr "redirigir a" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Això pot ser bé una ruta absoluta (com a sobre) o una URL completa que " +"comenci per 'http://'." + +msgid "redirect" +msgstr "redirecció" + +msgid "redirects" +msgstr "redireccions" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..22cecbb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..737534d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..ab8a428 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Maredudd ap Gwyndaf , 2012,2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " +"11) ? 2 : 3;\n" + +msgid "Redirects" +msgstr "Ailgyfeiriadau" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "ailgyfeirio o" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Dylai hon fod yn lwybr absoliwt, heb yr enw parth. Er enghraifft: '/" +"digwyddiadau/chwilio/'." + +msgid "redirect to" +msgstr "ailgyfeirio i" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Gellir fod naill ai yn lwybr absoliwt (fel uchod) neu URL llawn yn dechrau â " +"'http://'." + +msgid "redirect" +msgstr "ailgyfeiriad" + +msgid "redirects" +msgstr "ailgyfeiriadau" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1c8d0e4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..b605e43 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/dsb/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 00:02+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"language/dsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: dsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Redirects" +msgstr "Dalejpósrědnjenja" + +msgid "site" +msgstr "sedło" + +msgid "redirect from" +msgstr "dalejpósrědnjenje wót" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"To by dejało absolutna sćažka byś, mimo domenowego mjenja. Pśikład: '/events/" +"search/'." + +msgid "redirect to" +msgstr "dalejpósrědnjenje do" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"To móžo pak absolutna sćažka byś (ako górjejce) pak dopołny URL, kótaryž " +"zachopina se z 'http://'." + +msgid "redirect" +msgstr "dalejpósrědnjenje" + +msgid "redirects" +msgstr "dalejpósrědnjenja" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fcc2fc5 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po new file mode 100644 index 0000000..f2eb088 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_AU/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:11+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" +"django/language/en_AU/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "" + +msgid "redirect from" +msgstr "" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" + +msgid "redirect to" +msgstr "" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" + +msgid "redirect" +msgstr "" + +msgid "redirects" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c362746 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..d86a8e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ross Poulton , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "redirect from" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." + +msgid "redirect to" +msgstr "redirect to" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." + +msgid "redirect" +msgstr "redirect" + +msgid "redirects" +msgstr "redirects" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000..0a634a1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Ramiro Morales, 2014-2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Ramiro Morales\n" +"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"language/es_AR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_AR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Redirecciones" + +msgid "site" +msgstr "sitio" + +msgid "redirect from" +msgstr "redirigir desde" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Esta ruta debe ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/" +"events/search/'." + +msgid "redirect to" +msgstr "redirigir a" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Esto puede ser bien una ruta absoluta (como arriba) o una URL completa que " +"empiece con 'http://'." + +msgid "redirect" +msgstr "redirección" + +msgid "redirects" +msgstr "redirecciones" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..81eff77 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..392e5d3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,42 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" +"django/language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "" + +msgid "redirect from" +msgstr "" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" + +msgid "redirect to" +msgstr "" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" + +msgid "redirect" +msgstr "" + +msgid "redirects" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..40debe9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po new file mode 100644 index 0000000..528daa8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/eu/LC_MESSAGES/django.po @@ -0,0 +1,50 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Eneko Illarramendi , 2017 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Eneko Illarramendi \n" +"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Redirects" + +msgid "site" +msgstr "webgunea" + +msgid "redirect from" +msgstr "nondik berbidalia" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Honek 'bide' absolutua izan behar du, domeinu izena kenduta. Adibidez: '/" +"events/search/'." + +msgid "redirect to" +msgstr "Nora berbidali" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Hau 'bide' absolutua (goian bezala) edo URL osoa , 'http://'-rekin hasiz, " +"izan daiteke." + +msgid "redirect" +msgstr "berbidali" + +msgid "redirects" +msgstr "berbidali" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..6f9e56b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,52 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015 +# Jannis Leidel , 2011 +# Klaus Dahlén , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Edelleenohjaukset" + +msgid "site" +msgstr "sivusto" + +msgid "redirect from" +msgstr "ohjaa osoitteesta" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Tässä on käytettävä absoluuttista polkua ilman verkkotunnusta. Esimerkki: '/" +"tapahtumat/haku/'." + +msgid "redirect to" +msgstr "ohjaa osoitteeseen" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Tässä on käytettävä joko absoluuttista polkua (kuten yllä) tai täydellistä " +"'http://'-alkuista URL-osoitetta." + +msgid "redirect" +msgstr "edelleenohjaus" + +msgid "redirects" +msgstr "edelleenohjaukset" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..443c8c9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gd/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po new file mode 100644 index 0000000..aeb372a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/gl/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# fasouto , 2017,2019 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2019-02-15 17:04+0000\n" +"Last-Translator: fasouto \n" +"Language-Team: Galician (http://www.transifex.com/django/django/language/" +"gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Redireccións" + +msgid "site" +msgstr "sitio" + +msgid "redirect from" +msgstr "orixe da redirección" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Debe ser unha ruta absoluta, sen o nome de dominio. Exemplo: '/events/" +"search/'" + +msgid "redirect to" +msgstr "destino da redirección" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece " +"por 'http://'" + +msgid "redirect" +msgstr "redirección" + +msgid "redirects" +msgstr "redireccións" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po new file mode 100644 index 0000000..4d32ce1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,46 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Meir Kriheli , 2014-2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Meir Kriheli \n" +"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "הפניות" + +msgid "site" +msgstr "אתר" + +msgid "redirect from" +msgstr "הפניה מ" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "זה אמור להיות נתיב מלא, ללא שם המתחם. לדוגמא: '/‎/events/search'." + +msgid "redirect to" +msgstr "הפניה אל" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "יכול להיות נתיב מלא (כנ\"ל) או URL מלא המתחיל ב'http://'." + +msgid "redirect" +msgstr "הפניה" + +msgid "redirects" +msgstr "הפניות" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..367e4a9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 0000000..a4ab584 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2018-11-01 20:45+0000\n" +"Last-Translator: Ruben Harutyunov \n" +"Language-Team: Armenian (http://www.transifex.com/django/django/language/" +"hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Վերահղում" + +msgid "site" +msgstr "կայք" + +msgid "redirect from" +msgstr "վերահղում" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Սա պետք է լինի բացարձակ ճանապարհ, բացի տիրույթի անվանից։ Օրինակ․ '/events/" +"search/'։" + +msgid "redirect to" +msgstr "վերահղում" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Սա կարող է լինել բացարձակ ճանապարհ կամ ամբողջական URL, որը սկսվում է " +"'http://'֊ով։" + +msgid "redirect" +msgstr "վերահղում" + +msgid "redirects" +msgstr "վերահղումներ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..b79e1d3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,48 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viko Bartero , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-20 01:58+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: io\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "ridirektar de" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Ico devas esar absoluta voyo, exkluzante la domeno nomo. Exemple: \"/eventi/" +"serchado/\"." + +msgid "redirect to" +msgstr "ridirektar a" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Ico devas esar absoluta voyo (kam supre) o kompleta URL uzante \"http://\"." + +msgid "redirect" +msgstr "ridirekturo" + +msgid "redirects" +msgstr "ridirekturi" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1e415ec Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..2effada --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,47 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Shinya Okano , 2014-2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Shinya Okano \n" +"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Redirects" +msgstr "リダイレクト" + +msgid "site" +msgstr "サイト" + +msgid "redirect from" +msgstr "リダイレクト元" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "'/events/search/' のように、ドメイン名を除いた絶対パスにします。 " + +msgid "redirect to" +msgstr "リダイレクト先" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "上記のような絶対パスか、 'http://' で始まる完全な URL にします。" + +msgid "redirect" +msgstr "リダイレクト" + +msgid "redirects" +msgstr "リダイレクト" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..475955e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ka/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo new file mode 100644 index 0000000..63b7782 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po new file mode 100644 index 0000000..437f1a2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kab/LC_MESSAGES/django.po @@ -0,0 +1,45 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-10-09 12:26+0000\n" +"Last-Translator: Slimane Amiri\n" +"Language-Team: Kabyle (http://www.transifex.com/django/django/language/" +"kab/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kab\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Iceggiɛen" + +msgid "site" +msgstr "asmel" + +msgid "redirect from" +msgstr "yettwaceggeɛ seg" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" + +msgid "redirect to" +msgstr "aceggeɛ ar" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" + +msgid "redirect" +msgstr "aceggeɛ" + +msgid "redirects" +msgstr "iceggiɛen" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po new file mode 100644 index 0000000..91d2a9c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kk/LC_MESSAGES/django.po @@ -0,0 +1,48 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Leo Trubach , 2017 +# yun_man_ger , 2011 +# Zhazira , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Leo Trubach \n" +"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kk\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Redirects" +msgstr "Қайта бағыттаулар" + +msgid "site" +msgstr "сайт" + +msgid "redirect from" +msgstr " бағыттау (қайдан)" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "Бұл домен атаусыз абсолюттік жол болу керек. Мысал: '/events/search/'." + +msgid "redirect to" +msgstr "бағыттау (қайда)" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Бұл абсолюттік жол немесе 'http://'-мен басталатын толық URL бола алады." + +msgid "redirect" +msgstr "қайта бағыттау" + +msgid "redirects" +msgstr "қайта бағыттаулар" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a497d71 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po new file mode 100644 index 0000000..214edc4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/kn/LC_MESSAGES/django.po @@ -0,0 +1,48 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Kannada (http://www.transifex.com/django/django/language/" +"kn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kn\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಂದ->" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "ಇದು ಡೊಮೈನ್ ಹೊರತುಪಡಿಸಿದ ಸಂಪೂರ್ಣ ಪಥವಾಗಿರಬೇಕು ಉದಾ.'/events/search/'." + +msgid "redirect to" +msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಗೆ->" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"ಇದು ಮೇಲಿನಂತೆ ಸಂಪೂರ್ಣ ಪಥವಾದರೂ ಆಗಿರಬಹುದು ಅಥವಾ 'http://'ದಿಂದ ಆರಂಭವಾಗುವ ಸಂಪೂರ್ಣ " +"URL ಆಗಿರಬಹುದು." + +msgid "redirect" +msgstr "ಪುನರ್ನಿರ್ದೇಶನ" + +msgid "redirects" +msgstr "ಪುನರ್ನಿರ್ದೇಶನ(ಗಳು)" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5caeac8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ko/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..183b3d1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..239487c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/nn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f80ae2e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..26f4042 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:58+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "арвитӕны формӕ" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Ай хъуамӕ уа ӕнӕ домены ном абсолютон фӕт. Цӕвиддон: '/events/search/'." + +msgid "redirect to" +msgstr "арвитӕн ардӕм" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Ай гӕнӕн ис уа абсолютон фӕт (куыд уӕлийӕ) кӕнӕ 'http://'-йӕ байдайгӕ " +"ӕнӕхъӕн URL." + +msgid "redirect" +msgstr "арвитӕн" + +msgid "redirects" +msgstr "арвитӕнтӕ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..7ca96c9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,53 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Janusz Harkot , 2014-2015 +# Tomasz Kajtoch , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Tomasz Kajtoch \n" +"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" +"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" +"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgid "Redirects" +msgstr "Przekierowania" + +msgid "site" +msgstr "strona" + +msgid "redirect from" +msgstr "przekieruj z" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Podaj ścieżkę bezwzględną wykluczając nazwę domeny. Na przykład '/events/" +"search/'." + +msgid "redirect to" +msgstr "przekieruj na" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Podaj ścieżkę bezwzględną (jak powyżej) lub pełen URL rozpoczynający się od " +"'http://'." + +msgid "redirect" +msgstr "przekieruj" + +msgid "redirects" +msgstr "przekierowania" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..75ed622 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..d0bd436 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,53 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Daniel Ursache-Dogariu, 2011 +# Jannis Leidel , 2011 +# Razvan Stefanescu , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Razvan Stefanescu \n" +"Language-Team: Romanian (http://www.transifex.com/django/django/language/" +"ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +msgid "Redirects" +msgstr "Redirecționări" + +msgid "site" +msgstr "pagină" + +msgid "redirect from" +msgstr "redirecționat de la " + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Aceasta ar trebui să fie o cale absolută, excluzând numele de domeniu. " +"Exemplu: '/evenimente/cautare/'." + +msgid "redirect to" +msgstr "redirecționat către" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Aceasta poate fi o cale absolută (ca mai sus) sau un URL complet, începând " +"cu 'http://'." + +msgid "redirect" +msgstr "redirecționare" + +msgid "redirects" +msgstr "redirecționări" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..dc75420 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..a59362b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,53 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Алексей Борискин , 2014-2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Eugene MechanisM \n" +"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" + +msgid "Redirects" +msgstr "Перенаправления" + +msgid "site" +msgstr "сайт" + +msgid "redirect from" +msgstr "перенаправить с" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Это должен быть абсолютный путь без доменного имени. Пример: '/events/" +"search/'." + +msgid "redirect to" +msgstr "перенаправить на" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Это должен быть либо абсолютный путь (как выше), либо полный URL, " +"начинающийся с 'http://'." + +msgid "redirect" +msgstr "перенаправление" + +msgid "redirects" +msgstr "перенаправления" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..92ad19f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..0517b05 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Martin Tóth , 2017 +# supowski , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Martin Tóth \n" +"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgid "Redirects" +msgstr "Presmerovania" + +msgid "site" +msgstr "sídlo" + +msgid "redirect from" +msgstr "presmerovať z" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Tu by sa mala použiť absolútna cesta bez názvu domény. Napríklad: '/events/" +"search/'." + +msgid "redirect to" +msgstr "presmerovať na" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Toto môže byť buď absolútna cesta (ako vyššie) alebo úplné URL začínajúce na " +"'http://'." + +msgid "redirect" +msgstr "presmerovanie" + +msgid "redirects" +msgstr "presmerovania" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..41e11af Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..9e94e49 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,51 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011 +# Besnik , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Redirects" +msgstr "Ridrejtime" + +msgid "site" +msgstr "sajt" + +msgid "redirect from" +msgstr "ridrejtim prej" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Ky do të duhej të ishte shteg absolut, pa emrin e përkatësisë. Për shembull: " +"'/ngjarje/kërkim/'." + +msgid "redirect to" +msgstr "ridrejtim te" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Ky mund të jetë shteg absolut (si më sipër) ose URL e plotë që fillon me " +"'http://'." + +msgid "redirect" +msgstr "ridrejtim" + +msgid "redirects" +msgstr "ridrejtime" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..00985c8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/sr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e2a9b43 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/ta/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po new file mode 100644 index 0000000..d06da14 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/tt/LC_MESSAGES/django.po @@ -0,0 +1,48 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Azat Khasanshin , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tatar (http://www.transifex.com/django/django/language/tt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "бу сәхифәдән юнәлтергә:" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Бу домен исеменнән тыш абсолүт юл булырга тиеш. Мәсәлән: '/events/search/'." + +msgid "redirect to" +msgstr "бу сәхифәгә юнәлтергә:" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Бу я абсолүт юл (өстәге кебек), я 'http://' белән башланган тулы URL булырга " +"тиеш." + +msgid "redirect" +msgstr "юнәлтү" + +msgid "redirects" +msgstr "юнәлтүләр" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ca77d24 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/uk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ae80abd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..40e3ddb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,49 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 17:42+0200\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Tran Van \n" +"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" +"vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Redirects" +msgstr "" + +msgid "site" +msgstr "" + +msgid "redirect from" +msgstr "Chuyển hướng từ" + +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Đây phải là đường dẫn tuyệt đối, không bao gồm tên miền. Ví dụ: '/events/" +"search/'." + +msgid "redirect to" +msgstr "Chuyển hướng tới" + +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Đây có thể là đường dẫn tuyệt đối hoặc địa chỉ đầy đủ bắt đầu với 'http://'" + +msgid "redirect" +msgstr "Chuyển hướng" + +msgid "redirects" +msgstr "Chuyển hướng" diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/middleware.py b/venv/lib/python3.7/site-packages/django/contrib/redirects/middleware.py new file mode 100644 index 0000000..26a49f3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/middleware.py @@ -0,0 +1,50 @@ +from django.apps import apps +from django.conf import settings +from django.contrib.redirects.models import Redirect +from django.contrib.sites.shortcuts import get_current_site +from django.core.exceptions import ImproperlyConfigured +from django.http import HttpResponseGone, HttpResponsePermanentRedirect +from django.utils.deprecation import MiddlewareMixin + + +class RedirectFallbackMiddleware(MiddlewareMixin): + # Defined as class-level attributes to be subclassing-friendly. + response_gone_class = HttpResponseGone + response_redirect_class = HttpResponsePermanentRedirect + + def __init__(self, get_response=None): + if not apps.is_installed('django.contrib.sites'): + raise ImproperlyConfigured( + "You cannot use RedirectFallbackMiddleware when " + "django.contrib.sites is not installed." + ) + super().__init__(get_response) + + def process_response(self, request, response): + # No need to check for a redirect for non-404 responses. + if response.status_code != 404: + return response + + full_path = request.get_full_path() + current_site = get_current_site(request) + + r = None + try: + r = Redirect.objects.get(site=current_site, old_path=full_path) + except Redirect.DoesNotExist: + pass + if r is None and settings.APPEND_SLASH and not request.path.endswith('/'): + try: + r = Redirect.objects.get( + site=current_site, + old_path=request.get_full_path(force_append_slash=True), + ) + except Redirect.DoesNotExist: + pass + if r is not None: + if r.new_path == '': + return self.response_gone_class() + return self.response_redirect_class(r.new_path) + + # No redirect was found. Return the response. + return response diff --git a/venv/lib/python3.7/site-packages/django/contrib/redirects/migrations/0001_initial.py b/venv/lib/python3.7/site-packages/django/contrib/redirects/migrations/0001_initial.py new file mode 100644 index 0000000..5acf8c9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/redirects/migrations/0001_initial.py @@ -0,0 +1,40 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Redirect', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('site', models.ForeignKey( + to='sites.Site', + to_field='id', + on_delete=models.CASCADE, + verbose_name='site', + )), + ('old_path', models.CharField( + help_text=( + "This should be an absolute path, excluding the domain name. Example: '/events/search/'." + ), max_length=200, verbose_name='redirect from', db_index=True + )), + ('new_path', models.CharField( + help_text="This can be either an absolute path (as above) or a full URL starting with 'http://'.", + max_length=200, verbose_name='redirect to', blank=True + )), + ], + options={ + 'ordering': ('old_path',), + 'unique_together': {('site', 'old_path')}, + 'db_table': 'django_redirect', + 'verbose_name': 'redirect', + 'verbose_name_plural': 'redirects', + }, + bases=(models.Model,), + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/backends/file.py b/venv/lib/python3.7/site-packages/django/contrib/sessions/backends/file.py new file mode 100644 index 0000000..25887fc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/backends/file.py @@ -0,0 +1,202 @@ +import datetime +import logging +import os +import shutil +import tempfile + +from django.conf import settings +from django.contrib.sessions.backends.base import ( + VALID_KEY_CHARS, CreateError, SessionBase, UpdateError, +) +from django.contrib.sessions.exceptions import InvalidSessionKey +from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation +from django.utils import timezone + + +class SessionStore(SessionBase): + """ + Implement a file based session store. + """ + def __init__(self, session_key=None): + self.storage_path = type(self)._get_storage_path() + self.file_prefix = settings.SESSION_COOKIE_NAME + super().__init__(session_key) + + @classmethod + def _get_storage_path(cls): + try: + return cls._storage_path + except AttributeError: + storage_path = getattr(settings, 'SESSION_FILE_PATH', None) or tempfile.gettempdir() + # Make sure the storage path is valid. + if not os.path.isdir(storage_path): + raise ImproperlyConfigured( + "The session storage path %r doesn't exist. Please set your" + " SESSION_FILE_PATH setting to an existing directory in which" + " Django can store session data." % storage_path) + + cls._storage_path = storage_path + return storage_path + + def _key_to_file(self, session_key=None): + """ + Get the file associated with this session key. + """ + if session_key is None: + session_key = self._get_or_create_session_key() + + # Make sure we're not vulnerable to directory traversal. Session keys + # should always be md5s, so they should never contain directory + # components. + if not set(session_key).issubset(VALID_KEY_CHARS): + raise InvalidSessionKey( + "Invalid characters in session key") + + return os.path.join(self.storage_path, self.file_prefix + session_key) + + def _last_modification(self): + """ + Return the modification time of the file storing the session's content. + """ + modification = os.stat(self._key_to_file()).st_mtime + if settings.USE_TZ: + modification = datetime.datetime.utcfromtimestamp(modification) + return modification.replace(tzinfo=timezone.utc) + return datetime.datetime.fromtimestamp(modification) + + def _expiry_date(self, session_data): + """ + Return the expiry time of the file storing the session's content. + """ + return session_data.get('_session_expiry') or ( + self._last_modification() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE) + ) + + def load(self): + session_data = {} + try: + with open(self._key_to_file(), "r", encoding="ascii") as session_file: + file_data = session_file.read() + # Don't fail if there is no data in the session file. + # We may have opened the empty placeholder file. + if file_data: + try: + session_data = self.decode(file_data) + except (EOFError, SuspiciousOperation) as e: + if isinstance(e, SuspiciousOperation): + logger = logging.getLogger('django.security.%s' % e.__class__.__name__) + logger.warning(str(e)) + self.create() + + # Remove expired sessions. + expiry_age = self.get_expiry_age(expiry=self._expiry_date(session_data)) + if expiry_age <= 0: + session_data = {} + self.delete() + self.create() + except (IOError, SuspiciousOperation): + self._session_key = None + return session_data + + def create(self): + while True: + self._session_key = self._get_new_session_key() + try: + self.save(must_create=True) + except CreateError: + continue + self.modified = True + return + + def save(self, must_create=False): + if self.session_key is None: + return self.create() + # Get the session data now, before we start messing + # with the file it is stored within. + session_data = self._get_session(no_load=must_create) + + session_file_name = self._key_to_file() + + try: + # Make sure the file exists. If it does not already exist, an + # empty placeholder file is created. + flags = os.O_WRONLY | getattr(os, 'O_BINARY', 0) + if must_create: + flags |= os.O_EXCL | os.O_CREAT + fd = os.open(session_file_name, flags) + os.close(fd) + except FileNotFoundError: + if not must_create: + raise UpdateError + except FileExistsError: + if must_create: + raise CreateError + + # Write the session file without interfering with other threads + # or processes. By writing to an atomically generated temporary + # file and then using the atomic os.rename() to make the complete + # file visible, we avoid having to lock the session file, while + # still maintaining its integrity. + # + # Note: Locking the session file was explored, but rejected in part + # because in order to be atomic and cross-platform, it required a + # long-lived lock file for each session, doubling the number of + # files in the session storage directory at any given time. This + # rename solution is cleaner and avoids any additional overhead + # when reading the session data, which is the more common case + # unless SESSION_SAVE_EVERY_REQUEST = True. + # + # See ticket #8616. + dir, prefix = os.path.split(session_file_name) + + try: + output_file_fd, output_file_name = tempfile.mkstemp(dir=dir, prefix=prefix + '_out_') + renamed = False + try: + try: + os.write(output_file_fd, self.encode(session_data).encode()) + finally: + os.close(output_file_fd) + + # This will atomically rename the file (os.rename) if the OS + # supports it. Otherwise this will result in a shutil.copy2 + # and os.unlink (for example on Windows). See #9084. + shutil.move(output_file_name, session_file_name) + renamed = True + finally: + if not renamed: + os.unlink(output_file_name) + except (OSError, IOError, EOFError): + pass + + def exists(self, session_key): + return os.path.exists(self._key_to_file(session_key)) + + def delete(self, session_key=None): + if session_key is None: + if self.session_key is None: + return + session_key = self.session_key + try: + os.unlink(self._key_to_file(session_key)) + except OSError: + pass + + def clean(self): + pass + + @classmethod + def clear_expired(cls): + storage_path = cls._get_storage_path() + file_prefix = settings.SESSION_COOKIE_NAME + + for session_file in os.listdir(storage_path): + if not session_file.startswith(file_prefix): + continue + session_key = session_file[len(file_prefix):] + session = cls(session_key) + # When an expired session is loaded, its file is removed, and a + # new file is immediately created. Prevent this by disabling + # the create() method. + session.create = lambda: None + session.load() diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po new file mode 100644 index 0000000..09560cf --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/af/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# F Wolff , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2019-01-04 18:57+0000\n" +"Last-Translator: F Wolff \n" +"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"af/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Sessies" + +msgid "session key" +msgstr "sessiesleutel" + +msgid "session data" +msgstr "sessiedata" + +msgid "expire date" +msgstr "vervaldatum" + +msgid "session" +msgstr "sessie" + +msgid "sessions" +msgstr "sessies" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..7ce647a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Ismayilov , 2011 +# Emin Mastizada , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-04-27 13:19+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Seanslar" + +msgid "session key" +msgstr "seans açarı" + +msgid "session data" +msgstr "seansın məlumatları" + +msgid "expire date" +msgstr "bitmə tarixi" + +msgid "session" +msgstr "seans" + +msgid "sessions" +msgstr "seanslar" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo new file mode 100644 index 0000000..574320d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bg/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..f167bc8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po new file mode 100644 index 0000000..2ba36a9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/bs/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bosnian (http://www.transifex.com/django/django/language/" +"bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "ključ sesije" + +msgid "session data" +msgstr "podaci sesije" + +msgid "expire date" +msgstr "datum isteka" + +msgid "session" +msgstr "sesija" + +msgid "sessions" +msgstr "sesije" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po new file mode 100644 index 0000000..9f8ecbe --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/cs/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Vláďa Macek , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgid "Sessions" +msgstr "Sezení" + +msgid "session key" +msgstr "klíč sezení" + +msgid "session data" +msgstr "data sezení" + +msgid "expire date" +msgstr "datum expirace" + +msgid "session" +msgstr "sezení" + +msgid "sessions" +msgstr "sezení" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po new file mode 100644 index 0000000..8d1689c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/da/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Erik Wognsen , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Sessioner" + +msgid "session key" +msgstr "sessionsnøgle" + +msgid "session data" +msgstr "sessionsdata" + +msgid "expire date" +msgstr "udløbsdato" + +msgid "session" +msgstr "session" + +msgid "sessions" +msgstr "sessioner" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3af9146 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cb8a5e8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a8ef4ca Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po new file mode 100644 index 0000000..3813c31 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/el/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Pãnoș , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Pãnoș \n" +"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Συνεδρίες" + +msgid "session key" +msgstr "κλειδί συνεδρίας" + +msgid "session data" +msgstr "δεδομένα συνεδρίας" + +msgid "expire date" +msgstr "ημερομηνία λήξης" + +msgid "session" +msgstr "συνεδρία" + +msgid "sessions" +msgstr "συνεδρίες" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..2ce1872 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/sessions/apps.py:8 +msgid "Sessions" +msgstr "" + +#: contrib/sessions/models.py:44 +msgid "session key" +msgstr "" + +#: contrib/sessions/models.py:46 +msgid "session data" +msgstr "" + +#: contrib/sessions/models.py:47 +msgid "expire date" +msgstr "" + +#: contrib/sessions/models.py:52 +msgid "session" +msgstr "" + +#: contrib/sessions/models.py:53 +msgid "sessions" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fd83c31 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..ee4a40d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ross Poulton , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "session key" + +msgid "session data" +msgstr "session data" + +msgid "expire date" +msgstr "expire date" + +msgid "session" +msgstr "session" + +msgid "sessions" +msgstr "sessions" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo new file mode 100644 index 0000000..258b370 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/eo/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..85241b3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ernesto Avilés Vázquez , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Sesiones" + +msgid "session key" +msgstr "clave de sesión" + +msgid "session data" +msgstr "datos de sesión" + +msgid "expire date" +msgstr "fecha de caducidad" + +msgid "session" +msgstr "sesión" + +msgid "sessions" +msgstr "sesiones" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..238fe24 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..5d2faab --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Carlos Muñoz , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 22:00+0000\n" +"Last-Translator: Carlos Muñoz \n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" +"language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Sesiones" + +msgid "session key" +msgstr "clave de sesión" + +msgid "session data" +msgstr "datos de sesión" + +msgid "expire date" +msgstr "fecha de caducidad" + +msgid "session" +msgstr "sesión" + +msgid "sessions" +msgstr "sesiones" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..33f2811 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..ccd4d09 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" +"django/language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "" + +msgid "session data" +msgstr "" + +msgid "expire date" +msgstr "" + +msgid "session" +msgstr "" + +msgid "sessions" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c2fb662 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fa/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5a0fe17 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..cc4a9e6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Claude Paroz , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Sessions" +msgstr "Sessions" + +msgid "session key" +msgstr "clé de session" + +msgid "session data" +msgstr "données de session" + +msgid "expire date" +msgstr "date d'expiration" + +msgid "session" +msgstr "session" + +msgid "sessions" +msgstr "sessions" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..489bbab Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/fy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo new file mode 100644 index 0000000..ef41ac8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/gd/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e2dcbe6 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo new file mode 100644 index 0000000..01e0540 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hu/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5845568 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/hy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po new file mode 100644 index 0000000..0bdaf5d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/is/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Icelandic (http://www.transifex.com/django/django/language/" +"is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "setulykill" + +msgid "session data" +msgstr "setugögn" + +msgid "expire date" +msgstr "fyrningardagsetning" + +msgid "session" +msgstr "seta" + +msgid "sessions" +msgstr "setur" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..33e2cd7 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/it/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po new file mode 100644 index 0000000..b42fbf1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ka/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Georgian (http://www.transifex.com/django/django/language/" +"ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ka\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "სესიის გასაღები" + +msgid "session data" +msgstr "სესიის მონაცემები" + +msgid "expire date" +msgstr "ამოწურვის თარიღი" + +msgid "session" +msgstr "სესია" + +msgid "sessions" +msgstr "სესიები" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo new file mode 100644 index 0000000..144d87c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..74c622c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Chr0m3 , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Chr0m3 \n" +"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sessions" +msgstr "세션" + +msgid "session key" +msgstr "세션 키" + +msgid "session data" +msgstr "세션 날짜" + +msgid "expire date" +msgstr "유효날짜" + +msgid "session" +msgstr "세션" + +msgid "sessions" +msgstr "세션" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po new file mode 100644 index 0000000..e7c83d4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lb/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Luxembourgish (http://www.transifex.com/projects/p/django/" +"language/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "" + +msgid "session data" +msgstr "" + +msgid "expire date" +msgstr "" + +msgid "session" +msgstr "" + +msgid "sessions" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..07f5308 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/lv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bdf114e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 0000000..45b727e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "" + +msgid "session data" +msgstr "" + +msgid "expire date" +msgstr "" + +msgid "session" +msgstr "" + +msgid "sessions" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo new file mode 100644 index 0000000..73d049a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/my/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo new file mode 100644 index 0000000..93ff678 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ne/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po new file mode 100644 index 0000000..d9ac000 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/nn/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" +"language/nn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "sesjonsnøkkel" + +msgid "session data" +msgstr "sesjonsdata" + +msgid "expire date" +msgstr "utløpsdato" + +msgid "session" +msgstr "sesjon" + +msgid "sessions" +msgstr "sesjonar" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po new file mode 100644 index 0000000..0588ebb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/os/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soslan Khubulov , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:58+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ossetic (http://www.transifex.com/django/django/language/" +"os/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: os\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "сессийы амонӕн" + +msgid "session data" +msgstr "сессийы рардтӕ" + +msgid "expire date" +msgstr "фӕуды афон" + +msgid "session" +msgstr "сесси" + +msgid "sessions" +msgstr "сесситӕ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..b72de94 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,39 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Mattia Procopio , 2014 +# Tomasz Kajtoch , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Tomasz Kajtoch \n" +"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" +"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" +"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +msgid "Sessions" +msgstr "Sesje" + +msgid "session key" +msgstr "klucz sesji" + +msgid "session data" +msgstr "dane sesji" + +msgid "expire date" +msgstr "data wygaśnięcia sesji" + +msgid "session" +msgstr "sesja" + +msgid "sessions" +msgstr "sesje" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..bb50e3a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..69a3fa0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Raúl Pedro Fernandes Santos, 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "Sessões" + +msgid "session key" +msgstr "chave da sessão" + +msgid "session data" +msgstr "dados da sessão" + +msgid "expire date" +msgstr "data de expiração" + +msgid "session" +msgstr "sessão" + +msgid "sessions" +msgstr "sessões" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..e4e0da1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..ebe8e6a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: andrewsmedina \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Sessions" +msgstr "Sessões" + +msgid "session key" +msgstr "chave da sessão" + +msgid "session data" +msgstr "dados da sessão" + +msgid "expire date" +msgstr "data de expiração" + +msgid "session" +msgstr "sessão" + +msgid "sessions" +msgstr "sessões" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo new file mode 100644 index 0000000..49ade94 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ro/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a44169f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po new file mode 100644 index 0000000..f06a9a2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sl/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# zejn , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Primož Verdnik \n" +"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Sessions" +msgstr "Seje" + +msgid "session key" +msgstr "ključ seje" + +msgid "session data" +msgstr "podatki seje" + +msgid "expire date" +msgstr "čas preteka" + +msgid "session" +msgstr "seja" + +msgid "sessions" +msgstr "seje" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..97759a0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Branko Kokanovic , 2018 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-01-30 10:08+0000\n" +"Last-Translator: Branko Kokanovic \n" +"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Sessions" +msgstr "Сесије" + +msgid "session key" +msgstr "кључ сесије" + +msgid "session data" +msgstr "подаци сесије" + +msgid "expire date" +msgstr "датум застаревања" + +msgid "session" +msgstr "сесија" + +msgid "sessions" +msgstr "сесије" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..1132d52 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Igor Jerosimić, 2019 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2019-06-27 12:40+0000\n" +"Last-Translator: Igor Jerosimić\n" +"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" +"language/sr@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Sessions" +msgstr "Sesije" + +msgid "session key" +msgstr "ključ sesije" + +msgid "session data" +msgstr "podaci sesije" + +msgid "expire date" +msgstr "datum zastarevanja" + +msgid "session" +msgstr "sesija" + +msgid "sessions" +msgstr "sesije" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo new file mode 100644 index 0000000..b44d13a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/sv/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po new file mode 100644 index 0000000..21779b0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ta/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "அமர்வு குறியீ" + +msgid "session data" +msgstr "அமர்வு தகவல்" + +msgid "expire date" +msgstr "காலாவதியாகும் தேதி" + +msgid "session" +msgstr "அமர்வு" + +msgid "sessions" +msgstr "அமர்வுகள்" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo new file mode 100644 index 0000000..7a2be87 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po new file mode 100644 index 0000000..c9832a4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/te/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# bhaskar teja yerneni , 2011 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "భాగము తాళంచెవి" + +msgid "session data" +msgstr "భాగము దత్తం" + +msgid "expire date" +msgstr "కాలం చెల్లు తేది." + +msgid "session" +msgstr "భాగము" + +msgid "sessions" +msgstr "భాగములు" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo new file mode 100644 index 0000000..462cce8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po new file mode 100644 index 0000000..9f7648f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/th/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kowit Charoenratchatabhan , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-05-06 07:45+0000\n" +"Last-Translator: Kowit Charoenratchatabhan \n" +"Language-Team: Thai (http://www.transifex.com/django/django/language/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sessions" +msgstr "เซสชัน" + +msgid "session key" +msgstr "เซสชันคีย์" + +msgid "session data" +msgstr "ข้อมูลเซสชัน" + +msgid "expire date" +msgstr "วันหมดอายุ" + +msgid "session" +msgstr "เซสชัน" + +msgid "sessions" +msgstr "เซสชัน" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1323b82 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/tr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a2def30 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/uk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo new file mode 100644 index 0000000..493b9c2 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/ur/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..731d24c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Thanh Le Viet , 2013 +# Tran Van , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Tran Van \n" +"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" +"vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sessions" +msgstr "" + +msgid "session key" +msgstr "session key" + +msgid "session data" +msgstr "session data" + +msgid "expire date" +msgstr "Ngày hết hạn" + +msgid "session" +msgstr "Phiên" + +msgid "sessions" +msgstr "session" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/management/commands/clearsessions.py b/venv/lib/python3.7/site-packages/django/contrib/sessions/management/commands/clearsessions.py new file mode 100644 index 0000000..ee08ac3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/management/commands/clearsessions.py @@ -0,0 +1,19 @@ +from importlib import import_module + +from django.conf import settings +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + help = ( + "Can be run as a cronjob or directly to clean out expired sessions " + "(only with the database backend at the moment)." + ) + + def handle(self, **options): + engine = import_module(settings.SESSION_ENGINE) + try: + engine.SessionStore.clear_expired() + except NotImplementedError: + self.stderr.write("Session engine '%s' doesn't support clearing " + "expired sessions.\n" % settings.SESSION_ENGINE) diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/migrations/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/sessions/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/contrib/sessions/models.py b/venv/lib/python3.7/site-packages/django/contrib/sessions/models.py new file mode 100644 index 0000000..a744267 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sessions/models.py @@ -0,0 +1,35 @@ +from django.contrib.sessions.base_session import ( + AbstractBaseSession, BaseSessionManager, +) + + +class SessionManager(BaseSessionManager): + use_in_migrations = True + + +class Session(AbstractBaseSession): + """ + Django provides full support for anonymous sessions. The session + framework lets you store and retrieve arbitrary data on a + per-site-visitor basis. It stores data on the server side and + abstracts the sending and receiving of cookies. Cookies contain a + session ID -- not the data itself. + + The Django sessions framework is entirely cookie-based. It does + not fall back to putting session IDs in URLs. This is an intentional + design decision. Not only does that behavior make URLs ugly, it makes + your site vulnerable to session-ID theft via the "Referer" header. + + For complete documentation on using Sessions in your code, consult + the sessions documentation that is shipped with Django (also available + on the Django Web site). + """ + objects = SessionManager() + + @classmethod + def get_session_store_class(cls): + from django.contrib.sessions.backends.db import SessionStore + return SessionStore + + class Meta(AbstractBaseSession.Meta): + db_table = 'django_session' diff --git a/venv/lib/python3.7/site-packages/django/contrib/sitemaps/__init__.py b/venv/lib/python3.7/site-packages/django/contrib/sitemaps/__init__.py new file mode 100644 index 0000000..05a1b65 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sitemaps/__init__.py @@ -0,0 +1,163 @@ +from urllib.parse import urlencode +from urllib.request import urlopen + +from django.apps import apps as django_apps +from django.conf import settings +from django.core import paginator +from django.core.exceptions import ImproperlyConfigured +from django.urls import NoReverseMatch, reverse +from django.utils import translation + +PING_URL = "https://www.google.com/webmasters/tools/ping" + + +class SitemapNotFound(Exception): + pass + + +def ping_google(sitemap_url=None, ping_url=PING_URL, sitemap_uses_https=True): + """ + Alert Google that the sitemap for the current site has been updated. + If sitemap_url is provided, it should be an absolute path to the sitemap + for this site -- e.g., '/sitemap.xml'. If sitemap_url is not provided, this + function will attempt to deduce it by using urls.reverse(). + """ + sitemap_full_url = _get_sitemap_full_url(sitemap_url, sitemap_uses_https) + params = urlencode({'sitemap': sitemap_full_url}) + urlopen('%s?%s' % (ping_url, params)) + + +def _get_sitemap_full_url(sitemap_url, sitemap_uses_https=True): + if not django_apps.is_installed('django.contrib.sites'): + raise ImproperlyConfigured("ping_google requires django.contrib.sites, which isn't installed.") + + if sitemap_url is None: + try: + # First, try to get the "index" sitemap URL. + sitemap_url = reverse('django.contrib.sitemaps.views.index') + except NoReverseMatch: + try: + # Next, try for the "global" sitemap URL. + sitemap_url = reverse('django.contrib.sitemaps.views.sitemap') + except NoReverseMatch: + pass + + if sitemap_url is None: + raise SitemapNotFound("You didn't provide a sitemap_url, and the sitemap URL couldn't be auto-detected.") + + Site = django_apps.get_model('sites.Site') + current_site = Site.objects.get_current() + scheme = 'https' if sitemap_uses_https else 'http' + return '%s://%s%s' % (scheme, current_site.domain, sitemap_url) + + +class Sitemap: + # This limit is defined by Google. See the index documentation at + # https://www.sitemaps.org/protocol.html#index. + limit = 50000 + + # If protocol is None, the URLs in the sitemap will use the protocol + # with which the sitemap was requested. + protocol = None + + def __get(self, name, obj, default=None): + try: + attr = getattr(self, name) + except AttributeError: + return default + if callable(attr): + return attr(obj) + return attr + + def items(self): + return [] + + def location(self, obj): + return obj.get_absolute_url() + + @property + def paginator(self): + return paginator.Paginator(self.items(), self.limit) + + def get_urls(self, page=1, site=None, protocol=None): + # Determine protocol + if self.protocol is not None: + protocol = self.protocol + if protocol is None: + protocol = 'http' + + # Determine domain + if site is None: + if django_apps.is_installed('django.contrib.sites'): + Site = django_apps.get_model('sites.Site') + try: + site = Site.objects.get_current() + except Site.DoesNotExist: + pass + if site is None: + raise ImproperlyConfigured( + "To use sitemaps, either enable the sites framework or pass " + "a Site/RequestSite object in your view." + ) + domain = site.domain + + if getattr(self, 'i18n', False): + urls = [] + current_lang_code = translation.get_language() + for lang_code, lang_name in settings.LANGUAGES: + translation.activate(lang_code) + urls += self._urls(page, protocol, domain) + translation.activate(current_lang_code) + else: + urls = self._urls(page, protocol, domain) + + return urls + + def _urls(self, page, protocol, domain): + urls = [] + latest_lastmod = None + all_items_lastmod = True # track if all items have a lastmod + for item in self.paginator.page(page).object_list: + loc = "%s://%s%s" % (protocol, domain, self.__get('location', item)) + priority = self.__get('priority', item) + lastmod = self.__get('lastmod', item) + if all_items_lastmod: + all_items_lastmod = lastmod is not None + if (all_items_lastmod and + (latest_lastmod is None or lastmod > latest_lastmod)): + latest_lastmod = lastmod + url_info = { + 'item': item, + 'location': loc, + 'lastmod': lastmod, + 'changefreq': self.__get('changefreq', item), + 'priority': str(priority if priority is not None else ''), + } + urls.append(url_info) + if all_items_lastmod and latest_lastmod: + self.latest_lastmod = latest_lastmod + return urls + + +class GenericSitemap(Sitemap): + priority = None + changefreq = None + + def __init__(self, info_dict, priority=None, changefreq=None, protocol=None): + self.queryset = info_dict['queryset'] + self.date_field = info_dict.get('date_field') + self.priority = priority + self.changefreq = changefreq + self.protocol = protocol + + def items(self): + # Make sure to return a clone; we don't want premature evaluation. + return self.queryset.filter() + + def lastmod(self, item): + if self.date_field is not None: + return getattr(item, self.date_field) + return None + + +default_app_config = 'django.contrib.sitemaps.apps.SiteMapsConfig' diff --git a/venv/lib/python3.7/site-packages/django/contrib/sitemaps/views.py b/venv/lib/python3.7/site-packages/django/contrib/sitemaps/views.py new file mode 100644 index 0000000..ab6b9a6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sitemaps/views.py @@ -0,0 +1,92 @@ +import datetime +from calendar import timegm +from functools import wraps + +from django.contrib.sites.shortcuts import get_current_site +from django.core.paginator import EmptyPage, PageNotAnInteger +from django.http import Http404 +from django.template.response import TemplateResponse +from django.urls import reverse +from django.utils.http import http_date + + +def x_robots_tag(func): + @wraps(func) + def inner(request, *args, **kwargs): + response = func(request, *args, **kwargs) + response['X-Robots-Tag'] = 'noindex, noodp, noarchive' + return response + return inner + + +@x_robots_tag +def index(request, sitemaps, + template_name='sitemap_index.xml', content_type='application/xml', + sitemap_url_name='django.contrib.sitemaps.views.sitemap'): + + req_protocol = request.scheme + req_site = get_current_site(request) + + sites = [] # all sections' sitemap URLs + for section, site in sitemaps.items(): + # For each section label, add links of all pages of its sitemap + # (usually generated by the `sitemap` view). + if callable(site): + site = site() + protocol = req_protocol if site.protocol is None else site.protocol + sitemap_url = reverse(sitemap_url_name, kwargs={'section': section}) + absolute_url = '%s://%s%s' % (protocol, req_site.domain, sitemap_url) + sites.append(absolute_url) + # Add links to all pages of the sitemap. + for page in range(2, site.paginator.num_pages + 1): + sites.append('%s?p=%s' % (absolute_url, page)) + + return TemplateResponse(request, template_name, {'sitemaps': sites}, + content_type=content_type) + + +@x_robots_tag +def sitemap(request, sitemaps, section=None, + template_name='sitemap.xml', content_type='application/xml'): + + req_protocol = request.scheme + req_site = get_current_site(request) + + if section is not None: + if section not in sitemaps: + raise Http404("No sitemap available for section: %r" % section) + maps = [sitemaps[section]] + else: + maps = sitemaps.values() + page = request.GET.get("p", 1) + + lastmod = None + all_sites_lastmod = True + urls = [] + for site in maps: + try: + if callable(site): + site = site() + urls.extend(site.get_urls(page=page, site=req_site, + protocol=req_protocol)) + if all_sites_lastmod: + site_lastmod = getattr(site, 'latest_lastmod', None) + if site_lastmod is not None: + site_lastmod = ( + site_lastmod.utctimetuple() if isinstance(site_lastmod, datetime.datetime) + else site_lastmod.timetuple() + ) + lastmod = site_lastmod if lastmod is None else max(lastmod, site_lastmod) + else: + all_sites_lastmod = False + except EmptyPage: + raise Http404("Page %s empty" % page) + except PageNotAnInteger: + raise Http404("No page '%s'" % page) + response = TemplateResponse(request, template_name, {'urlset': urls}, + content_type=content_type) + if all_sites_lastmod and lastmod is not None: + # if lastmod is defined for all sites, set header so as + # ConditionalGetMiddleware is able to send 304 NOT MODIFIED + response['Last-Modified'] = http_date(timegm(lastmod)) + return response diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/admin.py b/venv/lib/python3.7/site-packages/django/contrib/sites/admin.py new file mode 100644 index 0000000..2b167fe --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from django.contrib.sites.models import Site + + +@admin.register(Site) +class SiteAdmin(admin.ModelAdmin): + list_display = ('domain', 'name') + search_fields = ('domain', 'name') diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d613267 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/af/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo new file mode 100644 index 0000000..0ec03f9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po new file mode 100644 index 0000000..cd3d29b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/az/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ali Ismayilov , 2011 +# Emin Mastizada , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-04-27 17:01+0000\n" +"Last-Translator: Emin Mastizada \n" +"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Saytlar" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domen adında boşluq və tab boşluğu olmamalıdır." + +msgid "domain name" +msgstr "domen" + +msgid "display name" +msgstr "adı" + +msgid "site" +msgstr "sayt" + +msgid "sites" +msgstr "saytlar" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo new file mode 100644 index 0000000..69455df Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/be/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po new file mode 100644 index 0000000..4ebb4ba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bg/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Lyuboslav Petrov , 2014 +# vestimir , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Сайтове" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Името на домейна не може да съдържа никакви интервали или табулации." + +msgid "domain name" +msgstr "име на домейна" + +msgid "display name" +msgstr "наименование" + +msgid "site" +msgstr "сайт" + +msgid "sites" +msgstr "сайтове" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po new file mode 100644 index 0000000..4294e2b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/br/LC_MESSAGES/django.po @@ -0,0 +1,40 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Fulup , 2012 +# Irriep Nala Novram , 2018 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2018-10-19 23:07+0000\n" +"Last-Translator: Irriep Nala Novram \n" +"Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: br\n" +"Plural-Forms: nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !" +"=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n" +"%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > " +"19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 " +"&& n % 1000000 == 0) ? 3 : 4);\n" + +msgid "Sites" +msgstr "Lec'hiennoù" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "An anv domani n'hall na enderc'hel spasoù pe taolennadurioù." + +msgid "domain name" +msgstr "anv domani" + +msgid "display name" +msgstr "anv da ziskouez" + +msgid "site" +msgstr "lec'hienn" + +msgid "sites" +msgstr "lec'hiennoù" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1b76e2f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/bs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po new file mode 100644 index 0000000..22f2c13 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ca/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Antoni Aloy , 2013 +# Carles Barrobés , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Llocs" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "El nom de domini no pot contenir cap espai ni tabuladors." + +msgid "domain name" +msgstr "nom del domini" + +msgid "display name" +msgstr "nom per mostrar" + +msgid "site" +msgstr "lloc" + +msgid "sites" +msgstr "llocs" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1a79a73 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cs/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d4b4ecd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po new file mode 100644 index 0000000..5e37db2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/cy/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Maredudd ap Gwyndaf , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Maredudd ap Gwyndaf \n" +"Language-Team: Welsh (http://www.transifex.com/django/django/language/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != " +"11) ? 2 : 3;\n" + +msgid "Sites" +msgstr "Safleoedd" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Ni all yr enw parth gynnwys bylchau neu dabiau." + +msgid "domain name" +msgstr "enw parth" + +msgid "display name" +msgstr "enw arddangos" + +msgid "site" +msgstr "safle" + +msgid "sites" +msgstr "safleoedd" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cdf8708 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/da/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..74e1685 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/de/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8179a5c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..08a7b68 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..3b1884c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2010-05-13 15:35+0200\n" +"Last-Translator: Django team\n" +"Language-Team: English \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: contrib/sites/apps.py:11 +msgid "Sites" +msgstr "" + +#: contrib/sites/models.py:30 +msgid "The domain name cannot contain any spaces or tabs." +msgstr "" + +#: contrib/sites/models.py:81 +msgid "domain name" +msgstr "" + +#: contrib/sites/models.py:83 +msgid "display name" +msgstr "" + +#: contrib/sites/models.py:88 +msgid "site" +msgstr "" + +#: contrib/sites/models.py:89 +msgid "sites" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po new file mode 100644 index 0000000..b212e34 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/en_GB/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Ross Poulton , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: English (United Kingdom) (http://www.transifex.com/django/" +"django/language/en_GB/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "" + +msgid "domain name" +msgstr "domain name" + +msgid "display name" +msgstr "display name" + +msgid "site" +msgstr "site" + +msgid "sites" +msgstr "sites" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000..89fbdbc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,39 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# abraham.martin , 2014 +# Antoni Aloy , 2013 +# Ernesto Avilés Vázquez , 2014 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Sitios" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "El nombre de dominio no puede contener espacios ni tabulaciones" + +msgid "domain name" +msgstr "nombre de dominio" + +msgid "display name" +msgstr "nombre a mostrar" + +msgid "site" +msgstr "sitio" + +msgid "sites" +msgstr "sitios" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1fff5d9 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po new file mode 100644 index 0000000..9344265 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_CO/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Carlos Muñoz , 2015 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 21:51+0000\n" +"Last-Translator: Carlos Muñoz \n" +"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" +"language/es_CO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Sitios" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "El nombre de dominio no puede contener espacios y/o tabulaciones" + +msgid "domain name" +msgstr "nombre de dominio" + +msgid "display name" +msgstr "nombre a mostrar" + +msgid "site" +msgstr "sitio" + +msgid "sites" +msgstr "sitios" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo new file mode 100644 index 0000000..02a2e53 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po new file mode 100644 index 0000000..a6b74fa --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/es_VE/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2014-10-05 20:12+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Spanish (Venezuela) (http://www.transifex.com/projects/p/" +"django/language/es_VE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es_VE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "" + +msgid "domain name" +msgstr "" + +msgid "display name" +msgstr "" + +msgid "site" +msgstr "" + +msgid "sites" +msgstr "" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo new file mode 100644 index 0000000..3e3e38a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po new file mode 100644 index 0000000..91ef8f3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/et/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Janno Liivak , 2013 +# Marti Raudsepp , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Saidid" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domeeni nimes ei tohi olla ei tühikuid ega tabeldusmärke." + +msgid "domain name" +msgstr "domeeninimi" + +msgid "display name" +msgstr "hüüdnimi" + +msgid "site" +msgstr "sait" + +msgid "sites" +msgstr "saidid" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..65ba6a0 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po new file mode 100644 index 0000000..13c88ce --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/fi/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Aarni Koskela, 2015 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Aarni Koskela\n" +"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Sivustot" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Verkkotunnus ei voi sisältää välilyöntejä tai sarkainmerkkejä." + +msgid "domain name" +msgstr "verkkotunnus" + +msgid "display name" +msgstr "näyttönimi" + +msgid "site" +msgstr "sivusto" + +msgid "sites" +msgstr "sivustot" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c107d9b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po new file mode 100644 index 0000000..b21bd6f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/gl/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Leandro Regueiro , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Galician (http://www.transifex.com/django/django/language/" +"gl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "O dominio non pode conter espazos nin tabulacións." + +msgid "domain name" +msgstr "dominio" + +msgid "display name" +msgstr "nome" + +msgid "site" +msgstr "sitio" + +msgid "sites" +msgstr "sitios" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po new file mode 100644 index 0000000..6bc277d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/he/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Meir Kriheli , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "אתרים" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "שם המתחם אינו יכול להכיל רווחים או טאבים." + +msgid "domain name" +msgstr "שם מתחם" + +msgid "display name" +msgstr "שם לתצוגה" + +msgid "site" +msgstr "אתר" + +msgid "sites" +msgstr "אתרים" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo new file mode 100644 index 0000000..699024a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hi/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo new file mode 100644 index 0000000..a6fc772 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po new file mode 100644 index 0000000..5ef2659 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hsb/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Michael Wolf , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 00:02+0000\n" +"Last-Translator: Michael Wolf \n" +"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"language/hsb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hsb\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +msgid "Sites" +msgstr "Sydła" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domenowe mjeno njemóže mjezoty abo tabulatory wobsahować." + +msgid "domain name" +msgstr "domenowe mjeno" + +msgid "display name" +msgstr "zwobraznjenske mjeno" + +msgid "site" +msgstr "sydło" + +msgid "sites" +msgstr "sydła" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..6a511f9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# András Veres-Szentkirályi, 2016 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: János R (Hangya)\n" +"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Honlapok" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "A domainnév nem tartalmazhat szóközöket és tabulátorokat." + +msgid "domain name" +msgstr "tartománynév" + +msgid "display name" +msgstr "megjelenítendő név" + +msgid "site" +msgstr "honlap" + +msgid "sites" +msgstr "honlapok" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po new file mode 100644 index 0000000..adede4d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/hy/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Սմբատ Պետրոսյան , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 21:51+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Armenian (http://www.transifex.com/django/django/language/" +"hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Կայքեր" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Տիրույթի անվանում դաշտը չի կարող պարունակել բացատներ կամ թաբեր" + +msgid "domain name" +msgstr "Տիրույթի անվանում" + +msgid "display name" +msgstr "Ցուցադրվող անունը" + +msgid "site" +msgstr "կայք" + +msgid "sites" +msgstr "կայքեր" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po new file mode 100644 index 0000000..b777ce6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ia/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Martijn Dekker , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 21:51+0000\n" +"Last-Translator: Martijn Dekker \n" +"Language-Team: Interlingua (http://www.transifex.com/django/django/language/" +"ia/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Sitos" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Le nomine de dominio non pote continer spatios o tabulationes." + +msgid "domain name" +msgstr "nomine de dominio" + +msgid "display name" +msgstr "nomine a monstrar" + +msgid "site" +msgstr "sito" + +msgid "sites" +msgstr "sitos" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po new file mode 100644 index 0000000..40228ed --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/id/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# M Asep Indrayana , 2015 +# rodin , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: rodin \n" +"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sites" +msgstr "Situs" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Nama domain tidak dapat mengandung karakter spasi atau tab." + +msgid "domain name" +msgstr "nama domain" + +msgid "display name" +msgstr "nama yang ditampilkan" + +msgid "site" +msgstr "situs" + +msgid "sites" +msgstr "situs" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po new file mode 100644 index 0000000..3669499 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/io/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Viko Bartero , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-20 01:58+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Ido (http://www.transifex.com/django/django/language/io/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: io\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "La domeno nomo ne povas kontenar spaci, nek tab-signi." + +msgid "domain name" +msgstr "domeno nomo" + +msgid "display name" +msgstr "montrita nomo" + +msgid "site" +msgstr "ret-situo" + +msgid "sites" +msgstr "ret-situi" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cbfa0fc Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/is/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6670c45 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ja/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo new file mode 100644 index 0000000..c7eb889 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ka/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo new file mode 100644 index 0000000..edfaf6d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kk/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..234ed90 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/kn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..f919c3b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,40 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Kostas , 2011 +# Matas Dailyda , 2015 +# Simonas Kazlauskas , 2013 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Matas Dailyda \n" +"Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" +"lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2);\n" + +msgid "Sites" +msgstr "Tinklalapiai" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domene negali būti tarpų ar tabuliavimo ženklų." + +msgid "domain name" +msgstr "domeno vardas" + +msgid "display name" +msgstr "rodomas vardas" + +msgid "site" +msgstr "tinklalapis" + +msgid "sites" +msgstr "tinklalapiai" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po new file mode 100644 index 0000000..3e70265 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ml/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Hrishikesh , 2019 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2019-03-03 09:57+0000\n" +"Last-Translator: Hrishikesh \n" +"Language-Team: Malayalam (http://www.transifex.com/django/django/language/" +"ml/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "സൈറ്റുകൾ" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "ഡൊമൈനിന്റെ പേരിൽ സ്പെയ്സുകളോ ടാബുകളോ അനുവദനീയമല്ല." + +msgid "domain name" +msgstr "ഡൊമൈനിന്റെ പേര്" + +msgid "display name" +msgstr "കാഴ്ചയ്ക്കായുള്ള പേര്" + +msgid "site" +msgstr "സൈറ്റ്" + +msgid "sites" +msgstr "സൈറ്റുകള്‍" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6b1748b Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/mn/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po new file mode 100644 index 0000000..281b517 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nb/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Alexander Hansen , 2013 +# Jannis Leidel , 2011 +# Jon , 2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" +"language/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Nettsteder" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domenenavnet kan ikke inneholde mellomrom." + +msgid "domain name" +msgstr "domenenavn" + +msgid "display name" +msgstr "visningsnavn" + +msgid "site" +msgstr "nettsted" + +msgid "sites" +msgstr "nettsteder" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po new file mode 100644 index 0000000..9320696 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ne/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Sagar Chalise , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Sagar Chalise \n" +"Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "साइटहरु" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "डोमेनमा खाली ठाउँहरु हुनु हुँदैन ।" + +msgid "domain name" +msgstr "डोमेनको नाम" + +msgid "display name" +msgstr "देखिने नाम" + +msgid "site" +msgstr "साइट" + +msgid "sites" +msgstr "साइटहरु" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..1f9896f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/nl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo new file mode 100644 index 0000000..6dbbccd Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/os/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po new file mode 100644 index 0000000..0d685d4 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pa/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-19 16:40+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" +"language/pa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pa\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "" + +msgid "domain name" +msgstr "ਡੋਮੇਨ ਨਾਂ" + +msgid "display name" +msgstr "ਵੇਖਾਉਣ ਲਈ ਨਾਂ" + +msgid "site" +msgstr "ਸਾਈਟ" + +msgid "sites" +msgstr "ਸਾਈਟਾਂ" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fde4570 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pl/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..81c6300 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..e146026 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Allisson Azevedo , 2014 +# Eduardo Cereto Carvalho, 2013 +# Jannis Leidel , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: andrewsmedina \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +msgid "Sites" +msgstr "Sites" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "O nome do domínio não pode conter espaços ou tabulações." + +msgid "domain name" +msgstr "nome do domínio" + +msgid "display name" +msgstr "nome para exibição" + +msgid "site" +msgstr "site" + +msgid "sites" +msgstr "sites" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..cd6daf4 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/ru/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po new file mode 100644 index 0000000..9b3f318 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sk/LC_MESSAGES/django.po @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Marian Andre , 2013 +# Martin Tóth , 2017 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Martin Tóth \n" +"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +msgid "Sites" +msgstr "Sídla" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Názov domény nemôže obsahovať medzery alebo tabulátory." + +msgid "domain name" +msgstr "názov domény" + +msgid "display name" +msgstr "zobrazené meno" + +msgid "site" +msgstr "sídlo" + +msgid "sites" +msgstr "sídla" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po new file mode 100644 index 0000000..3ce9830 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sq/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Besnik , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-11-29 23:00+0000\n" +"Last-Translator: Besnik \n" +"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Sajte" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Emri i përkatësisë s’mund të përmbajë hapësira ose tabulacione." + +msgid "domain name" +msgstr "emër përkatësie" + +msgid "display name" +msgstr "emër shfaqjeje" + +msgid "site" +msgstr "sajt" + +msgid "sites" +msgstr "sajte" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo new file mode 100644 index 0000000..8ac57bb Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sr/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po new file mode 100644 index 0000000..c3206e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/sw/LC_MESSAGES/django.po @@ -0,0 +1,36 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Machaku , 2013-2014 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Jannis Leidel \n" +"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"sw/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Sites" +msgstr "Tovuti" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Jina la kikoa haliwezi kuwa na nafasi yeyote kati yake." + +msgid "domain name" +msgstr "jina la kikoa" + +msgid "display name" +msgstr "jina" + +msgid "site" +msgstr "tovuti" + +msgid "sites" +msgstr "tovuti" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo new file mode 100644 index 0000000..384d79a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/tt/LC_MESSAGES/django.mo differ diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po new file mode 100644 index 0000000..4f26906 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/uz/LC_MESSAGES/django.po @@ -0,0 +1,35 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Nuruddin Iminokhunov , 2016 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 01:18+0000\n" +"Last-Translator: Nuruddin Iminokhunov \n" +"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sites" +msgstr "Saytlar" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Domen ismi tab`lar va bo'shliqlarsiz bo'lishi kerak" + +msgid "domain name" +msgstr "domen nomi" + +msgid "display name" +msgstr "ko'rsatiladigan ismi" + +msgid "site" +msgstr "sayt" + +msgid "sites" +msgstr "saytlar" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..6f7d6a0 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jannis Leidel , 2011 +# Thanh Le Viet , 2013 +# Tran , 2011 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-01-17 11:07+0100\n" +"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"Last-Translator: Tran Van \n" +"Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" +"vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Sites" +msgstr "" + +msgid "The domain name cannot contain any spaces or tabs." +msgstr "Tên miền không gồm kí tự trống hoặc tab" + +msgid "domain name" +msgstr "Tên miền" + +msgid "display name" +msgstr "Tên hiển thị" + +msgid "site" +msgstr "trang web" + +msgid "sites" +msgstr "các trang web" diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/migrations/0001_initial.py b/venv/lib/python3.7/site-packages/django/contrib/sites/migrations/0001_initial.py new file mode 100644 index 0000000..a763986 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/migrations/0001_initial.py @@ -0,0 +1,31 @@ +import django.contrib.sites.models +from django.contrib.sites.models import _simple_domain_name_validator +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [] + + operations = [ + migrations.CreateModel( + name='Site', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('domain', models.CharField( + max_length=100, verbose_name='domain name', validators=[_simple_domain_name_validator] + )), + ('name', models.CharField(max_length=50, verbose_name='display name')), + ], + options={ + 'ordering': ('domain',), + 'db_table': 'django_site', + 'verbose_name': 'site', + 'verbose_name_plural': 'sites', + }, + bases=(models.Model,), + managers=[ + ('objects', django.contrib.sites.models.SiteManager()), + ], + ), + ] diff --git a/venv/lib/python3.7/site-packages/django/contrib/sites/requests.py b/venv/lib/python3.7/site-packages/django/contrib/sites/requests.py new file mode 100644 index 0000000..f6f0270 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/sites/requests.py @@ -0,0 +1,19 @@ +class RequestSite: + """ + A class that shares the primary interface of Site (i.e., it has ``domain`` + and ``name`` attributes) but gets its data from an HttpRequest object + rather than from a database. + + The save() and delete() methods raise NotImplementedError. + """ + def __init__(self, request): + self.domain = self.name = request.get_host() + + def __str__(self): + return self.domain + + def save(self, force_insert=False, force_update=False): + raise NotImplementedError('RequestSite cannot be saved.') + + def delete(self): + raise NotImplementedError('RequestSite cannot be deleted.') diff --git a/venv/lib/python3.7/site-packages/django/contrib/staticfiles/finders.py b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/finders.py new file mode 100644 index 0000000..8d8f1cb --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/finders.py @@ -0,0 +1,296 @@ +import functools +import os +from collections import OrderedDict + +from django.apps import apps +from django.conf import settings +from django.contrib.staticfiles import utils +from django.core.checks import Error +from django.core.exceptions import ImproperlyConfigured +from django.core.files.storage import ( + FileSystemStorage, Storage, default_storage, +) +from django.utils._os import safe_join +from django.utils.functional import LazyObject, empty +from django.utils.module_loading import import_string + +# To keep track on which directories the finder has searched the static files. +searched_locations = [] + + +class BaseFinder: + """ + A base file finder to be used for custom staticfiles finder classes. + """ + def check(self, **kwargs): + raise NotImplementedError( + 'subclasses may provide a check() method to verify the finder is ' + 'configured correctly.' + ) + + def find(self, path, all=False): + """ + Given a relative file path, find an absolute file path. + + If the ``all`` parameter is False (default) return only the first found + file path; if True, return a list of all found files paths. + """ + raise NotImplementedError('subclasses of BaseFinder must provide a find() method') + + def list(self, ignore_patterns): + """ + Given an optional list of paths to ignore, return a two item iterable + consisting of the relative path and storage instance. + """ + raise NotImplementedError('subclasses of BaseFinder must provide a list() method') + + +class FileSystemFinder(BaseFinder): + """ + A static files finder that uses the ``STATICFILES_DIRS`` setting + to locate files. + """ + def __init__(self, app_names=None, *args, **kwargs): + # List of locations with static files + self.locations = [] + # Maps dir paths to an appropriate storage instance + self.storages = OrderedDict() + for root in settings.STATICFILES_DIRS: + if isinstance(root, (list, tuple)): + prefix, root = root + else: + prefix = '' + if (prefix, root) not in self.locations: + self.locations.append((prefix, root)) + for prefix, root in self.locations: + filesystem_storage = FileSystemStorage(location=root) + filesystem_storage.prefix = prefix + self.storages[root] = filesystem_storage + super().__init__(*args, **kwargs) + + def check(self, **kwargs): + errors = [] + if not isinstance(settings.STATICFILES_DIRS, (list, tuple)): + errors.append(Error( + 'The STATICFILES_DIRS setting is not a tuple or list.', + hint='Perhaps you forgot a trailing comma?', + id='staticfiles.E001', + )) + for root in settings.STATICFILES_DIRS: + if isinstance(root, (list, tuple)): + prefix, root = root + if prefix.endswith('/'): + errors.append(Error( + 'The prefix %r in the STATICFILES_DIRS setting must ' + 'not end with a slash.' % prefix, + id='staticfiles.E003', + )) + if settings.STATIC_ROOT and os.path.abspath(settings.STATIC_ROOT) == os.path.abspath(root): + errors.append(Error( + 'The STATICFILES_DIRS setting should not contain the ' + 'STATIC_ROOT setting.', + id='staticfiles.E002', + )) + return errors + + def find(self, path, all=False): + """ + Look for files in the extra locations as defined in STATICFILES_DIRS. + """ + matches = [] + for prefix, root in self.locations: + if root not in searched_locations: + searched_locations.append(root) + matched_path = self.find_location(root, path, prefix) + if matched_path: + if not all: + return matched_path + matches.append(matched_path) + return matches + + def find_location(self, root, path, prefix=None): + """ + Find a requested static file in a location and return the found + absolute path (or ``None`` if no match). + """ + if prefix: + prefix = '%s%s' % (prefix, os.sep) + if not path.startswith(prefix): + return None + path = path[len(prefix):] + path = safe_join(root, path) + if os.path.exists(path): + return path + + def list(self, ignore_patterns): + """ + List all files in all locations. + """ + for prefix, root in self.locations: + storage = self.storages[root] + for path in utils.get_files(storage, ignore_patterns): + yield path, storage + + +class AppDirectoriesFinder(BaseFinder): + """ + A static files finder that looks in the directory of each app as + specified in the source_dir attribute. + """ + storage_class = FileSystemStorage + source_dir = 'static' + + def __init__(self, app_names=None, *args, **kwargs): + # The list of apps that are handled + self.apps = [] + # Mapping of app names to storage instances + self.storages = OrderedDict() + app_configs = apps.get_app_configs() + if app_names: + app_names = set(app_names) + app_configs = [ac for ac in app_configs if ac.name in app_names] + for app_config in app_configs: + app_storage = self.storage_class( + os.path.join(app_config.path, self.source_dir)) + if os.path.isdir(app_storage.location): + self.storages[app_config.name] = app_storage + if app_config.name not in self.apps: + self.apps.append(app_config.name) + super().__init__(*args, **kwargs) + + def list(self, ignore_patterns): + """ + List all files in all app storages. + """ + for storage in self.storages.values(): + if storage.exists(''): # check if storage location exists + for path in utils.get_files(storage, ignore_patterns): + yield path, storage + + def find(self, path, all=False): + """ + Look for files in the app directories. + """ + matches = [] + for app in self.apps: + app_location = self.storages[app].location + if app_location not in searched_locations: + searched_locations.append(app_location) + match = self.find_in_app(app, path) + if match: + if not all: + return match + matches.append(match) + return matches + + def find_in_app(self, app, path): + """ + Find a requested static file in an app's static locations. + """ + storage = self.storages.get(app) + if storage: + # only try to find a file if the source dir actually exists + if storage.exists(path): + matched_path = storage.path(path) + if matched_path: + return matched_path + + +class BaseStorageFinder(BaseFinder): + """ + A base static files finder to be used to extended + with an own storage class. + """ + storage = None + + def __init__(self, storage=None, *args, **kwargs): + if storage is not None: + self.storage = storage + if self.storage is None: + raise ImproperlyConfigured("The staticfiles storage finder %r " + "doesn't have a storage class " + "assigned." % self.__class__) + # Make sure we have a storage instance here. + if not isinstance(self.storage, (Storage, LazyObject)): + self.storage = self.storage() + super().__init__(*args, **kwargs) + + def find(self, path, all=False): + """ + Look for files in the default file storage, if it's local. + """ + try: + self.storage.path('') + except NotImplementedError: + pass + else: + if self.storage.location not in searched_locations: + searched_locations.append(self.storage.location) + if self.storage.exists(path): + match = self.storage.path(path) + if all: + match = [match] + return match + return [] + + def list(self, ignore_patterns): + """ + List all files of the storage. + """ + for path in utils.get_files(self.storage, ignore_patterns): + yield path, self.storage + + +class DefaultStorageFinder(BaseStorageFinder): + """ + A static files finder that uses the default storage backend. + """ + storage = default_storage + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + base_location = getattr(self.storage, 'base_location', empty) + if not base_location: + raise ImproperlyConfigured("The storage backend of the " + "staticfiles finder %r doesn't have " + "a valid location." % self.__class__) + + +def find(path, all=False): + """ + Find a static file with the given path using all enabled finders. + + If ``all`` is ``False`` (default), return the first matching + absolute path (or ``None`` if no match). Otherwise return a list. + """ + searched_locations[:] = [] + matches = [] + for finder in get_finders(): + result = finder.find(path, all=all) + if not all and result: + return result + if not isinstance(result, (list, tuple)): + result = [result] + matches.extend(result) + if matches: + return matches + # No match. + return [] if all else None + + +def get_finders(): + for finder_path in settings.STATICFILES_FINDERS: + yield get_finder(finder_path) + + +@functools.lru_cache(maxsize=None) +def get_finder(import_path): + """ + Import the staticfiles finder class described by import_path, where + import_path is the full Python path to the class. + """ + Finder = import_string(import_path) + if not issubclass(Finder, BaseFinder): + raise ImproperlyConfigured('Finder "%s" is not a subclass of "%s"' % + (Finder, BaseFinder)) + return Finder() diff --git a/venv/lib/python3.7/site-packages/django/contrib/staticfiles/handlers.py b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/handlers.py new file mode 100644 index 0000000..9546635 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/handlers.py @@ -0,0 +1,66 @@ +from urllib.parse import urlparse +from urllib.request import url2pathname + +from django.conf import settings +from django.contrib.staticfiles import utils +from django.contrib.staticfiles.views import serve +from django.core.handlers.exception import response_for_exception +from django.core.handlers.wsgi import WSGIHandler, get_path_info + + +class StaticFilesHandler(WSGIHandler): + """ + WSGI middleware that intercepts calls to the static files directory, as + defined by the STATIC_URL setting, and serves those files. + """ + # May be used to differentiate between handler types (e.g. in a + # request_finished signal) + handles_files = True + + def __init__(self, application): + self.application = application + self.base_url = urlparse(self.get_base_url()) + super().__init__() + + def load_middleware(self): + # Middleware are already loaded for self.application; no need to reload + # them for self. + pass + + def get_base_url(self): + utils.check_settings() + return settings.STATIC_URL + + def _should_handle(self, path): + """ + Check if the path should be handled. Ignore the path if: + * the host is provided as part of the base_url + * the request's path isn't under the media path (or equal) + """ + return path.startswith(self.base_url[2]) and not self.base_url[1] + + def file_path(self, url): + """ + Return the relative path to the media file on disk for the given URL. + """ + relative_url = url[len(self.base_url[2]):] + return url2pathname(relative_url) + + def serve(self, request): + """Serve the request path.""" + return serve(request, self.file_path(request.path), insecure=True) + + def get_response(self, request): + from django.http import Http404 + + if self._should_handle(request.path): + try: + return self.serve(request) + except Http404 as e: + return response_for_exception(request, e) + return super().get_response(request) + + def __call__(self, environ, start_response): + if not self._should_handle(get_path_info(environ)): + return self.application(environ, start_response) + return super().__call__(environ, start_response) diff --git a/venv/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/findstatic.py b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/findstatic.py new file mode 100644 index 0000000..cd58015 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/findstatic.py @@ -0,0 +1,43 @@ +import os + +from django.contrib.staticfiles import finders +from django.core.management.base import LabelCommand + + +class Command(LabelCommand): + help = "Finds the absolute paths for the given static file(s)." + label = 'staticfile' + + def add_arguments(self, parser): + super().add_arguments(parser) + parser.add_argument( + '--first', action='store_false', dest='all', + help="Only return the first match for each static file.", + ) + + def handle_label(self, path, **options): + verbosity = options['verbosity'] + result = finders.find(path, all=options['all']) + if verbosity >= 2: + searched_locations = ( + "\nLooking in the following locations:\n %s" % + "\n ".join(finders.searched_locations) + ) + else: + searched_locations = '' + if result: + if not isinstance(result, (list, tuple)): + result = [result] + result = (os.path.realpath(path) for path in result) + if verbosity >= 1: + file_list = '\n '.join(result) + return ("Found '%s' here:\n %s%s" % + (path, file_list, searched_locations)) + else: + return '\n'.join(result) + else: + message = ["No matching file found for '%s'." % path] + if verbosity >= 2: + message.append(searched_locations) + if verbosity >= 1: + self.stderr.write('\n'.join(message)) diff --git a/venv/lib/python3.7/site-packages/django/contrib/staticfiles/urls.py b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/urls.py new file mode 100644 index 0000000..6278f35 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/urls.py @@ -0,0 +1,19 @@ +from django.conf import settings +from django.conf.urls.static import static +from django.contrib.staticfiles.views import serve + +urlpatterns = [] + + +def staticfiles_urlpatterns(prefix=None): + """ + Helper function to return a URL pattern for serving static files. + """ + if prefix is None: + prefix = settings.STATIC_URL + return static(prefix, view=serve) + + +# Only append if urlpatterns are empty +if settings.DEBUG and not urlpatterns: + urlpatterns += staticfiles_urlpatterns() diff --git a/venv/lib/python3.7/site-packages/django/contrib/staticfiles/views.py b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/views.py new file mode 100644 index 0000000..9987f49 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/staticfiles/views.py @@ -0,0 +1,39 @@ +""" +Views and functions for serving static files. These are only to be used during +development, and SHOULD NOT be used in a production setting. + +""" +import os +import posixpath + +from django.conf import settings +from django.contrib.staticfiles import finders +from django.http import Http404 +from django.views import static + + +def serve(request, path, insecure=False, **kwargs): + """ + Serve static files below a given point in the directory structure or + from locations inferred from the staticfiles finders. + + To use, put a URL pattern such as:: + + from django.contrib.staticfiles import views + + url(r'^(?P.*)$', views.serve) + + in your URLconf. + + It uses the django.views.static.serve() view to serve the found files. + """ + if not settings.DEBUG and not insecure: + raise Http404 + normalized_path = posixpath.normpath(path).lstrip('/') + absolute_path = finders.find(normalized_path) + if not absolute_path: + if path.endswith('/') or path == '': + raise Http404("Directory indexes are not allowed here.") + raise Http404("'%s' could not be found" % path) + document_root, path = os.path.split(absolute_path) + return static.serve(request, path, document_root=document_root, **kwargs) diff --git a/venv/lib/python3.7/site-packages/django/contrib/syndication/apps.py b/venv/lib/python3.7/site-packages/django/contrib/syndication/apps.py new file mode 100644 index 0000000..b3f7c6c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/contrib/syndication/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class SyndicationConfig(AppConfig): + name = 'django.contrib.syndication' + verbose_name = _("Syndication") diff --git a/venv/lib/python3.7/site-packages/django/core/__init__.py b/venv/lib/python3.7/site-packages/django/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/core/cache/__init__.py b/venv/lib/python3.7/site-packages/django/core/cache/__init__.py new file mode 100644 index 0000000..a6b956f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/cache/__init__.py @@ -0,0 +1,124 @@ +""" +Caching framework. + +This package defines set of cache backends that all conform to a simple API. +In a nutshell, a cache is a set of values -- which can be any object that +may be pickled -- identified by string keys. For the complete API, see +the abstract BaseCache class in django.core.cache.backends.base. + +Client code should use the `cache` variable defined here to access the default +cache backend and look up non-default cache backends in the `caches` dict-like +object. + +See docs/topics/cache.txt for information on the public API. +""" +from threading import local + +from django.conf import settings +from django.core import signals +from django.core.cache.backends.base import ( + BaseCache, CacheKeyWarning, InvalidCacheBackendError, +) +from django.utils.module_loading import import_string + +__all__ = [ + 'cache', 'caches', 'DEFAULT_CACHE_ALIAS', 'InvalidCacheBackendError', + 'CacheKeyWarning', 'BaseCache', +] + +DEFAULT_CACHE_ALIAS = 'default' + + +def _create_cache(backend, **kwargs): + try: + # Try to get the CACHES entry for the given backend name first + try: + conf = settings.CACHES[backend] + except KeyError: + try: + # Trying to import the given backend, in case it's a dotted path + import_string(backend) + except ImportError as e: + raise InvalidCacheBackendError("Could not find backend '%s': %s" % ( + backend, e)) + location = kwargs.pop('LOCATION', '') + params = kwargs + else: + params = {**conf, **kwargs} + backend = params.pop('BACKEND') + location = params.pop('LOCATION', '') + backend_cls = import_string(backend) + except ImportError as e: + raise InvalidCacheBackendError( + "Could not find backend '%s': %s" % (backend, e)) + return backend_cls(location, params) + + +class CacheHandler: + """ + A Cache Handler to manage access to Cache instances. + + Ensure only one instance of each alias exists per thread. + """ + def __init__(self): + self._caches = local() + + def __getitem__(self, alias): + try: + return self._caches.caches[alias] + except AttributeError: + self._caches.caches = {} + except KeyError: + pass + + if alias not in settings.CACHES: + raise InvalidCacheBackendError( + "Could not find config for '%s' in settings.CACHES" % alias + ) + + cache = _create_cache(alias) + self._caches.caches[alias] = cache + return cache + + def all(self): + return getattr(self._caches, 'caches', {}).values() + + +caches = CacheHandler() + + +class DefaultCacheProxy: + """ + Proxy access to the default Cache object's attributes. + + This allows the legacy `cache` object to be thread-safe using the new + ``caches`` API. + """ + def __getattr__(self, name): + return getattr(caches[DEFAULT_CACHE_ALIAS], name) + + def __setattr__(self, name, value): + return setattr(caches[DEFAULT_CACHE_ALIAS], name, value) + + def __delattr__(self, name): + return delattr(caches[DEFAULT_CACHE_ALIAS], name) + + def __contains__(self, key): + return key in caches[DEFAULT_CACHE_ALIAS] + + def __eq__(self, other): + return caches[DEFAULT_CACHE_ALIAS] == other + + +cache = DefaultCacheProxy() + + +def close_caches(**kwargs): + # Some caches -- python-memcached in particular -- need to do a cleanup at the + # end of a request cycle. If not implemented in a particular backend + # cache.close is a no-op + for cache in caches.all(): + cache.close() + + +signals.request_finished.connect(close_caches) diff --git a/venv/lib/python3.7/site-packages/django/core/cache/backends/memcached.py b/venv/lib/python3.7/site-packages/django/core/cache/backends/memcached.py new file mode 100644 index 0000000..bb27cb5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/cache/backends/memcached.py @@ -0,0 +1,186 @@ +"Memcached cache backend" + +import pickle +import re +import time + +from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache +from django.utils.functional import cached_property + + +class BaseMemcachedCache(BaseCache): + def __init__(self, server, params, library, value_not_found_exception): + super().__init__(params) + if isinstance(server, str): + self._servers = re.split('[;,]', server) + else: + self._servers = server + + # The exception type to catch from the underlying library for a key + # that was not found. This is a ValueError for python-memcache, + # pylibmc.NotFound for pylibmc, and cmemcache will return None without + # raising an exception. + self.LibraryValueNotFoundException = value_not_found_exception + + self._lib = library + self._options = params.get('OPTIONS') or {} + + @property + def _cache(self): + """ + Implement transparent thread-safe access to a memcached client. + """ + if getattr(self, '_client', None) is None: + self._client = self._lib.Client(self._servers, **self._options) + + return self._client + + def get_backend_timeout(self, timeout=DEFAULT_TIMEOUT): + """ + Memcached deals with long (> 30 days) timeouts in a special + way. Call this function to obtain a safe value for your timeout. + """ + if timeout == DEFAULT_TIMEOUT: + timeout = self.default_timeout + + if timeout is None: + # Using 0 in memcache sets a non-expiring timeout. + return 0 + elif int(timeout) == 0: + # Other cache backends treat 0 as set-and-expire. To achieve this + # in memcache backends, a negative timeout must be passed. + timeout = -1 + + if timeout > 2592000: # 60*60*24*30, 30 days + # See https://github.com/memcached/memcached/wiki/Programming#expiration + # "Expiration times can be set from 0, meaning "never expire", to + # 30 days. Any time higher than 30 days is interpreted as a Unix + # timestamp date. If you want to expire an object on January 1st of + # next year, this is how you do that." + # + # This means that we have to switch to absolute timestamps. + timeout += int(time.time()) + return int(timeout) + + def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): + key = self.make_key(key, version=version) + return self._cache.add(key, value, self.get_backend_timeout(timeout)) + + def get(self, key, default=None, version=None): + key = self.make_key(key, version=version) + val = self._cache.get(key) + if val is None: + return default + return val + + def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None): + key = self.make_key(key, version=version) + if not self._cache.set(key, value, self.get_backend_timeout(timeout)): + # make sure the key doesn't keep its old value in case of failure to set (memcached's 1MB limit) + self._cache.delete(key) + + def delete(self, key, version=None): + key = self.make_key(key, version=version) + self._cache.delete(key) + + def get_many(self, keys, version=None): + key_map = {self.make_key(key, version=version): key for key in keys} + ret = self._cache.get_multi(key_map.keys()) + return {key_map[k]: v for k, v in ret.items()} + + def close(self, **kwargs): + # Many clients don't clean up connections properly. + self._cache.disconnect_all() + + def incr(self, key, delta=1, version=None): + key = self.make_key(key, version=version) + # memcached doesn't support a negative delta + if delta < 0: + return self._cache.decr(key, -delta) + try: + val = self._cache.incr(key, delta) + + # python-memcache responds to incr on nonexistent keys by + # raising a ValueError, pylibmc by raising a pylibmc.NotFound + # and Cmemcache returns None. In all cases, + # we should raise a ValueError though. + except self.LibraryValueNotFoundException: + val = None + if val is None: + raise ValueError("Key '%s' not found" % key) + return val + + def decr(self, key, delta=1, version=None): + key = self.make_key(key, version=version) + # memcached doesn't support a negative delta + if delta < 0: + return self._cache.incr(key, -delta) + try: + val = self._cache.decr(key, delta) + + # python-memcache responds to incr on nonexistent keys by + # raising a ValueError, pylibmc by raising a pylibmc.NotFound + # and Cmemcache returns None. In all cases, + # we should raise a ValueError though. + except self.LibraryValueNotFoundException: + val = None + if val is None: + raise ValueError("Key '%s' not found" % key) + return val + + def set_many(self, data, timeout=DEFAULT_TIMEOUT, version=None): + safe_data = {} + original_keys = {} + for key, value in data.items(): + safe_key = self.make_key(key, version=version) + safe_data[safe_key] = value + original_keys[safe_key] = key + failed_keys = self._cache.set_multi(safe_data, self.get_backend_timeout(timeout)) + return [original_keys[k] for k in failed_keys] + + def delete_many(self, keys, version=None): + self._cache.delete_multi(self.make_key(key, version=version) for key in keys) + + def clear(self): + self._cache.flush_all() + + +class MemcachedCache(BaseMemcachedCache): + "An implementation of a cache binding using python-memcached" + def __init__(self, server, params): + import memcache + super().__init__(server, params, library=memcache, value_not_found_exception=ValueError) + + @property + def _cache(self): + if getattr(self, '_client', None) is None: + client_kwargs = {'pickleProtocol': pickle.HIGHEST_PROTOCOL} + client_kwargs.update(self._options) + self._client = self._lib.Client(self._servers, **client_kwargs) + return self._client + + def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): + key = self.make_key(key, version=version) + return self._cache.touch(key, self.get_backend_timeout(timeout)) != 0 + + +class PyLibMCCache(BaseMemcachedCache): + "An implementation of a cache binding using pylibmc" + def __init__(self, server, params): + import pylibmc + super().__init__(server, params, library=pylibmc, value_not_found_exception=pylibmc.NotFound) + + @cached_property + def _cache(self): + return self._lib.Client(self._servers, **self._options) + + def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): + key = self.make_key(key, version=version) + if timeout == 0: + return self._cache.delete(key) + return self._cache.touch(key, self.get_backend_timeout(timeout)) + + def close(self, **kwargs): + # libmemcached manages its own connections. Don't call disconnect_all() + # as it resets the failover state and creates unnecessary reconnects. + pass diff --git a/venv/lib/python3.7/site-packages/django/core/checks/messages.py b/venv/lib/python3.7/site-packages/django/core/checks/messages.py new file mode 100644 index 0000000..aacac63 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/checks/messages.py @@ -0,0 +1,75 @@ +# Levels +DEBUG = 10 +INFO = 20 +WARNING = 30 +ERROR = 40 +CRITICAL = 50 + + +class CheckMessage: + + def __init__(self, level, msg, hint=None, obj=None, id=None): + assert isinstance(level, int), "The first argument should be level." + self.level = level + self.msg = msg + self.hint = hint + self.obj = obj + self.id = id + + def __eq__(self, other): + return ( + isinstance(other, self.__class__) and + all(getattr(self, attr) == getattr(other, attr) + for attr in ['level', 'msg', 'hint', 'obj', 'id']) + ) + + def __str__(self): + from django.db import models + + if self.obj is None: + obj = "?" + elif isinstance(self.obj, models.base.ModelBase): + # We need to hardcode ModelBase and Field cases because its __str__ + # method doesn't return "applabel.modellabel" and cannot be changed. + obj = self.obj._meta.label + else: + obj = str(self.obj) + id = "(%s) " % self.id if self.id else "" + hint = "\n\tHINT: %s" % self.hint if self.hint else '' + return "%s: %s%s%s" % (obj, id, self.msg, hint) + + def __repr__(self): + return "<%s: level=%r, msg=%r, hint=%r, obj=%r, id=%r>" % \ + (self.__class__.__name__, self.level, self.msg, self.hint, self.obj, self.id) + + def is_serious(self, level=ERROR): + return self.level >= level + + def is_silenced(self): + from django.conf import settings + return self.id in settings.SILENCED_SYSTEM_CHECKS + + +class Debug(CheckMessage): + def __init__(self, *args, **kwargs): + super().__init__(DEBUG, *args, **kwargs) + + +class Info(CheckMessage): + def __init__(self, *args, **kwargs): + super().__init__(INFO, *args, **kwargs) + + +class Warning(CheckMessage): + def __init__(self, *args, **kwargs): + super().__init__(WARNING, *args, **kwargs) + + +class Error(CheckMessage): + def __init__(self, *args, **kwargs): + super().__init__(ERROR, *args, **kwargs) + + +class Critical(CheckMessage): + def __init__(self, *args, **kwargs): + super().__init__(CRITICAL, *args, **kwargs) diff --git a/venv/lib/python3.7/site-packages/django/core/checks/security/base.py b/venv/lib/python3.7/site-packages/django/core/checks/security/base.py new file mode 100644 index 0000000..2f8a0f1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/checks/security/base.py @@ -0,0 +1,210 @@ +from django.conf import settings + +from .. import Tags, Warning, register + +SECRET_KEY_MIN_LENGTH = 50 +SECRET_KEY_MIN_UNIQUE_CHARACTERS = 5 + +W001 = Warning( + "You do not have 'django.middleware.security.SecurityMiddleware' " + "in your MIDDLEWARE so the SECURE_HSTS_SECONDS, " + "SECURE_CONTENT_TYPE_NOSNIFF, " + "SECURE_BROWSER_XSS_FILTER, and SECURE_SSL_REDIRECT settings " + "will have no effect.", + id='security.W001', +) + +W002 = Warning( + "You do not have " + "'django.middleware.clickjacking.XFrameOptionsMiddleware' in your " + "MIDDLEWARE, so your pages will not be served with an " + "'x-frame-options' header. Unless there is a good reason for your " + "site to be served in a frame, you should consider enabling this " + "header to help prevent clickjacking attacks.", + id='security.W002', +) + +W004 = Warning( + "You have not set a value for the SECURE_HSTS_SECONDS setting. " + "If your entire site is served only over SSL, you may want to consider " + "setting a value and enabling HTTP Strict Transport Security. " + "Be sure to read the documentation first; enabling HSTS carelessly " + "can cause serious, irreversible problems.", + id='security.W004', +) + +W005 = Warning( + "You have not set the SECURE_HSTS_INCLUDE_SUBDOMAINS setting to True. " + "Without this, your site is potentially vulnerable to attack " + "via an insecure connection to a subdomain. Only set this to True if " + "you are certain that all subdomains of your domain should be served " + "exclusively via SSL.", + id='security.W005', +) + +W006 = Warning( + "Your SECURE_CONTENT_TYPE_NOSNIFF setting is not set to True, " + "so your pages will not be served with an " + "'X-Content-Type-Options: nosniff' header. " + "You should consider enabling this header to prevent the " + "browser from identifying content types incorrectly.", + id='security.W006', +) + +W007 = Warning( + "Your SECURE_BROWSER_XSS_FILTER setting is not set to True, " + "so your pages will not be served with an " + "'X-XSS-Protection: 1; mode=block' header. " + "You should consider enabling this header to activate the " + "browser's XSS filtering and help prevent XSS attacks.", + id='security.W007', +) + +W008 = Warning( + "Your SECURE_SSL_REDIRECT setting is not set to True. " + "Unless your site should be available over both SSL and non-SSL " + "connections, you may want to either set this setting True " + "or configure a load balancer or reverse-proxy server " + "to redirect all connections to HTTPS.", + id='security.W008', +) + +W009 = Warning( + "Your SECRET_KEY has less than %(min_length)s characters or less than " + "%(min_unique_chars)s unique characters. Please generate a long and random " + "SECRET_KEY, otherwise many of Django's security-critical features will be " + "vulnerable to attack." % { + 'min_length': SECRET_KEY_MIN_LENGTH, + 'min_unique_chars': SECRET_KEY_MIN_UNIQUE_CHARACTERS, + }, + id='security.W009', +) + +W018 = Warning( + "You should not have DEBUG set to True in deployment.", + id='security.W018', +) + +W019 = Warning( + "You have " + "'django.middleware.clickjacking.XFrameOptionsMiddleware' in your " + "MIDDLEWARE, but X_FRAME_OPTIONS is not set to 'DENY'. " + "The default is 'SAMEORIGIN', but unless there is a good reason for " + "your site to serve other parts of itself in a frame, you should " + "change it to 'DENY'.", + id='security.W019', +) + +W020 = Warning( + "ALLOWED_HOSTS must not be empty in deployment.", + id='security.W020', +) + +W021 = Warning( + "You have not set the SECURE_HSTS_PRELOAD setting to True. Without this, " + "your site cannot be submitted to the browser preload list.", + id='security.W021', +) + + +def _security_middleware(): + return 'django.middleware.security.SecurityMiddleware' in settings.MIDDLEWARE + + +def _xframe_middleware(): + return 'django.middleware.clickjacking.XFrameOptionsMiddleware' in settings.MIDDLEWARE + + +@register(Tags.security, deploy=True) +def check_security_middleware(app_configs, **kwargs): + passed_check = _security_middleware() + return [] if passed_check else [W001] + + +@register(Tags.security, deploy=True) +def check_xframe_options_middleware(app_configs, **kwargs): + passed_check = _xframe_middleware() + return [] if passed_check else [W002] + + +@register(Tags.security, deploy=True) +def check_sts(app_configs, **kwargs): + passed_check = not _security_middleware() or settings.SECURE_HSTS_SECONDS + return [] if passed_check else [W004] + + +@register(Tags.security, deploy=True) +def check_sts_include_subdomains(app_configs, **kwargs): + passed_check = ( + not _security_middleware() or + not settings.SECURE_HSTS_SECONDS or + settings.SECURE_HSTS_INCLUDE_SUBDOMAINS is True + ) + return [] if passed_check else [W005] + + +@register(Tags.security, deploy=True) +def check_sts_preload(app_configs, **kwargs): + passed_check = ( + not _security_middleware() or + not settings.SECURE_HSTS_SECONDS or + settings.SECURE_HSTS_PRELOAD is True + ) + return [] if passed_check else [W021] + + +@register(Tags.security, deploy=True) +def check_content_type_nosniff(app_configs, **kwargs): + passed_check = ( + not _security_middleware() or + settings.SECURE_CONTENT_TYPE_NOSNIFF is True + ) + return [] if passed_check else [W006] + + +@register(Tags.security, deploy=True) +def check_xss_filter(app_configs, **kwargs): + passed_check = ( + not _security_middleware() or + settings.SECURE_BROWSER_XSS_FILTER is True + ) + return [] if passed_check else [W007] + + +@register(Tags.security, deploy=True) +def check_ssl_redirect(app_configs, **kwargs): + passed_check = ( + not _security_middleware() or + settings.SECURE_SSL_REDIRECT is True + ) + return [] if passed_check else [W008] + + +@register(Tags.security, deploy=True) +def check_secret_key(app_configs, **kwargs): + passed_check = ( + getattr(settings, 'SECRET_KEY', None) and + len(set(settings.SECRET_KEY)) >= SECRET_KEY_MIN_UNIQUE_CHARACTERS and + len(settings.SECRET_KEY) >= SECRET_KEY_MIN_LENGTH + ) + return [] if passed_check else [W009] + + +@register(Tags.security, deploy=True) +def check_debug(app_configs, **kwargs): + passed_check = not settings.DEBUG + return [] if passed_check else [W018] + + +@register(Tags.security, deploy=True) +def check_xframe_deny(app_configs, **kwargs): + passed_check = ( + not _xframe_middleware() or + settings.X_FRAME_OPTIONS == 'DENY' + ) + return [] if passed_check else [W019] + + +@register(Tags.security, deploy=True) +def check_allowed_hosts(app_configs, **kwargs): + return [] if settings.ALLOWED_HOSTS else [W020] diff --git a/venv/lib/python3.7/site-packages/django/core/files/base.py b/venv/lib/python3.7/site-packages/django/core/files/base.py new file mode 100644 index 0000000..2ac662e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/files/base.py @@ -0,0 +1,160 @@ +import os +from io import BytesIO, StringIO, UnsupportedOperation + +from django.core.files.utils import FileProxyMixin +from django.utils.functional import cached_property + + +class File(FileProxyMixin): + DEFAULT_CHUNK_SIZE = 64 * 2 ** 10 + + def __init__(self, file, name=None): + self.file = file + if name is None: + name = getattr(file, 'name', None) + self.name = name + if hasattr(file, 'mode'): + self.mode = file.mode + + def __str__(self): + return self.name or '' + + def __repr__(self): + return "<%s: %s>" % (self.__class__.__name__, self or "None") + + def __bool__(self): + return bool(self.name) + + def __len__(self): + return self.size + + @cached_property + def size(self): + if hasattr(self.file, 'size'): + return self.file.size + if hasattr(self.file, 'name'): + try: + return os.path.getsize(self.file.name) + except (OSError, TypeError): + pass + if hasattr(self.file, 'tell') and hasattr(self.file, 'seek'): + pos = self.file.tell() + self.file.seek(0, os.SEEK_END) + size = self.file.tell() + self.file.seek(pos) + return size + raise AttributeError("Unable to determine the file's size.") + + def chunks(self, chunk_size=None): + """ + Read the file and yield chunks of ``chunk_size`` bytes (defaults to + ``File.DEFAULT_CHUNK_SIZE``). + """ + chunk_size = chunk_size or self.DEFAULT_CHUNK_SIZE + try: + self.seek(0) + except (AttributeError, UnsupportedOperation): + pass + + while True: + data = self.read(chunk_size) + if not data: + break + yield data + + def multiple_chunks(self, chunk_size=None): + """ + Return ``True`` if you can expect multiple chunks. + + NB: If a particular file representation is in memory, subclasses should + always return ``False`` -- there's no good reason to read from memory in + chunks. + """ + return self.size > (chunk_size or self.DEFAULT_CHUNK_SIZE) + + def __iter__(self): + # Iterate over this file-like object by newlines + buffer_ = None + for chunk in self.chunks(): + for line in chunk.splitlines(True): + if buffer_: + if endswith_cr(buffer_) and not equals_lf(line): + # Line split after a \r newline; yield buffer_. + yield buffer_ + # Continue with line. + else: + # Line either split without a newline (line + # continues after buffer_) or with \r\n + # newline (line == b'\n'). + line = buffer_ + line + # buffer_ handled, clear it. + buffer_ = None + + # If this is the end of a \n or \r\n line, yield. + if endswith_lf(line): + yield line + else: + buffer_ = line + + if buffer_ is not None: + yield buffer_ + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + def open(self, mode=None): + if not self.closed: + self.seek(0) + elif self.name and os.path.exists(self.name): + self.file = open(self.name, mode or self.mode) + else: + raise ValueError("The file cannot be reopened.") + return self + + def close(self): + self.file.close() + + +class ContentFile(File): + """ + A File-like object that takes just raw content, rather than an actual file. + """ + def __init__(self, content, name=None): + stream_class = StringIO if isinstance(content, str) else BytesIO + super().__init__(stream_class(content), name=name) + self.size = len(content) + + def __str__(self): + return 'Raw content' + + def __bool__(self): + return True + + def open(self, mode=None): + self.seek(0) + return self + + def close(self): + pass + + def write(self, data): + self.__dict__.pop('size', None) # Clear the computed size. + return self.file.write(data) + + +def endswith_cr(line): + """Return True if line (a text or bytestring) ends with '\r'.""" + return line.endswith('\r' if isinstance(line, str) else b'\r') + + +def endswith_lf(line): + """Return True if line (a text or bytestring) ends with '\n'.""" + return line.endswith('\n' if isinstance(line, str) else b'\n') + + +def equals_lf(line): + """Return True if line (a text or bytestring) equals '\n'.""" + return line == ('\n' if isinstance(line, str) else b'\n') diff --git a/venv/lib/python3.7/site-packages/django/core/files/locks.py b/venv/lib/python3.7/site-packages/django/core/files/locks.py new file mode 100644 index 0000000..42631b3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/files/locks.py @@ -0,0 +1,113 @@ +""" +Portable file locking utilities. + +Based partially on an example by Jonathan Feignberg in the Python +Cookbook [1] (licensed under the Python Software License) and a ctypes port by +Anatoly Techtonik for Roundup [2] (license [3]). + +[1] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203 +[2] https://sourceforge.net/p/roundup/code/ci/default/tree/roundup/backends/portalocker.py +[3] https://sourceforge.net/p/roundup/code/ci/default/tree/COPYING.txt + +Example Usage:: + + >>> from django.core.files import locks + >>> with open('./file', 'wb') as f: + ... locks.lock(f, locks.LOCK_EX) + ... f.write('Django') +""" +import os + +__all__ = ('LOCK_EX', 'LOCK_SH', 'LOCK_NB', 'lock', 'unlock') + + +def _fd(f): + """Get a filedescriptor from something which could be a file or an fd.""" + return f.fileno() if hasattr(f, 'fileno') else f + + +if os.name == 'nt': + import msvcrt + from ctypes import (sizeof, c_ulong, c_void_p, c_int64, + Structure, Union, POINTER, windll, byref) + from ctypes.wintypes import BOOL, DWORD, HANDLE + + LOCK_SH = 0 # the default + LOCK_NB = 0x1 # LOCKFILE_FAIL_IMMEDIATELY + LOCK_EX = 0x2 # LOCKFILE_EXCLUSIVE_LOCK + + # --- Adapted from the pyserial project --- + # detect size of ULONG_PTR + if sizeof(c_ulong) != sizeof(c_void_p): + ULONG_PTR = c_int64 + else: + ULONG_PTR = c_ulong + PVOID = c_void_p + + # --- Union inside Structure by stackoverflow:3480240 --- + class _OFFSET(Structure): + _fields_ = [ + ('Offset', DWORD), + ('OffsetHigh', DWORD)] + + class _OFFSET_UNION(Union): + _anonymous_ = ['_offset'] + _fields_ = [ + ('_offset', _OFFSET), + ('Pointer', PVOID)] + + class OVERLAPPED(Structure): + _anonymous_ = ['_offset_union'] + _fields_ = [ + ('Internal', ULONG_PTR), + ('InternalHigh', ULONG_PTR), + ('_offset_union', _OFFSET_UNION), + ('hEvent', HANDLE)] + + LPOVERLAPPED = POINTER(OVERLAPPED) + + # --- Define function prototypes for extra safety --- + LockFileEx = windll.kernel32.LockFileEx + LockFileEx.restype = BOOL + LockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED] + UnlockFileEx = windll.kernel32.UnlockFileEx + UnlockFileEx.restype = BOOL + UnlockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED] + + def lock(f, flags): + hfile = msvcrt.get_osfhandle(_fd(f)) + overlapped = OVERLAPPED() + ret = LockFileEx(hfile, flags, 0, 0, 0xFFFF0000, byref(overlapped)) + return bool(ret) + + def unlock(f): + hfile = msvcrt.get_osfhandle(_fd(f)) + overlapped = OVERLAPPED() + ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped)) + return bool(ret) +else: + try: + import fcntl + LOCK_SH = fcntl.LOCK_SH # shared lock + LOCK_NB = fcntl.LOCK_NB # non-blocking + LOCK_EX = fcntl.LOCK_EX + except (ImportError, AttributeError): + # File locking is not supported. + LOCK_EX = LOCK_SH = LOCK_NB = 0 + + # Dummy functions that don't do anything. + def lock(f, flags): + # File is not locked + return False + + def unlock(f): + # File is unlocked + return True + else: + def lock(f, flags): + ret = fcntl.flock(_fd(f), flags) + return ret == 0 + + def unlock(f): + ret = fcntl.flock(_fd(f), fcntl.LOCK_UN) + return ret == 0 diff --git a/venv/lib/python3.7/site-packages/django/core/files/temp.py b/venv/lib/python3.7/site-packages/django/core/files/temp.py new file mode 100644 index 0000000..0793593 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/files/temp.py @@ -0,0 +1,74 @@ +""" +The temp module provides a NamedTemporaryFile that can be reopened in the same +process on any platform. Most platforms use the standard Python +tempfile.NamedTemporaryFile class, but Windows users are given a custom class. + +This is needed because the Python implementation of NamedTemporaryFile uses the +O_TEMPORARY flag under Windows, which prevents the file from being reopened +if the same flag is not provided [1][2]. Note that this does not address the +more general issue of opening a file for writing and reading in multiple +processes in a manner that works across platforms. + +The custom version of NamedTemporaryFile doesn't support the same keyword +arguments available in tempfile.NamedTemporaryFile. + +1: https://mail.python.org/pipermail/python-list/2005-December/336957.html +2: https://bugs.python.org/issue14243 +""" + +import os +import tempfile + +from django.core.files.utils import FileProxyMixin + +__all__ = ('NamedTemporaryFile', 'gettempdir',) + + +if os.name == 'nt': + class TemporaryFile(FileProxyMixin): + """ + Temporary file object constructor that supports reopening of the + temporary file in Windows. + + Unlike tempfile.NamedTemporaryFile from the standard library, + __init__() doesn't support the 'delete', 'buffering', 'encoding', or + 'newline' keyword arguments. + """ + def __init__(self, mode='w+b', bufsize=-1, suffix='', prefix='', dir=None): + fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir) + self.name = name + self.file = os.fdopen(fd, mode, bufsize) + self.close_called = False + + # Because close can be called during shutdown + # we need to cache os.unlink and access it + # as self.unlink only + unlink = os.unlink + + def close(self): + if not self.close_called: + self.close_called = True + try: + self.file.close() + except (OSError, IOError): + pass + try: + self.unlink(self.name) + except OSError: + pass + + def __del__(self): + self.close() + + def __enter__(self): + self.file.__enter__() + return self + + def __exit__(self, exc, value, tb): + self.file.__exit__(exc, value, tb) + + NamedTemporaryFile = TemporaryFile +else: + NamedTemporaryFile = tempfile.NamedTemporaryFile + +gettempdir = tempfile.gettempdir diff --git a/venv/lib/python3.7/site-packages/django/core/management/__init__.py b/venv/lib/python3.7/site-packages/django/core/management/__init__.py new file mode 100644 index 0000000..e0c924b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/__init__.py @@ -0,0 +1,381 @@ +import functools +import os +import pkgutil +import sys +from collections import OrderedDict, defaultdict +from difflib import get_close_matches +from importlib import import_module + +import django +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.management.base import ( + BaseCommand, CommandError, CommandParser, handle_default_options, +) +from django.core.management.color import color_style +from django.utils import autoreload + + +def find_commands(management_dir): + """ + Given a path to a management directory, return a list of all the command + names that are available. + """ + command_dir = os.path.join(management_dir, 'commands') + return [name for _, name, is_pkg in pkgutil.iter_modules([command_dir]) + if not is_pkg and not name.startswith('_')] + + +def load_command_class(app_name, name): + """ + Given a command name and an application name, return the Command + class instance. Allow all errors raised by the import process + (ImportError, AttributeError) to propagate. + """ + module = import_module('%s.management.commands.%s' % (app_name, name)) + return module.Command() + + +@functools.lru_cache(maxsize=None) +def get_commands(): + """ + Return a dictionary mapping command names to their callback applications. + + Look for a management.commands package in django.core, and in each + installed application -- if a commands package exists, register all + commands in that package. + + Core commands are always included. If a settings module has been + specified, also include user-defined commands. + + The dictionary is in the format {command_name: app_name}. Key-value + pairs from this dictionary can then be used in calls to + load_command_class(app_name, command_name) + + If a specific version of a command must be loaded (e.g., with the + startapp command), the instantiated module can be placed in the + dictionary in place of the application name. + + The dictionary is cached on the first call and reused on subsequent + calls. + """ + commands = {name: 'django.core' for name in find_commands(__path__[0])} + + if not settings.configured: + return commands + + for app_config in reversed(list(apps.get_app_configs())): + path = os.path.join(app_config.path, 'management') + commands.update({name: app_config.name for name in find_commands(path)}) + + return commands + + +def call_command(command_name, *args, **options): + """ + Call the given command, with the given options and args/kwargs. + + This is the primary API you should use for calling specific commands. + + `command_name` may be a string or a command object. Using a string is + preferred unless the command object is required for further processing or + testing. + + Some examples: + call_command('migrate') + call_command('shell', plain=True) + call_command('sqlmigrate', 'myapp') + + from django.core.management.commands import flush + cmd = flush.Command() + call_command(cmd, verbosity=0, interactive=False) + # Do something with cmd ... + """ + if isinstance(command_name, BaseCommand): + # Command object passed in. + command = command_name + command_name = command.__class__.__module__.split('.')[-1] + else: + # Load the command object by name. + try: + app_name = get_commands()[command_name] + except KeyError: + raise CommandError("Unknown command: %r" % command_name) + + if isinstance(app_name, BaseCommand): + # If the command is already loaded, use it directly. + command = app_name + else: + command = load_command_class(app_name, command_name) + + # Simulate argument parsing to get the option defaults (see #10080 for details). + parser = command.create_parser('', command_name) + # Use the `dest` option name from the parser option + opt_mapping = { + min(s_opt.option_strings).lstrip('-').replace('-', '_'): s_opt.dest + for s_opt in parser._actions if s_opt.option_strings + } + arg_options = {opt_mapping.get(key, key): value for key, value in options.items()} + parse_args = [str(a) for a in args] + # Any required arguments which are passed in via **options must be passed + # to parse_args(). + parse_args += [ + '{}={}'.format(min(opt.option_strings), arg_options[opt.dest]) + for opt in parser._actions if opt.required and opt.dest in options + ] + defaults = parser.parse_args(args=parse_args) + defaults = dict(defaults._get_kwargs(), **arg_options) + # Raise an error if any unknown options were passed. + stealth_options = set(command.base_stealth_options + command.stealth_options) + dest_parameters = {action.dest for action in parser._actions} + valid_options = (dest_parameters | stealth_options).union(opt_mapping) + unknown_options = set(options) - valid_options + if unknown_options: + raise TypeError( + "Unknown option(s) for %s command: %s. " + "Valid options are: %s." % ( + command_name, + ', '.join(sorted(unknown_options)), + ', '.join(sorted(valid_options)), + ) + ) + # Move positional args out of options to mimic legacy optparse + args = defaults.pop('args', ()) + if 'skip_checks' not in options: + defaults['skip_checks'] = True + + return command.execute(*args, **defaults) + + +class ManagementUtility: + """ + Encapsulate the logic of the django-admin and manage.py utilities. + """ + def __init__(self, argv=None): + self.argv = argv or sys.argv[:] + self.prog_name = os.path.basename(self.argv[0]) + if self.prog_name == '__main__.py': + self.prog_name = 'python -m django' + self.settings_exception = None + + def main_help_text(self, commands_only=False): + """Return the script's main help text, as a string.""" + if commands_only: + usage = sorted(get_commands()) + else: + usage = [ + "", + "Type '%s help ' for help on a specific subcommand." % self.prog_name, + "", + "Available subcommands:", + ] + commands_dict = defaultdict(lambda: []) + for name, app in get_commands().items(): + if app == 'django.core': + app = 'django' + else: + app = app.rpartition('.')[-1] + commands_dict[app].append(name) + style = color_style() + for app in sorted(commands_dict): + usage.append("") + usage.append(style.NOTICE("[%s]" % app)) + for name in sorted(commands_dict[app]): + usage.append(" %s" % name) + # Output an extra note if settings are not properly configured + if self.settings_exception is not None: + usage.append(style.NOTICE( + "Note that only Django core commands are listed " + "as settings are not properly configured (error: %s)." + % self.settings_exception)) + + return '\n'.join(usage) + + def fetch_command(self, subcommand): + """ + Try to fetch the given subcommand, printing a message with the + appropriate command called from the command line (usually + "django-admin" or "manage.py") if it can't be found. + """ + # Get commands outside of try block to prevent swallowing exceptions + commands = get_commands() + try: + app_name = commands[subcommand] + except KeyError: + if os.environ.get('DJANGO_SETTINGS_MODULE'): + # If `subcommand` is missing due to misconfigured settings, the + # following line will retrigger an ImproperlyConfigured exception + # (get_commands() swallows the original one) so the user is + # informed about it. + settings.INSTALLED_APPS + else: + sys.stderr.write("No Django settings specified.\n") + possible_matches = get_close_matches(subcommand, commands) + sys.stderr.write('Unknown command: %r' % subcommand) + if possible_matches: + sys.stderr.write('. Did you mean %s?' % possible_matches[0]) + sys.stderr.write("\nType '%s help' for usage.\n" % self.prog_name) + sys.exit(1) + if isinstance(app_name, BaseCommand): + # If the command is already loaded, use it directly. + klass = app_name + else: + klass = load_command_class(app_name, subcommand) + return klass + + def autocomplete(self): + """ + Output completion suggestions for BASH. + + The output of this function is passed to BASH's `COMREPLY` variable and + treated as completion suggestions. `COMREPLY` expects a space + separated string as the result. + + The `COMP_WORDS` and `COMP_CWORD` BASH environment variables are used + to get information about the cli input. Please refer to the BASH + man-page for more information about this variables. + + Subcommand options are saved as pairs. A pair consists of + the long option string (e.g. '--exclude') and a boolean + value indicating if the option requires arguments. When printing to + stdout, an equal sign is appended to options which require arguments. + + Note: If debugging this function, it is recommended to write the debug + output in a separate file. Otherwise the debug output will be treated + and formatted as potential completion suggestions. + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'DJANGO_AUTO_COMPLETE' not in os.environ: + return + + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + + try: + curr = cwords[cword - 1] + except IndexError: + curr = '' + + subcommands = [*get_commands(), 'help'] + options = [('--help', False)] + + # subcommand + if cword == 1: + print(' '.join(sorted(filter(lambda x: x.startswith(curr), subcommands)))) + # subcommand options + # special case: the 'help' subcommand has no options + elif cwords[0] in subcommands and cwords[0] != 'help': + subcommand_cls = self.fetch_command(cwords[0]) + # special case: add the names of installed apps to options + if cwords[0] in ('dumpdata', 'sqlmigrate', 'sqlsequencereset', 'test'): + try: + app_configs = apps.get_app_configs() + # Get the last part of the dotted path as the app name. + options.extend((app_config.label, 0) for app_config in app_configs) + except ImportError: + # Fail silently if DJANGO_SETTINGS_MODULE isn't set. The + # user will find out once they execute the command. + pass + parser = subcommand_cls.create_parser('', cwords[0]) + options.extend( + (min(s_opt.option_strings), s_opt.nargs != 0) + for s_opt in parser._actions if s_opt.option_strings + ) + # filter out previously specified options from available options + prev_opts = {x.split('=')[0] for x in cwords[1:cword - 1]} + options = (opt for opt in options if opt[0] not in prev_opts) + + # filter options by current input + options = sorted((k, v) for k, v in options if k.startswith(curr)) + for opt_label, require_arg in options: + # append '=' to options which require args + if require_arg: + opt_label += '=' + print(opt_label) + # Exit code of the bash completion function is never passed back to + # the user, so it's safe to always exit with 0. + # For more details see #25420. + sys.exit(0) + + def execute(self): + """ + Given the command-line arguments, figure out which subcommand is being + run, create a parser appropriate to that command, and run it. + """ + try: + subcommand = self.argv[1] + except IndexError: + subcommand = 'help' # Display help if no arguments were given. + + # Preprocess options to extract --settings and --pythonpath. + # These options could affect the commands that are available, so they + # must be processed early. + parser = CommandParser(usage='%(prog)s subcommand [options] [args]', add_help=False, allow_abbrev=False) + parser.add_argument('--settings') + parser.add_argument('--pythonpath') + parser.add_argument('args', nargs='*') # catch-all + try: + options, args = parser.parse_known_args(self.argv[2:]) + handle_default_options(options) + except CommandError: + pass # Ignore any option errors at this point. + + try: + settings.INSTALLED_APPS + except ImproperlyConfigured as exc: + self.settings_exception = exc + except ImportError as exc: + self.settings_exception = exc + + if settings.configured: + # Start the auto-reloading dev server even if the code is broken. + # The hardcoded condition is a code smell but we can't rely on a + # flag on the command class because we haven't located it yet. + if subcommand == 'runserver' and '--noreload' not in self.argv: + try: + autoreload.check_errors(django.setup)() + except Exception: + # The exception will be raised later in the child process + # started by the autoreloader. Pretend it didn't happen by + # loading an empty list of applications. + apps.all_models = defaultdict(OrderedDict) + apps.app_configs = OrderedDict() + apps.apps_ready = apps.models_ready = apps.ready = True + + # Remove options not compatible with the built-in runserver + # (e.g. options for the contrib.staticfiles' runserver). + # Changes here require manually testing as described in + # #27522. + _parser = self.fetch_command('runserver').create_parser('django', 'runserver') + _options, _args = _parser.parse_known_args(self.argv[2:]) + for _arg in _args: + self.argv.remove(_arg) + + # In all other cases, django.setup() is required to succeed. + else: + django.setup() + + self.autocomplete() + + if subcommand == 'help': + if '--commands' in args: + sys.stdout.write(self.main_help_text(commands_only=True) + '\n') + elif not options.args: + sys.stdout.write(self.main_help_text() + '\n') + else: + self.fetch_command(options.args[0]).print_help(self.prog_name, options.args[0]) + # Special-cases: We want 'django-admin --version' and + # 'django-admin --help' to work, for backwards compatibility. + elif subcommand == 'version' or self.argv[1:] == ['--version']: + sys.stdout.write(django.get_version() + '\n') + elif self.argv[1:] in (['--help'], ['-h']): + sys.stdout.write(self.main_help_text() + '\n') + else: + self.fetch_command(subcommand).run_from_argv(self.argv) + + +def execute_from_command_line(argv=None): + """Run a ManagementUtility.""" + utility = ManagementUtility(argv) + utility.execute() diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/createcachetable.py b/venv/lib/python3.7/site-packages/django/core/management/commands/createcachetable.py new file mode 100644 index 0000000..7e4edfc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/createcachetable.py @@ -0,0 +1,108 @@ +from django.conf import settings +from django.core.cache import caches +from django.core.cache.backends.db import BaseDatabaseCache +from django.core.management.base import BaseCommand, CommandError +from django.db import ( + DEFAULT_DB_ALIAS, connections, models, router, transaction, +) +from django.db.utils import DatabaseError + + +class Command(BaseCommand): + help = "Creates the tables needed to use the SQL cache backend." + + requires_system_checks = False + + def add_arguments(self, parser): + parser.add_argument( + 'args', metavar='table_name', nargs='*', + help='Optional table names. Otherwise, settings.CACHES is used to find cache tables.', + ) + parser.add_argument( + '--database', + default=DEFAULT_DB_ALIAS, + help='Nominates a database onto which the cache tables will be ' + 'installed. Defaults to the "default" database.', + ) + parser.add_argument( + '--dry-run', action='store_true', + help='Does not create the table, just prints the SQL that would be run.', + ) + + def handle(self, *tablenames, **options): + db = options['database'] + self.verbosity = options['verbosity'] + dry_run = options['dry_run'] + if tablenames: + # Legacy behavior, tablename specified as argument + for tablename in tablenames: + self.create_table(db, tablename, dry_run) + else: + for cache_alias in settings.CACHES: + cache = caches[cache_alias] + if isinstance(cache, BaseDatabaseCache): + self.create_table(db, cache._table, dry_run) + + def create_table(self, database, tablename, dry_run): + cache = BaseDatabaseCache(tablename, {}) + if not router.allow_migrate_model(database, cache.cache_model_class): + return + connection = connections[database] + + if tablename in connection.introspection.table_names(): + if self.verbosity > 0: + self.stdout.write("Cache table '%s' already exists." % tablename) + return + + fields = ( + # "key" is a reserved word in MySQL, so use "cache_key" instead. + models.CharField(name='cache_key', max_length=255, unique=True, primary_key=True), + models.TextField(name='value'), + models.DateTimeField(name='expires', db_index=True), + ) + table_output = [] + index_output = [] + qn = connection.ops.quote_name + for f in fields: + field_output = [ + qn(f.name), + f.db_type(connection=connection), + '%sNULL' % ('NOT ' if not f.null else ''), + ] + if f.primary_key: + field_output.append("PRIMARY KEY") + elif f.unique: + field_output.append("UNIQUE") + if f.db_index: + unique = "UNIQUE " if f.unique else "" + index_output.append( + "CREATE %sINDEX %s ON %s (%s);" % + (unique, qn('%s_%s' % (tablename, f.name)), qn(tablename), qn(f.name)) + ) + table_output.append(" ".join(field_output)) + full_statement = ["CREATE TABLE %s (" % qn(tablename)] + for i, line in enumerate(table_output): + full_statement.append(' %s%s' % (line, ',' if i < len(table_output) - 1 else '')) + full_statement.append(');') + + full_statement = "\n".join(full_statement) + + if dry_run: + self.stdout.write(full_statement) + for statement in index_output: + self.stdout.write(statement) + return + + with transaction.atomic(using=database, savepoint=connection.features.can_rollback_ddl): + with connection.cursor() as curs: + try: + curs.execute(full_statement) + except DatabaseError as e: + raise CommandError( + "Cache table '%s' could not be created.\nThe error was: %s." % + (tablename, e)) + for statement in index_output: + curs.execute(statement) + + if self.verbosity > 1: + self.stdout.write("Cache table '%s' created." % tablename) diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/diffsettings.py b/venv/lib/python3.7/site-packages/django/core/management/commands/diffsettings.py new file mode 100644 index 0000000..54ec93c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/diffsettings.py @@ -0,0 +1,79 @@ +from django.core.management.base import BaseCommand + + +def module_to_dict(module, omittable=lambda k: k.startswith('_') or not k.isupper()): + """Convert a module namespace to a Python dictionary.""" + return {k: repr(getattr(module, k)) for k in dir(module) if not omittable(k)} + + +class Command(BaseCommand): + help = """Displays differences between the current settings.py and Django's + default settings.""" + + requires_system_checks = False + + def add_arguments(self, parser): + parser.add_argument( + '--all', action='store_true', + help=( + 'Display all settings, regardless of their value. In "hash" ' + 'mode, default values are prefixed by "###".' + ), + ) + parser.add_argument( + '--default', metavar='MODULE', + help=( + "The settings module to compare the current settings against. Leave empty to " + "compare against Django's default settings." + ), + ) + parser.add_argument( + '--output', default='hash', choices=('hash', 'unified'), + help=( + "Selects the output format. 'hash' mode displays each changed " + "setting, with the settings that don't appear in the defaults " + "followed by ###. 'unified' mode prefixes the default setting " + "with a minus sign, followed by the changed setting prefixed " + "with a plus sign." + ), + ) + + def handle(self, **options): + from django.conf import settings, Settings, global_settings + + # Because settings are imported lazily, we need to explicitly load them. + if not settings.configured: + settings._setup() + + user_settings = module_to_dict(settings._wrapped) + default = options['default'] + default_settings = module_to_dict(Settings(default) if default else global_settings) + output_func = { + 'hash': self.output_hash, + 'unified': self.output_unified, + }[options['output']] + return '\n'.join(output_func(user_settings, default_settings, **options)) + + def output_hash(self, user_settings, default_settings, **options): + # Inspired by Postfix's "postconf -n". + output = [] + for key in sorted(user_settings): + if key not in default_settings: + output.append("%s = %s ###" % (key, user_settings[key])) + elif user_settings[key] != default_settings[key]: + output.append("%s = %s" % (key, user_settings[key])) + elif options['all']: + output.append("### %s = %s" % (key, user_settings[key])) + return output + + def output_unified(self, user_settings, default_settings, **options): + output = [] + for key in sorted(user_settings): + if key not in default_settings: + output.append(self.style.SUCCESS("+ %s = %s" % (key, user_settings[key]))) + elif user_settings[key] != default_settings[key]: + output.append(self.style.ERROR("- %s = %s" % (key, default_settings[key]))) + output.append(self.style.SUCCESS("+ %s = %s" % (key, user_settings[key]))) + elif options['all']: + output.append(" %s = %s" % (key, user_settings[key])) + return output diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/makemessages.py b/venv/lib/python3.7/site-packages/django/core/management/commands/makemessages.py new file mode 100644 index 0000000..acf8759 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/makemessages.py @@ -0,0 +1,687 @@ +import fnmatch +import glob +import os +import re +import sys +from functools import total_ordering +from itertools import dropwhile + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.files.temp import NamedTemporaryFile +from django.core.management.base import BaseCommand, CommandError +from django.core.management.utils import ( + find_command, handle_extensions, popen_wrapper, +) +from django.utils.encoding import DEFAULT_LOCALE_ENCODING +from django.utils.functional import cached_property +from django.utils.jslex import prepare_js_for_gettext +from django.utils.text import get_text_list +from django.utils.translation import templatize + +plural_forms_re = re.compile(r'^(?P"Plural-Forms.+?\\n")\s*$', re.MULTILINE | re.DOTALL) +STATUS_OK = 0 +NO_LOCALE_DIR = object() + + +def check_programs(*programs): + for program in programs: + if find_command(program) is None: + raise CommandError( + "Can't find %s. Make sure you have GNU gettext tools 0.15 or " + "newer installed." % program + ) + + +@total_ordering +class TranslatableFile: + def __init__(self, dirpath, file_name, locale_dir): + self.file = file_name + self.dirpath = dirpath + self.locale_dir = locale_dir + + def __repr__(self): + return "<%s: %s>" % ( + self.__class__.__name__, + os.sep.join([self.dirpath, self.file]), + ) + + def __eq__(self, other): + return self.path == other.path + + def __lt__(self, other): + return self.path < other.path + + @property + def path(self): + return os.path.join(self.dirpath, self.file) + + +class BuildFile: + """ + Represent the state of a translatable file during the build process. + """ + def __init__(self, command, domain, translatable): + self.command = command + self.domain = domain + self.translatable = translatable + + @cached_property + def is_templatized(self): + if self.domain == 'djangojs': + return self.command.gettext_version < (0, 18, 3) + elif self.domain == 'django': + file_ext = os.path.splitext(self.translatable.file)[1] + return file_ext != '.py' + return False + + @cached_property + def path(self): + return self.translatable.path + + @cached_property + def work_path(self): + """ + Path to a file which is being fed into GNU gettext pipeline. This may + be either a translatable or its preprocessed version. + """ + if not self.is_templatized: + return self.path + extension = { + 'djangojs': 'c', + 'django': 'py', + }.get(self.domain) + filename = '%s.%s' % (self.translatable.file, extension) + return os.path.join(self.translatable.dirpath, filename) + + def preprocess(self): + """ + Preprocess (if necessary) a translatable file before passing it to + xgettext GNU gettext utility. + """ + if not self.is_templatized: + return + + encoding = settings.FILE_CHARSET if self.command.settings_available else 'utf-8' + with open(self.path, 'r', encoding=encoding) as fp: + src_data = fp.read() + + if self.domain == 'djangojs': + content = prepare_js_for_gettext(src_data) + elif self.domain == 'django': + content = templatize(src_data, origin=self.path[2:]) + + with open(self.work_path, 'w', encoding='utf-8') as fp: + fp.write(content) + + def postprocess_messages(self, msgs): + """ + Postprocess messages generated by xgettext GNU gettext utility. + + Transform paths as if these messages were generated from original + translatable files rather than from preprocessed versions. + """ + if not self.is_templatized: + return msgs + + # Remove '.py' suffix + if os.name == 'nt': + # Preserve '.\' prefix on Windows to respect gettext behavior + old_path = self.work_path + new_path = self.path + else: + old_path = self.work_path[2:] + new_path = self.path[2:] + + return re.sub( + r'^(#: .*)(' + re.escape(old_path) + r')', + lambda match: match.group().replace(old_path, new_path), + msgs, + flags=re.MULTILINE + ) + + def cleanup(self): + """ + Remove a preprocessed copy of a translatable file (if any). + """ + if self.is_templatized: + # This check is needed for the case of a symlinked file and its + # source being processed inside a single group (locale dir); + # removing either of those two removes both. + if os.path.exists(self.work_path): + os.unlink(self.work_path) + + +def normalize_eols(raw_contents): + """ + Take a block of raw text that will be passed through str.splitlines() to + get universal newlines treatment. + + Return the resulting block of text with normalized `\n` EOL sequences ready + to be written to disk using current platform's native EOLs. + """ + lines_list = raw_contents.splitlines() + # Ensure last line has its EOL + if lines_list and lines_list[-1]: + lines_list.append('') + return '\n'.join(lines_list) + + +def write_pot_file(potfile, msgs): + """ + Write the `potfile` with the `msgs` contents, making sure its format is + valid. + """ + pot_lines = msgs.splitlines() + if os.path.exists(potfile): + # Strip the header + lines = dropwhile(len, pot_lines) + else: + lines = [] + found, header_read = False, False + for line in pot_lines: + if not found and not header_read: + if 'charset=CHARSET' in line: + found = True + line = line.replace('charset=CHARSET', 'charset=UTF-8') + if not line and not found: + header_read = True + lines.append(line) + msgs = '\n'.join(lines) + # Force newlines of POT files to '\n' to work around + # https://savannah.gnu.org/bugs/index.php?52395 + with open(potfile, 'a', encoding='utf-8', newline='\n') as fp: + fp.write(msgs) + + +class Command(BaseCommand): + help = ( + "Runs over the entire source tree of the current directory and " + "pulls out all strings marked for translation. It creates (or updates) a message " + "file in the conf/locale (in the django tree) or locale (for projects and " + "applications) directory.\n\nYou must run this command with one of either the " + "--locale, --exclude, or --all options." + ) + + translatable_file_class = TranslatableFile + build_file_class = BuildFile + + requires_system_checks = False + + msgmerge_options = ['-q', '--previous'] + msguniq_options = ['--to-code=utf-8'] + msgattrib_options = ['--no-obsolete'] + xgettext_options = ['--from-code=UTF-8', '--add-comments=Translators'] + + def add_arguments(self, parser): + parser.add_argument( + '--locale', '-l', default=[], action='append', + help='Creates or updates the message files for the given locale(s) (e.g. pt_BR). ' + 'Can be used multiple times.', + ) + parser.add_argument( + '--exclude', '-x', default=[], action='append', + help='Locales to exclude. Default is none. Can be used multiple times.', + ) + parser.add_argument( + '--domain', '-d', default='django', + help='The domain of the message files (default: "django").', + ) + parser.add_argument( + '--all', '-a', action='store_true', + help='Updates the message files for all existing locales.', + ) + parser.add_argument( + '--extension', '-e', dest='extensions', action='append', + help='The file extension(s) to examine (default: "html,txt,py", or "js" ' + 'if the domain is "djangojs"). Separate multiple extensions with ' + 'commas, or use -e multiple times.', + ) + parser.add_argument( + '--symlinks', '-s', action='store_true', + help='Follows symlinks to directories when examining source code ' + 'and templates for translation strings.', + ) + parser.add_argument( + '--ignore', '-i', action='append', dest='ignore_patterns', + default=[], metavar='PATTERN', + help='Ignore files or directories matching this glob-style pattern. ' + 'Use multiple times to ignore more.', + ) + parser.add_argument( + '--no-default-ignore', action='store_false', dest='use_default_ignore_patterns', + help="Don't ignore the common glob-style patterns 'CVS', '.*', '*~' and '*.pyc'.", + ) + parser.add_argument( + '--no-wrap', action='store_true', + help="Don't break long message lines into several lines.", + ) + parser.add_argument( + '--no-location', action='store_true', + help="Don't write '#: filename:line' lines.", + ) + parser.add_argument( + '--add-location', + choices=('full', 'file', 'never'), const='full', nargs='?', + help=( + "Controls '#: filename:line' lines. If the option is 'full' " + "(the default if not given), the lines include both file name " + "and line number. If it's 'file', the line number is omitted. If " + "it's 'never', the lines are suppressed (same as --no-location). " + "--add-location requires gettext 0.19 or newer." + ), + ) + parser.add_argument( + '--no-obsolete', action='store_true', + help="Remove obsolete message strings.", + ) + parser.add_argument( + '--keep-pot', action='store_true', + help="Keep .pot file after making messages. Useful when debugging.", + ) + + def handle(self, *args, **options): + locale = options['locale'] + exclude = options['exclude'] + self.domain = options['domain'] + self.verbosity = options['verbosity'] + process_all = options['all'] + extensions = options['extensions'] + self.symlinks = options['symlinks'] + + ignore_patterns = options['ignore_patterns'] + if options['use_default_ignore_patterns']: + ignore_patterns += ['CVS', '.*', '*~', '*.pyc'] + self.ignore_patterns = list(set(ignore_patterns)) + + # Avoid messing with mutable class variables + if options['no_wrap']: + self.msgmerge_options = self.msgmerge_options[:] + ['--no-wrap'] + self.msguniq_options = self.msguniq_options[:] + ['--no-wrap'] + self.msgattrib_options = self.msgattrib_options[:] + ['--no-wrap'] + self.xgettext_options = self.xgettext_options[:] + ['--no-wrap'] + if options['no_location']: + self.msgmerge_options = self.msgmerge_options[:] + ['--no-location'] + self.msguniq_options = self.msguniq_options[:] + ['--no-location'] + self.msgattrib_options = self.msgattrib_options[:] + ['--no-location'] + self.xgettext_options = self.xgettext_options[:] + ['--no-location'] + if options['add_location']: + if self.gettext_version < (0, 19): + raise CommandError( + "The --add-location option requires gettext 0.19 or later. " + "You have %s." % '.'.join(str(x) for x in self.gettext_version) + ) + arg_add_location = "--add-location=%s" % options['add_location'] + self.msgmerge_options = self.msgmerge_options[:] + [arg_add_location] + self.msguniq_options = self.msguniq_options[:] + [arg_add_location] + self.msgattrib_options = self.msgattrib_options[:] + [arg_add_location] + self.xgettext_options = self.xgettext_options[:] + [arg_add_location] + + self.no_obsolete = options['no_obsolete'] + self.keep_pot = options['keep_pot'] + + if self.domain not in ('django', 'djangojs'): + raise CommandError("currently makemessages only supports domains " + "'django' and 'djangojs'") + if self.domain == 'djangojs': + exts = extensions or ['js'] + else: + exts = extensions or ['html', 'txt', 'py'] + self.extensions = handle_extensions(exts) + + if (locale is None and not exclude and not process_all) or self.domain is None: + raise CommandError( + "Type '%s help %s' for usage information." + % (os.path.basename(sys.argv[0]), sys.argv[1]) + ) + + if self.verbosity > 1: + self.stdout.write( + 'examining files with the extensions: %s\n' + % get_text_list(list(self.extensions), 'and') + ) + + self.invoked_for_django = False + self.locale_paths = [] + self.default_locale_path = None + if os.path.isdir(os.path.join('conf', 'locale')): + self.locale_paths = [os.path.abspath(os.path.join('conf', 'locale'))] + self.default_locale_path = self.locale_paths[0] + self.invoked_for_django = True + else: + if self.settings_available: + self.locale_paths.extend(settings.LOCALE_PATHS) + # Allow to run makemessages inside an app dir + if os.path.isdir('locale'): + self.locale_paths.append(os.path.abspath('locale')) + if self.locale_paths: + self.default_locale_path = self.locale_paths[0] + if not os.path.exists(self.default_locale_path): + os.makedirs(self.default_locale_path) + + # Build locale list + looks_like_locale = re.compile(r'[a-z]{2}') + locale_dirs = filter(os.path.isdir, glob.glob('%s/*' % self.default_locale_path)) + all_locales = [ + lang_code for lang_code in map(os.path.basename, locale_dirs) + if looks_like_locale.match(lang_code) + ] + + # Account for excluded locales + if process_all: + locales = all_locales + else: + locales = locale or all_locales + locales = set(locales).difference(exclude) + + if locales: + check_programs('msguniq', 'msgmerge', 'msgattrib') + + check_programs('xgettext') + + try: + potfiles = self.build_potfiles() + + # Build po files for each selected locale + for locale in locales: + if self.verbosity > 0: + self.stdout.write("processing locale %s\n" % locale) + for potfile in potfiles: + self.write_po_file(potfile, locale) + finally: + if not self.keep_pot: + self.remove_potfiles() + + @cached_property + def gettext_version(self): + # Gettext tools will output system-encoded bytestrings instead of UTF-8, + # when looking up the version. It's especially a problem on Windows. + out, err, status = popen_wrapper( + ['xgettext', '--version'], + stdout_encoding=DEFAULT_LOCALE_ENCODING, + ) + m = re.search(r'(\d+)\.(\d+)\.?(\d+)?', out) + if m: + return tuple(int(d) for d in m.groups() if d is not None) + else: + raise CommandError("Unable to get gettext version. Is it installed?") + + @cached_property + def settings_available(self): + try: + settings.LOCALE_PATHS + except ImproperlyConfigured: + if self.verbosity > 1: + self.stderr.write("Running without configured settings.") + return False + return True + + def build_potfiles(self): + """ + Build pot files and apply msguniq to them. + """ + file_list = self.find_files(".") + self.remove_potfiles() + self.process_files(file_list) + potfiles = [] + for path in self.locale_paths: + potfile = os.path.join(path, '%s.pot' % self.domain) + if not os.path.exists(potfile): + continue + args = ['msguniq'] + self.msguniq_options + [potfile] + msgs, errors, status = popen_wrapper(args) + if errors: + if status != STATUS_OK: + raise CommandError( + "errors happened while running msguniq\n%s" % errors) + elif self.verbosity > 0: + self.stdout.write(errors) + msgs = normalize_eols(msgs) + with open(potfile, 'w', encoding='utf-8') as fp: + fp.write(msgs) + potfiles.append(potfile) + return potfiles + + def remove_potfiles(self): + for path in self.locale_paths: + pot_path = os.path.join(path, '%s.pot' % self.domain) + if os.path.exists(pot_path): + os.unlink(pot_path) + + def find_files(self, root): + """ + Get all files in the given root. Also check that there is a matching + locale dir for each file. + """ + def is_ignored(path, ignore_patterns): + """ + Check if the given path should be ignored or not. + """ + filename = os.path.basename(path) + + def ignore(pattern): + return fnmatch.fnmatchcase(filename, pattern) or fnmatch.fnmatchcase(path, pattern) + + return any(ignore(pattern) for pattern in ignore_patterns) + + ignore_patterns = [os.path.normcase(p) for p in self.ignore_patterns] + dir_suffixes = {'%s*' % path_sep for path_sep in {'/', os.sep}} + norm_patterns = [] + for p in ignore_patterns: + for dir_suffix in dir_suffixes: + if p.endswith(dir_suffix): + norm_patterns.append(p[:-len(dir_suffix)]) + break + else: + norm_patterns.append(p) + + all_files = [] + ignored_roots = [] + if self.settings_available: + ignored_roots = [os.path.normpath(p) for p in (settings.MEDIA_ROOT, settings.STATIC_ROOT) if p] + for dirpath, dirnames, filenames in os.walk(root, topdown=True, followlinks=self.symlinks): + for dirname in dirnames[:]: + if (is_ignored(os.path.normpath(os.path.join(dirpath, dirname)), norm_patterns) or + os.path.join(os.path.abspath(dirpath), dirname) in ignored_roots): + dirnames.remove(dirname) + if self.verbosity > 1: + self.stdout.write('ignoring directory %s\n' % dirname) + elif dirname == 'locale': + dirnames.remove(dirname) + self.locale_paths.insert(0, os.path.join(os.path.abspath(dirpath), dirname)) + for filename in filenames: + file_path = os.path.normpath(os.path.join(dirpath, filename)) + file_ext = os.path.splitext(filename)[1] + if file_ext not in self.extensions or is_ignored(file_path, self.ignore_patterns): + if self.verbosity > 1: + self.stdout.write('ignoring file %s in %s\n' % (filename, dirpath)) + else: + locale_dir = None + for path in self.locale_paths: + if os.path.abspath(dirpath).startswith(os.path.dirname(path)): + locale_dir = path + break + locale_dir = locale_dir or self.default_locale_path or NO_LOCALE_DIR + all_files.append(self.translatable_file_class(dirpath, filename, locale_dir)) + return sorted(all_files) + + def process_files(self, file_list): + """ + Group translatable files by locale directory and run pot file build + process for each group. + """ + file_groups = {} + for translatable in file_list: + file_group = file_groups.setdefault(translatable.locale_dir, []) + file_group.append(translatable) + for locale_dir, files in file_groups.items(): + self.process_locale_dir(locale_dir, files) + + def process_locale_dir(self, locale_dir, files): + """ + Extract translatable literals from the specified files, creating or + updating the POT file for a given locale directory. + + Use the xgettext GNU gettext utility. + """ + build_files = [] + for translatable in files: + if self.verbosity > 1: + self.stdout.write('processing file %s in %s\n' % ( + translatable.file, translatable.dirpath + )) + if self.domain not in ('djangojs', 'django'): + continue + build_file = self.build_file_class(self, self.domain, translatable) + try: + build_file.preprocess() + except UnicodeDecodeError as e: + self.stdout.write( + 'UnicodeDecodeError: skipped file %s in %s (reason: %s)' % ( + translatable.file, translatable.dirpath, e, + ) + ) + continue + build_files.append(build_file) + + if self.domain == 'djangojs': + is_templatized = build_file.is_templatized + args = [ + 'xgettext', + '-d', self.domain, + '--language=%s' % ('C' if is_templatized else 'JavaScript',), + '--keyword=gettext_noop', + '--keyword=gettext_lazy', + '--keyword=ngettext_lazy:1,2', + '--keyword=pgettext:1c,2', + '--keyword=npgettext:1c,2,3', + '--output=-', + ] + elif self.domain == 'django': + args = [ + 'xgettext', + '-d', self.domain, + '--language=Python', + '--keyword=gettext_noop', + '--keyword=gettext_lazy', + '--keyword=ngettext_lazy:1,2', + '--keyword=ugettext_noop', + '--keyword=ugettext_lazy', + '--keyword=ungettext_lazy:1,2', + '--keyword=pgettext:1c,2', + '--keyword=npgettext:1c,2,3', + '--keyword=pgettext_lazy:1c,2', + '--keyword=npgettext_lazy:1c,2,3', + '--output=-', + ] + else: + return + + input_files = [bf.work_path for bf in build_files] + with NamedTemporaryFile(mode='w+') as input_files_list: + input_files_list.write(('\n'.join(input_files))) + input_files_list.flush() + args.extend(['--files-from', input_files_list.name]) + args.extend(self.xgettext_options) + msgs, errors, status = popen_wrapper(args) + + if errors: + if status != STATUS_OK: + for build_file in build_files: + build_file.cleanup() + raise CommandError( + 'errors happened while running xgettext on %s\n%s' % + ('\n'.join(input_files), errors) + ) + elif self.verbosity > 0: + # Print warnings + self.stdout.write(errors) + + if msgs: + if locale_dir is NO_LOCALE_DIR: + file_path = os.path.normpath(build_files[0].path) + raise CommandError( + 'Unable to find a locale path to store translations for ' + 'file %s' % file_path + ) + for build_file in build_files: + msgs = build_file.postprocess_messages(msgs) + potfile = os.path.join(locale_dir, '%s.pot' % self.domain) + write_pot_file(potfile, msgs) + + for build_file in build_files: + build_file.cleanup() + + def write_po_file(self, potfile, locale): + """ + Create or update the PO file for self.domain and `locale`. + Use contents of the existing `potfile`. + + Use msgmerge and msgattrib GNU gettext utilities. + """ + basedir = os.path.join(os.path.dirname(potfile), locale, 'LC_MESSAGES') + if not os.path.isdir(basedir): + os.makedirs(basedir) + pofile = os.path.join(basedir, '%s.po' % self.domain) + + if os.path.exists(pofile): + args = ['msgmerge'] + self.msgmerge_options + [pofile, potfile] + msgs, errors, status = popen_wrapper(args) + if errors: + if status != STATUS_OK: + raise CommandError( + "errors happened while running msgmerge\n%s" % errors) + elif self.verbosity > 0: + self.stdout.write(errors) + else: + with open(potfile, 'r', encoding='utf-8') as fp: + msgs = fp.read() + if not self.invoked_for_django: + msgs = self.copy_plural_forms(msgs, locale) + msgs = normalize_eols(msgs) + msgs = msgs.replace( + "#. #-#-#-#-# %s.pot (PACKAGE VERSION) #-#-#-#-#\n" % self.domain, "") + with open(pofile, 'w', encoding='utf-8') as fp: + fp.write(msgs) + + if self.no_obsolete: + args = ['msgattrib'] + self.msgattrib_options + ['-o', pofile, pofile] + msgs, errors, status = popen_wrapper(args) + if errors: + if status != STATUS_OK: + raise CommandError( + "errors happened while running msgattrib\n%s" % errors) + elif self.verbosity > 0: + self.stdout.write(errors) + + def copy_plural_forms(self, msgs, locale): + """ + Copy plural forms header contents from a Django catalog of locale to + the msgs string, inserting it at the right place. msgs should be the + contents of a newly created .po file. + """ + django_dir = os.path.normpath(os.path.join(os.path.dirname(django.__file__))) + if self.domain == 'djangojs': + domains = ('djangojs', 'django') + else: + domains = ('django',) + for domain in domains: + django_po = os.path.join(django_dir, 'conf', 'locale', locale, 'LC_MESSAGES', '%s.po' % domain) + if os.path.exists(django_po): + with open(django_po, 'r', encoding='utf-8') as fp: + m = plural_forms_re.search(fp.read()) + if m: + plural_form_line = m.group('value') + if self.verbosity > 1: + self.stdout.write("copying plural forms: %s\n" % plural_form_line) + lines = [] + found = False + for line in msgs.splitlines(): + if not found and (not line or plural_forms_re.search(line)): + line = plural_form_line + found = True + lines.append(line) + msgs = '\n'.join(lines) + break + return msgs diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py b/venv/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py new file mode 100644 index 0000000..5782b58 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py @@ -0,0 +1,311 @@ +import os +import sys +from itertools import takewhile + +from django.apps import apps +from django.conf import settings +from django.core.management.base import ( + BaseCommand, CommandError, no_translations, +) +from django.db import DEFAULT_DB_ALIAS, connections, router +from django.db.migrations import Migration +from django.db.migrations.autodetector import MigrationAutodetector +from django.db.migrations.loader import MigrationLoader +from django.db.migrations.questioner import ( + InteractiveMigrationQuestioner, MigrationQuestioner, + NonInteractiveMigrationQuestioner, +) +from django.db.migrations.state import ProjectState +from django.db.migrations.utils import get_migration_name_timestamp +from django.db.migrations.writer import MigrationWriter + + +class Command(BaseCommand): + help = "Creates new migration(s) for apps." + + def add_arguments(self, parser): + parser.add_argument( + 'args', metavar='app_label', nargs='*', + help='Specify the app label(s) to create migrations for.', + ) + parser.add_argument( + '--dry-run', action='store_true', + help="Just show what migrations would be made; don't actually write them.", + ) + parser.add_argument( + '--merge', action='store_true', + help="Enable fixing of migration conflicts.", + ) + parser.add_argument( + '--empty', action='store_true', + help="Create an empty migration.", + ) + parser.add_argument( + '--noinput', '--no-input', action='store_false', dest='interactive', + help='Tells Django to NOT prompt the user for input of any kind.', + ) + parser.add_argument( + '-n', '--name', + help="Use this name for migration file(s).", + ) + parser.add_argument( + '--no-header', action='store_false', dest='include_header', + help='Do not add header comments to new migration file(s).', + ) + parser.add_argument( + '--check', action='store_true', dest='check_changes', + help='Exit with a non-zero status if model changes are missing migrations.', + ) + + @no_translations + def handle(self, *app_labels, **options): + self.verbosity = options['verbosity'] + self.interactive = options['interactive'] + self.dry_run = options['dry_run'] + self.merge = options['merge'] + self.empty = options['empty'] + self.migration_name = options['name'] + if self.migration_name and not self.migration_name.isidentifier(): + raise CommandError('The migration name must be a valid Python identifier.') + self.include_header = options['include_header'] + check_changes = options['check_changes'] + + # Make sure the app they asked for exists + app_labels = set(app_labels) + has_bad_labels = False + for app_label in app_labels: + try: + apps.get_app_config(app_label) + except LookupError as err: + self.stderr.write(str(err)) + has_bad_labels = True + if has_bad_labels: + sys.exit(2) + + # Load the current graph state. Pass in None for the connection so + # the loader doesn't try to resolve replaced migrations from DB. + loader = MigrationLoader(None, ignore_no_migrations=True) + + # Raise an error if any migrations are applied before their dependencies. + consistency_check_labels = {config.label for config in apps.get_app_configs()} + # Non-default databases are only checked if database routers used. + aliases_to_check = connections if settings.DATABASE_ROUTERS else [DEFAULT_DB_ALIAS] + for alias in sorted(aliases_to_check): + connection = connections[alias] + if (connection.settings_dict['ENGINE'] != 'django.db.backends.dummy' and any( + # At least one model must be migrated to the database. + router.allow_migrate(connection.alias, app_label, model_name=model._meta.object_name) + for app_label in consistency_check_labels + for model in apps.get_app_config(app_label).get_models() + )): + loader.check_consistent_history(connection) + + # Before anything else, see if there's conflicting apps and drop out + # hard if there are any and they don't want to merge + conflicts = loader.detect_conflicts() + + # If app_labels is specified, filter out conflicting migrations for unspecified apps + if app_labels: + conflicts = { + app_label: conflict for app_label, conflict in conflicts.items() + if app_label in app_labels + } + + if conflicts and not self.merge: + name_str = "; ".join( + "%s in %s" % (", ".join(names), app) + for app, names in conflicts.items() + ) + raise CommandError( + "Conflicting migrations detected; multiple leaf nodes in the " + "migration graph: (%s).\nTo fix them run " + "'python manage.py makemigrations --merge'" % name_str + ) + + # If they want to merge and there's nothing to merge, then politely exit + if self.merge and not conflicts: + self.stdout.write("No conflicts detected to merge.") + return + + # If they want to merge and there is something to merge, then + # divert into the merge code + if self.merge and conflicts: + return self.handle_merge(loader, conflicts) + + if self.interactive: + questioner = InteractiveMigrationQuestioner(specified_apps=app_labels, dry_run=self.dry_run) + else: + questioner = NonInteractiveMigrationQuestioner(specified_apps=app_labels, dry_run=self.dry_run) + # Set up autodetector + autodetector = MigrationAutodetector( + loader.project_state(), + ProjectState.from_apps(apps), + questioner, + ) + + # If they want to make an empty migration, make one for each app + if self.empty: + if not app_labels: + raise CommandError("You must supply at least one app label when using --empty.") + # Make a fake changes() result we can pass to arrange_for_graph + changes = { + app: [Migration("custom", app)] + for app in app_labels + } + changes = autodetector.arrange_for_graph( + changes=changes, + graph=loader.graph, + migration_name=self.migration_name, + ) + self.write_migration_files(changes) + return + + # Detect changes + changes = autodetector.changes( + graph=loader.graph, + trim_to_apps=app_labels or None, + convert_apps=app_labels or None, + migration_name=self.migration_name, + ) + + if not changes: + # No changes? Tell them. + if self.verbosity >= 1: + if app_labels: + if len(app_labels) == 1: + self.stdout.write("No changes detected in app '%s'" % app_labels.pop()) + else: + self.stdout.write("No changes detected in apps '%s'" % ("', '".join(app_labels))) + else: + self.stdout.write("No changes detected") + else: + self.write_migration_files(changes) + if check_changes: + sys.exit(1) + + def write_migration_files(self, changes): + """ + Take a changes dict and write them out as migration files. + """ + directory_created = {} + for app_label, app_migrations in changes.items(): + if self.verbosity >= 1: + self.stdout.write(self.style.MIGRATE_HEADING("Migrations for '%s':" % app_label) + "\n") + for migration in app_migrations: + # Describe the migration + writer = MigrationWriter(migration, self.include_header) + if self.verbosity >= 1: + # Display a relative path if it's below the current working + # directory, or an absolute path otherwise. + try: + migration_string = os.path.relpath(writer.path) + except ValueError: + migration_string = writer.path + if migration_string.startswith('..'): + migration_string = writer.path + self.stdout.write(" %s\n" % (self.style.MIGRATE_LABEL(migration_string),)) + for operation in migration.operations: + self.stdout.write(" - %s\n" % operation.describe()) + if not self.dry_run: + # Write the migrations file to the disk. + migrations_directory = os.path.dirname(writer.path) + if not directory_created.get(app_label): + if not os.path.isdir(migrations_directory): + os.mkdir(migrations_directory) + init_path = os.path.join(migrations_directory, "__init__.py") + if not os.path.isfile(init_path): + open(init_path, "w").close() + # We just do this once per app + directory_created[app_label] = True + migration_string = writer.as_string() + with open(writer.path, "w", encoding='utf-8') as fh: + fh.write(migration_string) + elif self.verbosity == 3: + # Alternatively, makemigrations --dry-run --verbosity 3 + # will output the migrations to stdout rather than saving + # the file to the disk. + self.stdout.write(self.style.MIGRATE_HEADING( + "Full migrations file '%s':" % writer.filename) + "\n" + ) + self.stdout.write("%s\n" % writer.as_string()) + + def handle_merge(self, loader, conflicts): + """ + Handles merging together conflicted migrations interactively, + if it's safe; otherwise, advises on how to fix it. + """ + if self.interactive: + questioner = InteractiveMigrationQuestioner() + else: + questioner = MigrationQuestioner(defaults={'ask_merge': True}) + + for app_label, migration_names in conflicts.items(): + # Grab out the migrations in question, and work out their + # common ancestor. + merge_migrations = [] + for migration_name in migration_names: + migration = loader.get_migration(app_label, migration_name) + migration.ancestry = [ + mig for mig in loader.graph.forwards_plan((app_label, migration_name)) + if mig[0] == migration.app_label + ] + merge_migrations.append(migration) + + def all_items_equal(seq): + return all(item == seq[0] for item in seq[1:]) + + merge_migrations_generations = zip(*(m.ancestry for m in merge_migrations)) + common_ancestor_count = sum(1 for common_ancestor_generation + in takewhile(all_items_equal, merge_migrations_generations)) + if not common_ancestor_count: + raise ValueError("Could not find common ancestor of %s" % migration_names) + # Now work out the operations along each divergent branch + for migration in merge_migrations: + migration.branch = migration.ancestry[common_ancestor_count:] + migrations_ops = (loader.get_migration(node_app, node_name).operations + for node_app, node_name in migration.branch) + migration.merged_operations = sum(migrations_ops, []) + # In future, this could use some of the Optimizer code + # (can_optimize_through) to automatically see if they're + # mergeable. For now, we always just prompt the user. + if self.verbosity > 0: + self.stdout.write(self.style.MIGRATE_HEADING("Merging %s" % app_label)) + for migration in merge_migrations: + self.stdout.write(self.style.MIGRATE_LABEL(" Branch %s" % migration.name)) + for operation in migration.merged_operations: + self.stdout.write(" - %s\n" % operation.describe()) + if questioner.ask_merge(app_label): + # If they still want to merge it, then write out an empty + # file depending on the migrations needing merging. + numbers = [ + MigrationAutodetector.parse_number(migration.name) + for migration in merge_migrations + ] + try: + biggest_number = max(x for x in numbers if x is not None) + except ValueError: + biggest_number = 1 + subclass = type("Migration", (Migration,), { + "dependencies": [(app_label, migration.name) for migration in merge_migrations], + }) + migration_name = "%04i_%s" % ( + biggest_number + 1, + self.migration_name or ("merge_%s" % get_migration_name_timestamp()) + ) + new_migration = subclass(migration_name, app_label) + writer = MigrationWriter(new_migration, self.include_header) + + if not self.dry_run: + # Write the merge migrations file to the disk + with open(writer.path, "w", encoding='utf-8') as fh: + fh.write(writer.as_string()) + if self.verbosity > 0: + self.stdout.write("\nCreated new merge migration %s" % writer.path) + elif self.verbosity == 3: + # Alternatively, makemigrations --merge --dry-run --verbosity 3 + # will output the merge migrations to stdout rather than saving + # the file to the disk. + self.stdout.write(self.style.MIGRATE_HEADING( + "Full merge migrations file '%s':" % writer.filename) + "\n" + ) + self.stdout.write("%s\n" % writer.as_string()) diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py b/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py new file mode 100644 index 0000000..90c8f91 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py @@ -0,0 +1,161 @@ +import errno +import os +import re +import socket +import sys +from datetime import datetime + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError +from django.core.servers.basehttp import ( + WSGIServer, get_internal_wsgi_application, run, +) +from django.utils import autoreload + +naiveip_re = re.compile(r"""^(?: +(?P + (?P\d{1,3}(?:\.\d{1,3}){3}) | # IPv4 address + (?P\[[a-fA-F0-9:]+\]) | # IPv6 address + (?P[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN +):)?(?P\d+)$""", re.X) + + +class Command(BaseCommand): + help = "Starts a lightweight Web server for development." + + # Validation is called explicitly each time the server is reloaded. + requires_system_checks = False + stealth_options = ('shutdown_message',) + + default_addr = '127.0.0.1' + default_addr_ipv6 = '::1' + default_port = '8000' + protocol = 'http' + server_cls = WSGIServer + + def add_arguments(self, parser): + parser.add_argument( + 'addrport', nargs='?', + help='Optional port number, or ipaddr:port' + ) + parser.add_argument( + '--ipv6', '-6', action='store_true', dest='use_ipv6', + help='Tells Django to use an IPv6 address.', + ) + parser.add_argument( + '--nothreading', action='store_false', dest='use_threading', + help='Tells Django to NOT use threading.', + ) + parser.add_argument( + '--noreload', action='store_false', dest='use_reloader', + help='Tells Django to NOT use the auto-reloader.', + ) + + def execute(self, *args, **options): + if options['no_color']: + # We rely on the environment because it's currently the only + # way to reach WSGIRequestHandler. This seems an acceptable + # compromise considering `runserver` runs indefinitely. + os.environ["DJANGO_COLORS"] = "nocolor" + super().execute(*args, **options) + + def get_handler(self, *args, **options): + """Return the default WSGI handler for the runner.""" + return get_internal_wsgi_application() + + def handle(self, *args, **options): + if not settings.DEBUG and not settings.ALLOWED_HOSTS: + raise CommandError('You must set settings.ALLOWED_HOSTS if DEBUG is False.') + + self.use_ipv6 = options['use_ipv6'] + if self.use_ipv6 and not socket.has_ipv6: + raise CommandError('Your Python does not support IPv6.') + self._raw_ipv6 = False + if not options['addrport']: + self.addr = '' + self.port = self.default_port + else: + m = re.match(naiveip_re, options['addrport']) + if m is None: + raise CommandError('"%s" is not a valid port number ' + 'or address:port pair.' % options['addrport']) + self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups() + if not self.port.isdigit(): + raise CommandError("%r is not a valid port number." % self.port) + if self.addr: + if _ipv6: + self.addr = self.addr[1:-1] + self.use_ipv6 = True + self._raw_ipv6 = True + elif self.use_ipv6 and not _fqdn: + raise CommandError('"%s" is not a valid IPv6 address.' % self.addr) + if not self.addr: + self.addr = self.default_addr_ipv6 if self.use_ipv6 else self.default_addr + self._raw_ipv6 = self.use_ipv6 + self.run(**options) + + def run(self, **options): + """Run the server, using the autoreloader if needed.""" + use_reloader = options['use_reloader'] + + if use_reloader: + autoreload.run_with_reloader(self.inner_run, **options) + else: + self.inner_run(None, **options) + + def inner_run(self, *args, **options): + # If an exception was silenced in ManagementUtility.execute in order + # to be raised in the child process, raise it now. + autoreload.raise_last_exception() + + threading = options['use_threading'] + # 'shutdown_message' is a stealth option. + shutdown_message = options.get('shutdown_message', '') + quit_command = 'CTRL-BREAK' if sys.platform == 'win32' else 'CONTROL-C' + + self.stdout.write("Performing system checks...\n\n") + self.check(display_num_errors=True) + # Need to check migrations here, so can't use the + # requires_migrations_check attribute. + self.check_migrations() + now = datetime.now().strftime('%B %d, %Y - %X') + self.stdout.write(now) + self.stdout.write(( + "Django version %(version)s, using settings %(settings)r\n" + "Starting development server at %(protocol)s://%(addr)s:%(port)s/\n" + "Quit the server with %(quit_command)s.\n" + ) % { + "version": self.get_version(), + "settings": settings.SETTINGS_MODULE, + "protocol": self.protocol, + "addr": '[%s]' % self.addr if self._raw_ipv6 else self.addr, + "port": self.port, + "quit_command": quit_command, + }) + + try: + handler = self.get_handler(*args, **options) + run(self.addr, int(self.port), handler, + ipv6=self.use_ipv6, threading=threading, server_cls=self.server_cls) + except socket.error as e: + # Use helpful error messages instead of ugly tracebacks. + ERRORS = { + errno.EACCES: "You don't have permission to access that port.", + errno.EADDRINUSE: "That port is already in use.", + errno.EADDRNOTAVAIL: "That IP address can't be assigned to.", + } + try: + error_text = ERRORS[e.errno] + except KeyError: + error_text = e + self.stderr.write("Error: %s" % error_text) + # Need to use an OS exit because sys.exit doesn't work in a thread + os._exit(1) + except KeyboardInterrupt: + if shutdown_message: + self.stdout.write(shutdown_message) + sys.exit(0) + + +# Kept for backward compatibility +BaseRunserverCommand = Command diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/sendtestemail.py b/venv/lib/python3.7/site-packages/django/core/management/commands/sendtestemail.py new file mode 100644 index 0000000..9ed1e96 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/sendtestemail.py @@ -0,0 +1,40 @@ +import socket + +from django.core.mail import mail_admins, mail_managers, send_mail +from django.core.management.base import BaseCommand +from django.utils import timezone + + +class Command(BaseCommand): + help = "Sends a test email to the email addresses specified as arguments." + missing_args_message = "You must specify some email recipients, or pass the --managers or --admin options." + + def add_arguments(self, parser): + parser.add_argument( + 'email', nargs='*', + help='One or more email addresses to send a test email to.', + ) + parser.add_argument( + '--managers', action='store_true', + help='Send a test email to the addresses specified in settings.MANAGERS.', + ) + parser.add_argument( + '--admins', action='store_true', + help='Send a test email to the addresses specified in settings.ADMINS.', + ) + + def handle(self, *args, **kwargs): + subject = 'Test email from %s on %s' % (socket.gethostname(), timezone.now()) + + send_mail( + subject=subject, + message="If you\'re reading this, it was successful.", + from_email=None, + recipient_list=kwargs['email'], + ) + + if kwargs['managers']: + mail_managers(subject, "This email was sent to the site managers.") + + if kwargs['admins']: + mail_admins(subject, "This email was sent to the site admins.") diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/sqlmigrate.py b/venv/lib/python3.7/site-packages/django/core/management/commands/sqlmigrate.py new file mode 100644 index 0000000..f0b6632 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/sqlmigrate.py @@ -0,0 +1,65 @@ +from django.apps import apps +from django.core.management.base import BaseCommand, CommandError +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.migrations.executor import MigrationExecutor +from django.db.migrations.loader import AmbiguityError + + +class Command(BaseCommand): + help = "Prints the SQL statements for the named migration." + + output_transaction = True + + def add_arguments(self, parser): + parser.add_argument('app_label', help='App label of the application containing the migration.') + parser.add_argument('migration_name', help='Migration name to print the SQL for.') + parser.add_argument( + '--database', default=DEFAULT_DB_ALIAS, + help='Nominates a database to create SQL for. Defaults to the "default" database.', + ) + parser.add_argument( + '--backwards', action='store_true', + help='Creates SQL to unapply the migration, rather than to apply it', + ) + + def execute(self, *args, **options): + # sqlmigrate doesn't support coloring its output but we need to force + # no_color=True so that the BEGIN/COMMIT statements added by + # output_transaction don't get colored either. + options['no_color'] = True + return super().execute(*args, **options) + + def handle(self, *args, **options): + # Get the database we're operating from + connection = connections[options['database']] + + # Load up an executor to get all the migration data + executor = MigrationExecutor(connection) + + # Resolve command-line arguments into a migration + app_label, migration_name = options['app_label'], options['migration_name'] + # Validate app_label + try: + apps.get_app_config(app_label) + except LookupError as err: + raise CommandError(str(err)) + if app_label not in executor.loader.migrated_apps: + raise CommandError("App '%s' does not have migrations" % app_label) + try: + migration = executor.loader.get_migration_by_prefix(app_label, migration_name) + except AmbiguityError: + raise CommandError("More than one migration matches '%s' in app '%s'. Please be more specific." % ( + migration_name, app_label)) + except KeyError: + raise CommandError("Cannot find a migration matching '%s' from app '%s'. Is it in INSTALLED_APPS?" % ( + migration_name, app_label)) + targets = [(app_label, migration.name)] + + # Show begin/end around output only for atomic migrations + self.output_transaction = migration.atomic + + # Make a plan that represents just the requested migrations and show SQL + # for it + plan = [(executor.loader.graph.nodes[targets[0]], options['backwards'])] + sql_statements = executor.collect_sql(plan) + return '\n'.join(sql_statements) diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/sqlsequencereset.py b/venv/lib/python3.7/site-packages/django/core/management/commands/sqlsequencereset.py new file mode 100644 index 0000000..d23f89c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/sqlsequencereset.py @@ -0,0 +1,23 @@ +from django.core.management.base import AppCommand +from django.db import DEFAULT_DB_ALIAS, connections + + +class Command(AppCommand): + help = 'Prints the SQL statements for resetting sequences for the given app name(s).' + + output_transaction = True + + def add_arguments(self, parser): + super().add_arguments(parser) + parser.add_argument( + '--database', default=DEFAULT_DB_ALIAS, + help='Nominates a database to print the SQL for. Defaults to the "default" database.', + ) + + def handle_app_config(self, app_config, **options): + if app_config.models_module is None: + return + connection = connections[options['database']] + models = app_config.get_models(include_auto_created=True) + statements = connection.ops.sequence_reset_sql(self.style, models) + return '\n'.join(statements) diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/startproject.py b/venv/lib/python3.7/site-packages/django/core/management/commands/startproject.py new file mode 100644 index 0000000..7e09a25 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/startproject.py @@ -0,0 +1,20 @@ +from django.core.management.templates import TemplateCommand + +from ..utils import get_random_secret_key + + +class Command(TemplateCommand): + help = ( + "Creates a Django project directory structure for the given project " + "name in the current directory or optionally in the given directory." + ) + missing_args_message = "You must provide a project name." + + def handle(self, **options): + project_name = options.pop('name') + target = options.pop('directory') + + # Create a random SECRET_KEY to put it in the main settings. + options['secret_key'] = get_random_secret_key() + + super().handle('project', project_name, target, **options) diff --git a/venv/lib/python3.7/site-packages/django/core/management/commands/test.py b/venv/lib/python3.7/site-packages/django/core/management/commands/test.py new file mode 100644 index 0000000..3da2f93 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/commands/test.py @@ -0,0 +1,56 @@ +import sys + +from django.conf import settings +from django.core.management.base import BaseCommand +from django.core.management.utils import get_command_line_option +from django.test.utils import get_runner + + +class Command(BaseCommand): + help = 'Discover and run tests in the specified modules or the current directory.' + + # DiscoverRunner runs the checks after databases are set up. + requires_system_checks = False + test_runner = None + + def run_from_argv(self, argv): + """ + Pre-parse the command line to extract the value of the --testrunner + option. This allows a test runner to define additional command line + arguments. + """ + self.test_runner = get_command_line_option(argv, '--testrunner') + super().run_from_argv(argv) + + def add_arguments(self, parser): + parser.add_argument( + 'args', metavar='test_label', nargs='*', + help='Module paths to test; can be modulename, modulename.TestCase or modulename.TestCase.test_method' + ) + parser.add_argument( + '--noinput', '--no-input', action='store_false', dest='interactive', + help='Tells Django to NOT prompt the user for input of any kind.', + ) + parser.add_argument( + '--failfast', action='store_true', + help='Tells Django to stop running the test suite after first failed test.', + ) + parser.add_argument( + '--testrunner', + help='Tells Django to use specified test runner class instead of ' + 'the one specified by the TEST_RUNNER setting.', + ) + + test_runner_class = get_runner(settings, self.test_runner) + + if hasattr(test_runner_class, 'add_arguments'): + test_runner_class.add_arguments(parser) + + def handle(self, *test_labels, **options): + TestRunner = get_runner(settings, options['testrunner']) + + test_runner = TestRunner(**options) + failures = test_runner.run_tests(test_labels) + + if failures: + sys.exit(1) diff --git a/venv/lib/python3.7/site-packages/django/core/management/sql.py b/venv/lib/python3.7/site-packages/django/core/management/sql.py new file mode 100644 index 0000000..44b57b3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/management/sql.py @@ -0,0 +1,52 @@ +from django.apps import apps +from django.db import models + + +def sql_flush(style, connection, only_django=False, reset_sequences=True, allow_cascade=False): + """ + Return a list of the SQL statements used to flush the database. + + If only_django is True, only include the table names that have associated + Django models and are in INSTALLED_APPS . + """ + if only_django: + tables = connection.introspection.django_table_names(only_existing=True, include_views=False) + else: + tables = connection.introspection.table_names(include_views=False) + seqs = connection.introspection.sequence_list() if reset_sequences else () + statements = connection.ops.sql_flush(style, tables, seqs, allow_cascade) + return statements + + +def emit_pre_migrate_signal(verbosity, interactive, db, **kwargs): + # Emit the pre_migrate signal for every application. + for app_config in apps.get_app_configs(): + if app_config.models_module is None: + continue + if verbosity >= 2: + print("Running pre-migrate handlers for application %s" % app_config.label) + models.signals.pre_migrate.send( + sender=app_config, + app_config=app_config, + verbosity=verbosity, + interactive=interactive, + using=db, + **kwargs + ) + + +def emit_post_migrate_signal(verbosity, interactive, db, **kwargs): + # Emit the post_migrate signal for every application. + for app_config in apps.get_app_configs(): + if app_config.models_module is None: + continue + if verbosity >= 2: + print("Running post-migrate handlers for application %s" % app_config.label) + models.signals.post_migrate.send( + sender=app_config, + app_config=app_config, + verbosity=verbosity, + interactive=interactive, + using=db, + **kwargs + ) diff --git a/venv/lib/python3.7/site-packages/django/core/serializers/python.py b/venv/lib/python3.7/site-packages/django/core/serializers/python.py new file mode 100644 index 0000000..08739c9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/serializers/python.py @@ -0,0 +1,156 @@ +""" +A Python "serializer". Doesn't do much serializing per se -- just converts to +and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for +other serializers. +""" +from collections import OrderedDict + +from django.apps import apps +from django.core.serializers import base +from django.db import DEFAULT_DB_ALIAS, models +from django.utils.encoding import is_protected_type + + +class Serializer(base.Serializer): + """ + Serialize a QuerySet to basic Python objects. + """ + + internal_use_only = True + + def start_serialization(self): + self._current = None + self.objects = [] + + def end_serialization(self): + pass + + def start_object(self, obj): + self._current = OrderedDict() + + def end_object(self, obj): + self.objects.append(self.get_dump_object(obj)) + self._current = None + + def get_dump_object(self, obj): + data = OrderedDict([('model', str(obj._meta))]) + if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'): + data["pk"] = self._value_from_field(obj, obj._meta.pk) + data['fields'] = self._current + return data + + def _value_from_field(self, obj, field): + value = field.value_from_object(obj) + # Protected types (i.e., primitives like None, numbers, dates, + # and Decimals) are passed through as is. All other values are + # converted to string first. + return value if is_protected_type(value) else field.value_to_string(obj) + + def handle_field(self, obj, field): + self._current[field.name] = self._value_from_field(obj, field) + + def handle_fk_field(self, obj, field): + if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'): + related = getattr(obj, field.name) + if related: + value = related.natural_key() + else: + value = None + else: + value = self._value_from_field(obj, field) + self._current[field.name] = value + + def handle_m2m_field(self, obj, field): + if field.remote_field.through._meta.auto_created: + if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'): + def m2m_value(value): + return value.natural_key() + else: + def m2m_value(value): + return self._value_from_field(value, value._meta.pk) + self._current[field.name] = [ + m2m_value(related) for related in getattr(obj, field.name).iterator() + ] + + def getvalue(self): + return self.objects + + +def Deserializer(object_list, *, using=DEFAULT_DB_ALIAS, ignorenonexistent=False, **options): + """ + Deserialize simple Python objects back into Django ORM instances. + + It's expected that you pass the Python objects themselves (instead of a + stream or a string) to the constructor + """ + handle_forward_references = options.pop('handle_forward_references', False) + field_names_cache = {} # Model: + + for d in object_list: + # Look up the model and starting build a dict of data for it. + try: + Model = _get_model(d["model"]) + except base.DeserializationError: + if ignorenonexistent: + continue + else: + raise + data = {} + if 'pk' in d: + try: + data[Model._meta.pk.attname] = Model._meta.pk.to_python(d.get('pk')) + except Exception as e: + raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), None) + m2m_data = {} + deferred_fields = {} + + if Model not in field_names_cache: + field_names_cache[Model] = {f.name for f in Model._meta.get_fields()} + field_names = field_names_cache[Model] + + # Handle each field + for (field_name, field_value) in d["fields"].items(): + + if ignorenonexistent and field_name not in field_names: + # skip fields no longer on model + continue + + field = Model._meta.get_field(field_name) + + # Handle M2M relations + if field.remote_field and isinstance(field.remote_field, models.ManyToManyRel): + try: + values = base.deserialize_m2m_values(field, field_value, using, handle_forward_references) + except base.M2MDeserializationError as e: + raise base.DeserializationError.WithData(e.original_exc, d['model'], d.get('pk'), e.pk) + if values == base.DEFER_FIELD: + deferred_fields[field] = field_value + else: + m2m_data[field.name] = values + # Handle FK fields + elif field.remote_field and isinstance(field.remote_field, models.ManyToOneRel): + try: + value = base.deserialize_fk_value(field, field_value, using, handle_forward_references) + except Exception as e: + raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), field_value) + if value == base.DEFER_FIELD: + deferred_fields[field] = field_value + else: + data[field.attname] = value + # Handle all other fields + else: + try: + data[field.name] = field.to_python(field_value) + except Exception as e: + raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), field_value) + + obj = base.build_instance(Model, data, using) + yield base.DeserializedObject(obj, m2m_data, deferred_fields) + + +def _get_model(model_identifier): + """Look up a model from an "app_label.model_name" string.""" + try: + return apps.get_model(model_identifier) + except (LookupError, TypeError): + raise base.DeserializationError("Invalid model identifier: '%s'" % model_identifier) diff --git a/venv/lib/python3.7/site-packages/django/core/serializers/pyyaml.py b/venv/lib/python3.7/site-packages/django/core/serializers/pyyaml.py new file mode 100644 index 0000000..ed3d391 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/serializers/pyyaml.py @@ -0,0 +1,77 @@ +""" +YAML serializer. + +Requires PyYaml (https://pyyaml.org/), but that's checked for in __init__. +""" + +import collections +import decimal +from io import StringIO + +import yaml + +from django.core.serializers.base import DeserializationError +from django.core.serializers.python import ( + Deserializer as PythonDeserializer, Serializer as PythonSerializer, +) +from django.db import models + +# Use the C (faster) implementation if possible +try: + from yaml import CSafeLoader as SafeLoader + from yaml import CSafeDumper as SafeDumper +except ImportError: + from yaml import SafeLoader, SafeDumper + + +class DjangoSafeDumper(SafeDumper): + def represent_decimal(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', str(data)) + + def represent_ordered_dict(self, data): + return self.represent_mapping('tag:yaml.org,2002:map', data.items()) + + +DjangoSafeDumper.add_representer(decimal.Decimal, DjangoSafeDumper.represent_decimal) +DjangoSafeDumper.add_representer(collections.OrderedDict, DjangoSafeDumper.represent_ordered_dict) + + +class Serializer(PythonSerializer): + """Convert a queryset to YAML.""" + + internal_use_only = False + + def handle_field(self, obj, field): + # A nasty special case: base YAML doesn't support serialization of time + # types (as opposed to dates or datetimes, which it does support). Since + # we want to use the "safe" serializer for better interoperability, we + # need to do something with those pesky times. Converting 'em to strings + # isn't perfect, but it's better than a "!!python/time" type which would + # halt deserialization under any other language. + if isinstance(field, models.TimeField) and getattr(obj, field.name) is not None: + self._current[field.name] = str(getattr(obj, field.name)) + else: + super().handle_field(obj, field) + + def end_serialization(self): + yaml.dump(self.objects, self.stream, Dumper=DjangoSafeDumper, **self.options) + + def getvalue(self): + # Grandparent super + return super(PythonSerializer, self).getvalue() + + +def Deserializer(stream_or_string, **options): + """Deserialize a stream or string of YAML data.""" + if isinstance(stream_or_string, bytes): + stream_or_string = stream_or_string.decode() + if isinstance(stream_or_string, str): + stream = StringIO(stream_or_string) + else: + stream = stream_or_string + try: + yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options) + except (GeneratorExit, DeserializationError): + raise + except Exception as exc: + raise DeserializationError() from exc diff --git a/venv/lib/python3.7/site-packages/django/core/serializers/xml_serializer.py b/venv/lib/python3.7/site-packages/django/core/serializers/xml_serializer.py new file mode 100644 index 0000000..1f62c8e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/serializers/xml_serializer.py @@ -0,0 +1,420 @@ +""" +XML serializer. +""" + +from xml.dom import pulldom +from xml.sax import handler +from xml.sax.expatreader import ExpatParser as _ExpatParser + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.serializers import base +from django.db import DEFAULT_DB_ALIAS, models +from django.utils.xmlutils import ( + SimplerXMLGenerator, UnserializableContentError, +) + + +class Serializer(base.Serializer): + """Serialize a QuerySet to XML.""" + + def indent(self, level): + if self.options.get('indent') is not None: + self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent') * level) + + def start_serialization(self): + """ + Start serialization -- open the XML document and the root element. + """ + self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET)) + self.xml.startDocument() + self.xml.startElement("django-objects", {"version": "1.0"}) + + def end_serialization(self): + """ + End serialization -- end the document. + """ + self.indent(0) + self.xml.endElement("django-objects") + self.xml.endDocument() + + def start_object(self, obj): + """ + Called as each object is handled. + """ + if not hasattr(obj, "_meta"): + raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj)) + + self.indent(1) + attrs = {'model': str(obj._meta)} + if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'): + obj_pk = obj.pk + if obj_pk is not None: + attrs['pk'] = str(obj_pk) + + self.xml.startElement("object", attrs) + + def end_object(self, obj): + """ + Called after handling all fields for an object. + """ + self.indent(1) + self.xml.endElement("object") + + def handle_field(self, obj, field): + """ + Handle each field on an object (except for ForeignKeys and + ManyToManyFields). + """ + self.indent(2) + self.xml.startElement('field', { + 'name': field.name, + 'type': field.get_internal_type(), + }) + + # Get a "string version" of the object's data. + if getattr(obj, field.name) is not None: + try: + self.xml.characters(field.value_to_string(obj)) + except UnserializableContentError: + raise ValueError("%s.%s (pk:%s) contains unserializable characters" % ( + obj.__class__.__name__, field.name, obj.pk)) + else: + self.xml.addQuickElement("None") + + self.xml.endElement("field") + + def handle_fk_field(self, obj, field): + """ + Handle a ForeignKey (they need to be treated slightly + differently from regular fields). + """ + self._start_relational_field(field) + related_att = getattr(obj, field.get_attname()) + if related_att is not None: + if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'): + related = getattr(obj, field.name) + # If related object has a natural key, use it + related = related.natural_key() + # Iterable natural keys are rolled out as subelements + for key_value in related: + self.xml.startElement("natural", {}) + self.xml.characters(str(key_value)) + self.xml.endElement("natural") + else: + self.xml.characters(str(related_att)) + else: + self.xml.addQuickElement("None") + self.xml.endElement("field") + + def handle_m2m_field(self, obj, field): + """ + Handle a ManyToManyField. Related objects are only serialized as + references to the object's PK (i.e. the related *data* is not dumped, + just the relation). + """ + if field.remote_field.through._meta.auto_created: + self._start_relational_field(field) + if self.use_natural_foreign_keys and hasattr(field.remote_field.model, 'natural_key'): + # If the objects in the m2m have a natural key, use it + def handle_m2m(value): + natural = value.natural_key() + # Iterable natural keys are rolled out as subelements + self.xml.startElement("object", {}) + for key_value in natural: + self.xml.startElement("natural", {}) + self.xml.characters(str(key_value)) + self.xml.endElement("natural") + self.xml.endElement("object") + else: + def handle_m2m(value): + self.xml.addQuickElement("object", attrs={ + 'pk': str(value.pk) + }) + for relobj in getattr(obj, field.name).iterator(): + handle_m2m(relobj) + + self.xml.endElement("field") + + def _start_relational_field(self, field): + """Output the element for relational fields.""" + self.indent(2) + self.xml.startElement('field', { + 'name': field.name, + 'rel': field.remote_field.__class__.__name__, + 'to': str(field.remote_field.model._meta), + }) + + +class Deserializer(base.Deserializer): + """Deserialize XML.""" + + def __init__(self, stream_or_string, *, using=DEFAULT_DB_ALIAS, ignorenonexistent=False, **options): + super().__init__(stream_or_string, **options) + self.handle_forward_references = options.pop('handle_forward_references', False) + self.event_stream = pulldom.parse(self.stream, self._make_parser()) + self.db = using + self.ignore = ignorenonexistent + + def _make_parser(self): + """Create a hardened XML parser (no custom/external entities).""" + return DefusedExpatParser() + + def __next__(self): + for event, node in self.event_stream: + if event == "START_ELEMENT" and node.nodeName == "object": + self.event_stream.expandNode(node) + return self._handle_object(node) + raise StopIteration + + def _handle_object(self, node): + """Convert an node to a DeserializedObject.""" + # Look up the model using the model loading mechanism. If this fails, + # bail. + Model = self._get_model_from_node(node, "model") + + # Start building a data dictionary from the object. + data = {} + if node.hasAttribute('pk'): + data[Model._meta.pk.attname] = Model._meta.pk.to_python( + node.getAttribute('pk')) + + # Also start building a dict of m2m data (this is saved as + # {m2m_accessor_attribute : [list_of_related_objects]}) + m2m_data = {} + deferred_fields = {} + + field_names = {f.name for f in Model._meta.get_fields()} + # Deserialize each field. + for field_node in node.getElementsByTagName("field"): + # If the field is missing the name attribute, bail (are you + # sensing a pattern here?) + field_name = field_node.getAttribute("name") + if not field_name: + raise base.DeserializationError(" node is missing the 'name' attribute") + + # Get the field from the Model. This will raise a + # FieldDoesNotExist if, well, the field doesn't exist, which will + # be propagated correctly unless ignorenonexistent=True is used. + if self.ignore and field_name not in field_names: + continue + field = Model._meta.get_field(field_name) + + # As is usually the case, relation fields get the special treatment. + if field.remote_field and isinstance(field.remote_field, models.ManyToManyRel): + value = self._handle_m2m_field_node(field_node, field) + if value == base.DEFER_FIELD: + deferred_fields[field] = [ + [ + getInnerText(nat_node).strip() + for nat_node in obj_node.getElementsByTagName('natural') + ] + for obj_node in field_node.getElementsByTagName('object') + ] + else: + m2m_data[field.name] = value + elif field.remote_field and isinstance(field.remote_field, models.ManyToOneRel): + value = self._handle_fk_field_node(field_node, field) + if value == base.DEFER_FIELD: + deferred_fields[field] = [ + getInnerText(k).strip() + for k in field_node.getElementsByTagName('natural') + ] + else: + data[field.attname] = value + else: + if field_node.getElementsByTagName('None'): + value = None + else: + value = field.to_python(getInnerText(field_node).strip()) + data[field.name] = value + + obj = base.build_instance(Model, data, self.db) + + # Return a DeserializedObject so that the m2m data has a place to live. + return base.DeserializedObject(obj, m2m_data, deferred_fields) + + def _handle_fk_field_node(self, node, field): + """ + Handle a node for a ForeignKey + """ + # Check if there is a child node named 'None', returning None if so. + if node.getElementsByTagName('None'): + return None + else: + model = field.remote_field.model + if hasattr(model._default_manager, 'get_by_natural_key'): + keys = node.getElementsByTagName('natural') + if keys: + # If there are 'natural' subelements, it must be a natural key + field_value = [getInnerText(k).strip() for k in keys] + try: + obj = model._default_manager.db_manager(self.db).get_by_natural_key(*field_value) + except ObjectDoesNotExist: + if self.handle_forward_references: + return base.DEFER_FIELD + else: + raise + obj_pk = getattr(obj, field.remote_field.field_name) + # If this is a natural foreign key to an object that + # has a FK/O2O as the foreign key, use the FK value + if field.remote_field.model._meta.pk.remote_field: + obj_pk = obj_pk.pk + else: + # Otherwise, treat like a normal PK + field_value = getInnerText(node).strip() + obj_pk = model._meta.get_field(field.remote_field.field_name).to_python(field_value) + return obj_pk + else: + field_value = getInnerText(node).strip() + return model._meta.get_field(field.remote_field.field_name).to_python(field_value) + + def _handle_m2m_field_node(self, node, field): + """ + Handle a node for a ManyToManyField. + """ + model = field.remote_field.model + default_manager = model._default_manager + if hasattr(default_manager, 'get_by_natural_key'): + def m2m_convert(n): + keys = n.getElementsByTagName('natural') + if keys: + # If there are 'natural' subelements, it must be a natural key + field_value = [getInnerText(k).strip() for k in keys] + obj_pk = default_manager.db_manager(self.db).get_by_natural_key(*field_value).pk + else: + # Otherwise, treat like a normal PK value. + obj_pk = model._meta.pk.to_python(n.getAttribute('pk')) + return obj_pk + else: + def m2m_convert(n): + return model._meta.pk.to_python(n.getAttribute('pk')) + values = [] + try: + for c in node.getElementsByTagName('object'): + values.append(m2m_convert(c)) + except Exception as e: + if isinstance(e, ObjectDoesNotExist) and self.handle_forward_references: + return base.DEFER_FIELD + else: + raise base.M2MDeserializationError(e, c) + else: + return values + + def _get_model_from_node(self, node, attr): + """ + Look up a model from a or a + node. + """ + model_identifier = node.getAttribute(attr) + if not model_identifier: + raise base.DeserializationError( + "<%s> node is missing the required '%s' attribute" + % (node.nodeName, attr)) + try: + return apps.get_model(model_identifier) + except (LookupError, TypeError): + raise base.DeserializationError( + "<%s> node has invalid model identifier: '%s'" + % (node.nodeName, model_identifier)) + + +def getInnerText(node): + """Get all the inner text of a DOM node (recursively).""" + # inspired by https://mail.python.org/pipermail/xml-sig/2005-March/011022.html + inner_text = [] + for child in node.childNodes: + if child.nodeType == child.TEXT_NODE or child.nodeType == child.CDATA_SECTION_NODE: + inner_text.append(child.data) + elif child.nodeType == child.ELEMENT_NODE: + inner_text.extend(getInnerText(child)) + else: + pass + return "".join(inner_text) + + +# Below code based on Christian Heimes' defusedxml + + +class DefusedExpatParser(_ExpatParser): + """ + An expat parser hardened against XML bomb attacks. + + Forbid DTDs, external entity references + """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.setFeature(handler.feature_external_ges, False) + self.setFeature(handler.feature_external_pes, False) + + def start_doctype_decl(self, name, sysid, pubid, has_internal_subset): + raise DTDForbidden(name, sysid, pubid) + + def entity_decl(self, name, is_parameter_entity, value, base, + sysid, pubid, notation_name): + raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) + + def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + # expat 1.2 + raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) + + def external_entity_ref_handler(self, context, base, sysid, pubid): + raise ExternalReferenceForbidden(context, base, sysid, pubid) + + def reset(self): + _ExpatParser.reset(self) + parser = self._parser + parser.StartDoctypeDeclHandler = self.start_doctype_decl + parser.EntityDeclHandler = self.entity_decl + parser.UnparsedEntityDeclHandler = self.unparsed_entity_decl + parser.ExternalEntityRefHandler = self.external_entity_ref_handler + + +class DefusedXmlException(ValueError): + """Base exception.""" + def __repr__(self): + return str(self) + + +class DTDForbidden(DefusedXmlException): + """Document type definition is forbidden.""" + def __init__(self, name, sysid, pubid): + super().__init__() + self.name = name + self.sysid = sysid + self.pubid = pubid + + def __str__(self): + tpl = "DTDForbidden(name='{}', system_id={!r}, public_id={!r})" + return tpl.format(self.name, self.sysid, self.pubid) + + +class EntitiesForbidden(DefusedXmlException): + """Entity definition is forbidden.""" + def __init__(self, name, value, base, sysid, pubid, notation_name): + super().__init__() + self.name = name + self.value = value + self.base = base + self.sysid = sysid + self.pubid = pubid + self.notation_name = notation_name + + def __str__(self): + tpl = "EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})" + return tpl.format(self.name, self.sysid, self.pubid) + + +class ExternalReferenceForbidden(DefusedXmlException): + """Resolving an external reference is forbidden.""" + def __init__(self, context, base, sysid, pubid): + super().__init__() + self.context = context + self.base = base + self.sysid = sysid + self.pubid = pubid + + def __str__(self): + tpl = "ExternalReferenceForbidden(system_id='{}', public_id={})" + return tpl.format(self.sysid, self.pubid) diff --git a/venv/lib/python3.7/site-packages/django/core/signals.py b/venv/lib/python3.7/site-packages/django/core/signals.py new file mode 100644 index 0000000..5d9618d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/signals.py @@ -0,0 +1,6 @@ +from django.dispatch import Signal + +request_started = Signal(providing_args=["environ"]) +request_finished = Signal() +got_request_exception = Signal(providing_args=["request"]) +setting_changed = Signal(providing_args=["setting", "value", "enter"]) diff --git a/venv/lib/python3.7/site-packages/django/core/signing.py b/venv/lib/python3.7/site-packages/django/core/signing.py new file mode 100644 index 0000000..1e92838 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/signing.py @@ -0,0 +1,198 @@ +""" +Functions for creating and restoring url-safe signed JSON objects. + +The format used looks like this: + +>>> signing.dumps("hello") +'ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk' + +There are two components here, separated by a ':'. The first component is a +URLsafe base64 encoded JSON of the object passed to dumps(). The second +component is a base64 encoded hmac/SHA1 hash of "$first_component:$secret" + +signing.loads(s) checks the signature and returns the deserialized object. +If the signature fails, a BadSignature exception is raised. + +>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk") +'hello' +>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk-modified") +... +BadSignature: Signature failed: ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk-modified + +You can optionally compress the JSON prior to base64 encoding it to save +space, using the compress=True argument. This checks if compression actually +helps and only applies compression if the result is a shorter string: + +>>> signing.dumps(list(range(1, 20)), compress=True) +'.eJwFwcERACAIwLCF-rCiILN47r-GyZVJsNgkxaFxoDgxcOHGxMKD_T7vhAml:1QaUaL:BA0thEZrp4FQVXIXuOvYJtLJSrQ' + +The fact that the string is compressed is signalled by the prefixed '.' at the +start of the base64 JSON. + +There are 65 url-safe characters: the 64 used by url-safe base64 and the ':'. +These functions make use of all of them. +""" + +import base64 +import datetime +import json +import re +import time +import zlib + +from django.conf import settings +from django.utils import baseconv +from django.utils.crypto import constant_time_compare, salted_hmac +from django.utils.encoding import force_bytes +from django.utils.module_loading import import_string + +_SEP_UNSAFE = re.compile(r'^[A-z0-9-_=]*$') + + +class BadSignature(Exception): + """Signature does not match.""" + pass + + +class SignatureExpired(BadSignature): + """Signature timestamp is older than required max_age.""" + pass + + +def b64_encode(s): + return base64.urlsafe_b64encode(s).strip(b'=') + + +def b64_decode(s): + pad = b'=' * (-len(s) % 4) + return base64.urlsafe_b64decode(s + pad) + + +def base64_hmac(salt, value, key): + return b64_encode(salted_hmac(salt, value, key).digest()).decode() + + +def get_cookie_signer(salt='django.core.signing.get_cookie_signer'): + Signer = import_string(settings.SIGNING_BACKEND) + key = force_bytes(settings.SECRET_KEY) # SECRET_KEY may be str or bytes. + return Signer(b'django.http.cookies' + key, salt=salt) + + +class JSONSerializer: + """ + Simple wrapper around json to be used in signing.dumps and + signing.loads. + """ + def dumps(self, obj): + return json.dumps(obj, separators=(',', ':')).encode('latin-1') + + def loads(self, data): + return json.loads(data.decode('latin-1')) + + +def dumps(obj, key=None, salt='django.core.signing', serializer=JSONSerializer, compress=False): + """ + Return URL-safe, hmac/SHA1 signed base64 compressed JSON string. If key is + None, use settings.SECRET_KEY instead. + + If compress is True (not the default), check if compressing using zlib can + save some space. Prepend a '.' to signify compression. This is included + in the signature, to protect against zip bombs. + + Salt can be used to namespace the hash, so that a signed string is + only valid for a given namespace. Leaving this at the default + value or re-using a salt value across different parts of your + application without good cause is a security risk. + + The serializer is expected to return a bytestring. + """ + data = serializer().dumps(obj) + + # Flag for if it's been compressed or not + is_compressed = False + + if compress: + # Avoid zlib dependency unless compress is being used + compressed = zlib.compress(data) + if len(compressed) < (len(data) - 1): + data = compressed + is_compressed = True + base64d = b64_encode(data).decode() + if is_compressed: + base64d = '.' + base64d + return TimestampSigner(key, salt=salt).sign(base64d) + + +def loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None): + """ + Reverse of dumps(), raise BadSignature if signature fails. + + The serializer is expected to accept a bytestring. + """ + # TimestampSigner.unsign() returns str but base64 and zlib compression + # operate on bytes. + base64d = TimestampSigner(key, salt=salt).unsign(s, max_age=max_age).encode() + decompress = base64d[:1] == b'.' + if decompress: + # It's compressed; uncompress it first + base64d = base64d[1:] + data = b64_decode(base64d) + if decompress: + data = zlib.decompress(data) + return serializer().loads(data) + + +class Signer: + + def __init__(self, key=None, sep=':', salt=None): + # Use of native strings in all versions of Python + self.key = key or settings.SECRET_KEY + self.sep = sep + if _SEP_UNSAFE.match(self.sep): + raise ValueError( + 'Unsafe Signer separator: %r (cannot be empty or consist of ' + 'only A-z0-9-_=)' % sep, + ) + self.salt = salt or '%s.%s' % (self.__class__.__module__, self.__class__.__name__) + + def signature(self, value): + return base64_hmac(self.salt + 'signer', value, self.key) + + def sign(self, value): + return '%s%s%s' % (value, self.sep, self.signature(value)) + + def unsign(self, signed_value): + if self.sep not in signed_value: + raise BadSignature('No "%s" found in value' % self.sep) + value, sig = signed_value.rsplit(self.sep, 1) + if constant_time_compare(sig, self.signature(value)): + return value + raise BadSignature('Signature "%s" does not match' % sig) + + +class TimestampSigner(Signer): + + def timestamp(self): + return baseconv.base62.encode(int(time.time())) + + def sign(self, value): + value = '%s%s%s' % (value, self.sep, self.timestamp()) + return super().sign(value) + + def unsign(self, value, max_age=None): + """ + Retrieve original value and check it wasn't signed more + than max_age seconds ago. + """ + result = super().unsign(value) + value, timestamp = result.rsplit(self.sep, 1) + timestamp = baseconv.base62.decode(timestamp) + if max_age is not None: + if isinstance(max_age, datetime.timedelta): + max_age = max_age.total_seconds() + # Check timestamp is not older than max_age + age = time.time() - timestamp + if age > max_age: + raise SignatureExpired( + 'Signature age %s > %s seconds' % (age, max_age)) + return value diff --git a/venv/lib/python3.7/site-packages/django/core/validators.py b/venv/lib/python3.7/site-packages/django/core/validators.py new file mode 100644 index 0000000..38e4b6a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/core/validators.py @@ -0,0 +1,539 @@ +import ipaddress +import re +from pathlib import Path +from urllib.parse import urlsplit, urlunsplit + +from django.core.exceptions import ValidationError +from django.utils.deconstruct import deconstructible +from django.utils.functional import SimpleLazyObject +from django.utils.ipv6 import is_valid_ipv6_address +from django.utils.translation import gettext_lazy as _, ngettext_lazy + +# These values, if given to validate(), will trigger the self.required check. +EMPTY_VALUES = (None, '', [], (), {}) + + +def _lazy_re_compile(regex, flags=0): + """Lazily compile a regex with flags.""" + def _compile(): + # Compile the regex if it was not passed pre-compiled. + if isinstance(regex, str): + return re.compile(regex, flags) + else: + assert not flags, "flags must be empty if regex is passed pre-compiled" + return regex + return SimpleLazyObject(_compile) + + +@deconstructible +class RegexValidator: + regex = '' + message = _('Enter a valid value.') + code = 'invalid' + inverse_match = False + flags = 0 + + def __init__(self, regex=None, message=None, code=None, inverse_match=None, flags=None): + if regex is not None: + self.regex = regex + if message is not None: + self.message = message + if code is not None: + self.code = code + if inverse_match is not None: + self.inverse_match = inverse_match + if flags is not None: + self.flags = flags + if self.flags and not isinstance(self.regex, str): + raise TypeError("If the flags are set, regex must be a regular expression string.") + + self.regex = _lazy_re_compile(self.regex, self.flags) + + def __call__(self, value): + """ + Validate that the input contains (or does *not* contain, if + inverse_match is True) a match for the regular expression. + """ + regex_matches = self.regex.search(str(value)) + invalid_input = regex_matches if self.inverse_match else not regex_matches + if invalid_input: + raise ValidationError(self.message, code=self.code) + + def __eq__(self, other): + return ( + isinstance(other, RegexValidator) and + self.regex.pattern == other.regex.pattern and + self.regex.flags == other.regex.flags and + (self.message == other.message) and + (self.code == other.code) and + (self.inverse_match == other.inverse_match) + ) + + +@deconstructible +class URLValidator(RegexValidator): + ul = '\u00a1-\uffff' # unicode letters range (must not be a raw string) + + # IP patterns + ipv4_re = r'(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}' + ipv6_re = r'\[[0-9a-f:\.]+\]' # (simple regex, validated later) + + # Host patterns + hostname_re = r'[a-z' + ul + r'0-9](?:[a-z' + ul + r'0-9-]{0,61}[a-z' + ul + r'0-9])?' + # Max length for domain name labels is 63 characters per RFC 1034 sec. 3.1 + domain_re = r'(?:\.(?!-)[a-z' + ul + r'0-9-]{1,63}(? ACE + except UnicodeError: # invalid domain part + raise e + url = urlunsplit((scheme, netloc, path, query, fragment)) + super().__call__(url) + else: + raise + else: + # Now verify IPv6 in the netloc part + host_match = re.search(r'^\[(.+)\](?::\d{2,5})?$', urlsplit(value).netloc) + if host_match: + potential_ip = host_match.groups()[0] + try: + validate_ipv6_address(potential_ip) + except ValidationError: + raise ValidationError(self.message, code=self.code) + + # The maximum length of a full host name is 253 characters per RFC 1034 + # section 3.1. It's defined to be 255 bytes or less, but this includes + # one byte for the length of the name and one byte for the trailing dot + # that's used to indicate absolute names in DNS. + if len(urlsplit(value).netloc) > 253: + raise ValidationError(self.message, code=self.code) + + +integer_validator = RegexValidator( + _lazy_re_compile(r'^-?\d+\Z'), + message=_('Enter a valid integer.'), + code='invalid', +) + + +def validate_integer(value): + return integer_validator(value) + + +@deconstructible +class EmailValidator: + message = _('Enter a valid email address.') + code = 'invalid' + user_regex = _lazy_re_compile( + r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z" # dot-atom + r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)', # quoted-string + re.IGNORECASE) + domain_regex = _lazy_re_compile( + # max length for domain name labels is 63 characters per RFC 1034 + r'((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+)(?:[A-Z0-9-]{2,63}(? b + + +@deconstructible +class MinValueValidator(BaseValidator): + message = _('Ensure this value is greater than or equal to %(limit_value)s.') + code = 'min_value' + + def compare(self, a, b): + return a < b + + +@deconstructible +class MinLengthValidator(BaseValidator): + message = ngettext_lazy( + 'Ensure this value has at least %(limit_value)d character (it has %(show_value)d).', + 'Ensure this value has at least %(limit_value)d characters (it has %(show_value)d).', + 'limit_value') + code = 'min_length' + + def compare(self, a, b): + return a < b + + def clean(self, x): + return len(x) + + +@deconstructible +class MaxLengthValidator(BaseValidator): + message = ngettext_lazy( + 'Ensure this value has at most %(limit_value)d character (it has %(show_value)d).', + 'Ensure this value has at most %(limit_value)d characters (it has %(show_value)d).', + 'limit_value') + code = 'max_length' + + def compare(self, a, b): + return a > b + + def clean(self, x): + return len(x) + + +@deconstructible +class DecimalValidator: + """ + Validate that the input does not exceed the maximum number of digits + expected, otherwise raise ValidationError. + """ + messages = { + 'invalid': _('Enter a number.'), + 'max_digits': ngettext_lazy( + 'Ensure that there are no more than %(max)s digit in total.', + 'Ensure that there are no more than %(max)s digits in total.', + 'max' + ), + 'max_decimal_places': ngettext_lazy( + 'Ensure that there are no more than %(max)s decimal place.', + 'Ensure that there are no more than %(max)s decimal places.', + 'max' + ), + 'max_whole_digits': ngettext_lazy( + 'Ensure that there are no more than %(max)s digit before the decimal point.', + 'Ensure that there are no more than %(max)s digits before the decimal point.', + 'max' + ), + } + + def __init__(self, max_digits, decimal_places): + self.max_digits = max_digits + self.decimal_places = decimal_places + + def __call__(self, value): + digit_tuple, exponent = value.as_tuple()[1:] + if exponent in {'F', 'n', 'N'}: + raise ValidationError(self.messages['invalid']) + if exponent >= 0: + # A positive exponent adds that many trailing zeros. + digits = len(digit_tuple) + exponent + decimals = 0 + else: + # If the absolute value of the negative exponent is larger than the + # number of digits, then it's the same as the number of digits, + # because it'll consume all of the digits in digit_tuple and then + # add abs(exponent) - len(digit_tuple) leading zeros after the + # decimal point. + if abs(exponent) > len(digit_tuple): + digits = decimals = abs(exponent) + else: + digits = len(digit_tuple) + decimals = abs(exponent) + whole_digits = digits - decimals + + if self.max_digits is not None and digits > self.max_digits: + raise ValidationError( + self.messages['max_digits'], + code='max_digits', + params={'max': self.max_digits}, + ) + if self.decimal_places is not None and decimals > self.decimal_places: + raise ValidationError( + self.messages['max_decimal_places'], + code='max_decimal_places', + params={'max': self.decimal_places}, + ) + if (self.max_digits is not None and self.decimal_places is not None and + whole_digits > (self.max_digits - self.decimal_places)): + raise ValidationError( + self.messages['max_whole_digits'], + code='max_whole_digits', + params={'max': (self.max_digits - self.decimal_places)}, + ) + + def __eq__(self, other): + return ( + isinstance(other, self.__class__) and + self.max_digits == other.max_digits and + self.decimal_places == other.decimal_places + ) + + +@deconstructible +class FileExtensionValidator: + message = _( + "File extension '%(extension)s' is not allowed. " + "Allowed extensions are: '%(allowed_extensions)s'." + ) + code = 'invalid_extension' + + def __init__(self, allowed_extensions=None, message=None, code=None): + if allowed_extensions is not None: + allowed_extensions = [allowed_extension.lower() for allowed_extension in allowed_extensions] + self.allowed_extensions = allowed_extensions + if message is not None: + self.message = message + if code is not None: + self.code = code + + def __call__(self, value): + extension = Path(value.name).suffix[1:].lower() + if self.allowed_extensions is not None and extension not in self.allowed_extensions: + raise ValidationError( + self.message, + code=self.code, + params={ + 'extension': extension, + 'allowed_extensions': ', '.join(self.allowed_extensions) + } + ) + + def __eq__(self, other): + return ( + isinstance(other, self.__class__) and + self.allowed_extensions == other.allowed_extensions and + self.message == other.message and + self.code == other.code + ) + + +def get_available_image_extensions(): + try: + from PIL import Image + except ImportError: + return [] + else: + Image.init() + return [ext.lower()[1:] for ext in Image.EXTENSION] + + +def validate_image_file_extension(value): + return FileExtensionValidator(allowed_extensions=get_available_image_extensions())(value) + + +@deconstructible +class ProhibitNullCharactersValidator: + """Validate that the string doesn't contain the null character.""" + message = _('Null characters are not allowed.') + code = 'null_characters_not_allowed' + + def __init__(self, message=None, code=None): + if message is not None: + self.message = message + if code is not None: + self.code = code + + def __call__(self, value): + if '\x00' in str(value): + raise ValidationError(self.message, code=self.code) + + def __eq__(self, other): + return ( + isinstance(other, self.__class__) and + self.message == other.message and + self.code == other.code + ) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/base/__init__.py b/venv/lib/python3.7/site-packages/django/db/backends/base/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/db/backends/base/client.py b/venv/lib/python3.7/site-packages/django/db/backends/base/client.py new file mode 100644 index 0000000..f6a0cda --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/base/client.py @@ -0,0 +1,12 @@ +class BaseDatabaseClient: + """Encapsulate backend-specific methods for opening a client shell.""" + # This should be a string representing the name of the executable + # (e.g., "psql"). Subclasses must override this. + executable_name = None + + def __init__(self, connection): + # connection is an instance of BaseDatabaseWrapper. + self.connection = connection + + def runshell(self): + raise NotImplementedError('subclasses of BaseDatabaseClient must provide a runshell() method') diff --git a/venv/lib/python3.7/site-packages/django/db/backends/base/features.py b/venv/lib/python3.7/site-packages/django/db/backends/base/features.py new file mode 100644 index 0000000..99ab45f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/base/features.py @@ -0,0 +1,308 @@ +from django.db.utils import ProgrammingError +from django.utils.functional import cached_property + + +class BaseDatabaseFeatures: + gis_enabled = False + allows_group_by_pk = False + allows_group_by_selected_pks = False + empty_fetchmany_value = [] + update_can_self_select = True + + # Does the backend distinguish between '' and None? + interprets_empty_strings_as_nulls = False + + # Does the backend allow inserting duplicate NULL rows in a nullable + # unique field? All core backends implement this correctly, but other + # databases such as SQL Server do not. + supports_nullable_unique_constraints = True + + # Does the backend allow inserting duplicate rows when a unique_together + # constraint exists and some fields are nullable but not all of them? + supports_partially_nullable_unique_constraints = True + + can_use_chunked_reads = True + can_return_id_from_insert = False + can_return_ids_from_bulk_insert = False + has_bulk_insert = True + uses_savepoints = True + can_release_savepoints = False + + # If True, don't use integer foreign keys referring to, e.g., positive + # integer primary keys. + related_fields_match_type = False + allow_sliced_subqueries_with_in = True + has_select_for_update = False + has_select_for_update_nowait = False + has_select_for_update_skip_locked = False + has_select_for_update_of = False + # Does the database's SELECT FOR UPDATE OF syntax require a column rather + # than a table? + select_for_update_of_column = False + + # Does the default test database allow multiple connections? + # Usually an indication that the test database is in-memory + test_db_allows_multiple_connections = True + + # Can an object be saved without an explicit primary key? + supports_unspecified_pk = False + + # Can a fixture contain forward references? i.e., are + # FK constraints checked at the end of transaction, or + # at the end of each save operation? + supports_forward_references = True + + # Does the backend truncate names properly when they are too long? + truncates_names = False + + # Is there a REAL datatype in addition to floats/doubles? + has_real_datatype = False + supports_subqueries_in_group_by = True + + # Is there a true datatype for uuid? + has_native_uuid_field = False + + # Is there a true datatype for timedeltas? + has_native_duration_field = False + + # Does the database driver supports same type temporal data subtraction + # by returning the type used to store duration field? + supports_temporal_subtraction = False + + # Does the __regex lookup support backreferencing and grouping? + supports_regex_backreferencing = True + + # Can date/datetime lookups be performed using a string? + supports_date_lookup_using_string = True + + # Can datetimes with timezones be used? + supports_timezones = True + + # Does the database have a copy of the zoneinfo database? + has_zoneinfo_database = True + + # When performing a GROUP BY, is an ORDER BY NULL required + # to remove any ordering? + requires_explicit_null_ordering_when_grouping = False + + # Does the backend order NULL values as largest or smallest? + nulls_order_largest = False + + # The database's limit on the number of query parameters. + max_query_params = None + + # Can an object have an autoincrement primary key of 0? MySQL says No. + allows_auto_pk_0 = True + + # Do we need to NULL a ForeignKey out, or can the constraint check be + # deferred + can_defer_constraint_checks = False + + # date_interval_sql can properly handle mixed Date/DateTime fields and timedeltas + supports_mixed_date_datetime_comparisons = True + + # Does the backend support tablespaces? Default to False because it isn't + # in the SQL standard. + supports_tablespaces = False + + # Does the backend reset sequences between tests? + supports_sequence_reset = True + + # Can the backend introspect the default value of a column? + can_introspect_default = True + + # Confirm support for introspected foreign keys + # Every database can do this reliably, except MySQL, + # which can't do it for MyISAM tables + can_introspect_foreign_keys = True + + # Can the backend introspect an AutoField, instead of an IntegerField? + can_introspect_autofield = False + + # Can the backend introspect a BigIntegerField, instead of an IntegerField? + can_introspect_big_integer_field = True + + # Can the backend introspect an BinaryField, instead of an TextField? + can_introspect_binary_field = True + + # Can the backend introspect an DecimalField, instead of an FloatField? + can_introspect_decimal_field = True + + # Can the backend introspect a DurationField, instead of a BigIntegerField? + can_introspect_duration_field = True + + # Can the backend introspect an IPAddressField, instead of an CharField? + can_introspect_ip_address_field = False + + # Can the backend introspect a PositiveIntegerField, instead of an IntegerField? + can_introspect_positive_integer_field = False + + # Can the backend introspect a SmallIntegerField, instead of an IntegerField? + can_introspect_small_integer_field = False + + # Can the backend introspect a TimeField, instead of a DateTimeField? + can_introspect_time_field = True + + # Some backends may not be able to differentiate BigAutoField from other + # fields such as AutoField. + introspected_big_auto_field_type = 'BigAutoField' + + # Some backends may not be able to differentiate BooleanField from other + # fields such as IntegerField. + introspected_boolean_field_type = 'BooleanField' + + # Can the backend introspect the column order (ASC/DESC) for indexes? + supports_index_column_ordering = True + + # Does the backend support introspection of materialized views? + can_introspect_materialized_views = False + + # Support for the DISTINCT ON clause + can_distinct_on_fields = False + + # Does the backend decide to commit before SAVEPOINT statements + # when autocommit is disabled? https://bugs.python.org/issue8145#msg109965 + autocommits_when_autocommit_is_off = False + + # Does the backend prevent running SQL queries in broken transactions? + atomic_transactions = True + + # Can we roll back DDL in a transaction? + can_rollback_ddl = False + + # Does it support operations requiring references rename in a transaction? + supports_atomic_references_rename = True + + # Can we issue more than one ALTER COLUMN clause in an ALTER TABLE? + supports_combined_alters = False + + # Does it support foreign keys? + supports_foreign_keys = True + + # Does it support CHECK constraints? + supports_column_check_constraints = True + supports_table_check_constraints = True + + # Does the backend support 'pyformat' style ("... %(name)s ...", {'name': value}) + # parameter passing? Note this can be provided by the backend even if not + # supported by the Python driver + supports_paramstyle_pyformat = True + + # Does the backend require literal defaults, rather than parameterized ones? + requires_literal_defaults = False + + # Does the backend require a connection reset after each material schema change? + connection_persists_old_columns = False + + # What kind of error does the backend throw when accessing closed cursor? + closed_cursor_error_class = ProgrammingError + + # Does 'a' LIKE 'A' match? + has_case_insensitive_like = True + + # Suffix for backends that don't support "SELECT xxx;" queries. + bare_select_suffix = '' + + # If NULL is implied on columns without needing to be explicitly specified + implied_column_null = False + + # Does the backend support "select for update" queries with limit (and offset)? + supports_select_for_update_with_limit = True + + # Does the backend ignore null expressions in GREATEST and LEAST queries unless + # every expression is null? + greatest_least_ignores_nulls = False + + # Can the backend clone databases for parallel test execution? + # Defaults to False to allow third-party backends to opt-in. + can_clone_databases = False + + # Does the backend consider table names with different casing to + # be equal? + ignores_table_name_case = False + + # Place FOR UPDATE right after FROM clause. Used on MSSQL. + for_update_after_from = False + + # Combinatorial flags + supports_select_union = True + supports_select_intersection = True + supports_select_difference = True + supports_slicing_ordering_in_compound = False + supports_parentheses_in_compound = True + + # Does the database support SQL 2003 FILTER (WHERE ...) in aggregate + # expressions? + supports_aggregate_filter_clause = False + + # Does the backend support indexing a TextField? + supports_index_on_text_field = True + + # Does the backend support window expressions (expression OVER (...))? + supports_over_clause = False + + # Does the backend support CAST with precision? + supports_cast_with_precision = True + + # How many second decimals does the database return when casting a value to + # a type with time? + time_cast_precision = 6 + + # SQL to create a procedure for use by the Django test suite. The + # functionality of the procedure isn't important. + create_test_procedure_without_params_sql = None + create_test_procedure_with_int_param_sql = None + + # Does the backend support keyword parameters for cursor.callproc()? + supports_callproc_kwargs = False + + # Convert CharField results from bytes to str in database functions. + db_functions_convert_bytes_to_str = False + + # What formats does the backend EXPLAIN syntax support? + supported_explain_formats = set() + + # Does DatabaseOperations.explain_query_prefix() raise ValueError if + # unknown kwargs are passed to QuerySet.explain()? + validates_explain_options = True + + # Does the backend support the default parameter in lead() and lag()? + supports_default_in_lead_lag = True + + # Does the backend support ignoring constraint or uniqueness errors during + # INSERT? + supports_ignore_conflicts = True + + # Does this backend require casting the results of CASE expressions used + # in UPDATE statements to ensure the expression has the correct type? + requires_casted_case_in_updates = False + + # Does the backend support partial indexes (CREATE INDEX ... WHERE ...)? + supports_partial_indexes = True + supports_functions_in_partial_indexes = True + + # Does the database allow more than one constraint or index on the same + # field(s)? + allows_multiple_constraints_on_same_fields = True + + def __init__(self, connection): + self.connection = connection + + @cached_property + def supports_explaining_query_execution(self): + """Does this backend support explaining query execution?""" + return self.connection.ops.explain_prefix is not None + + @cached_property + def supports_transactions(self): + """Confirm support for transactions.""" + with self.connection.cursor() as cursor: + cursor.execute('CREATE TABLE ROLLBACK_TEST (X INT)') + self.connection.set_autocommit(False) + cursor.execute('INSERT INTO ROLLBACK_TEST (X) VALUES (8)') + self.connection.rollback() + self.connection.set_autocommit(True) + cursor.execute('SELECT COUNT(X) FROM ROLLBACK_TEST') + count, = cursor.fetchone() + cursor.execute('DROP TABLE ROLLBACK_TEST') + return count == 0 diff --git a/venv/lib/python3.7/site-packages/django/db/backends/base/validation.py b/venv/lib/python3.7/site-packages/django/db/backends/base/validation.py new file mode 100644 index 0000000..a02780a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/base/validation.py @@ -0,0 +1,25 @@ +class BaseDatabaseValidation: + """Encapsulate backend-specific validation.""" + def __init__(self, connection): + self.connection = connection + + def check(self, **kwargs): + return [] + + def check_field(self, field, **kwargs): + errors = [] + # Backends may implement a check_field_type() method. + if (hasattr(self, 'check_field_type') and + # Ignore any related fields. + not getattr(field, 'remote_field', None)): + # Ignore fields with unsupported features. + db_supports_all_required_features = all( + getattr(self.connection.features, feature, False) + for feature in field.model._meta.required_db_features + ) + if db_supports_all_required_features: + field_type = field.db_type(self.connection) + # Ignore non-concrete fields. + if field_type is not None: + errors.extend(self.check_field_type(field, field_type)) + return errors diff --git a/venv/lib/python3.7/site-packages/django/db/backends/dummy/__init__.py b/venv/lib/python3.7/site-packages/django/db/backends/dummy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django/db/backends/mysql/client.py b/venv/lib/python3.7/site-packages/django/db/backends/mysql/client.py new file mode 100644 index 0000000..224bfc3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/mysql/client.py @@ -0,0 +1,48 @@ +import subprocess + +from django.db.backends.base.client import BaseDatabaseClient + + +class DatabaseClient(BaseDatabaseClient): + executable_name = 'mysql' + + @classmethod + def settings_to_cmd_args(cls, settings_dict): + args = [cls.executable_name] + db = settings_dict['OPTIONS'].get('db', settings_dict['NAME']) + user = settings_dict['OPTIONS'].get('user', settings_dict['USER']) + passwd = settings_dict['OPTIONS'].get('passwd', settings_dict['PASSWORD']) + host = settings_dict['OPTIONS'].get('host', settings_dict['HOST']) + port = settings_dict['OPTIONS'].get('port', settings_dict['PORT']) + server_ca = settings_dict['OPTIONS'].get('ssl', {}).get('ca') + client_cert = settings_dict['OPTIONS'].get('ssl', {}).get('cert') + client_key = settings_dict['OPTIONS'].get('ssl', {}).get('key') + defaults_file = settings_dict['OPTIONS'].get('read_default_file') + # Seems to be no good way to set sql_mode with CLI. + + if defaults_file: + args += ["--defaults-file=%s" % defaults_file] + if user: + args += ["--user=%s" % user] + if passwd: + args += ["--password=%s" % passwd] + if host: + if '/' in host: + args += ["--socket=%s" % host] + else: + args += ["--host=%s" % host] + if port: + args += ["--port=%s" % port] + if server_ca: + args += ["--ssl-ca=%s" % server_ca] + if client_cert: + args += ["--ssl-cert=%s" % client_cert] + if client_key: + args += ["--ssl-key=%s" % client_key] + if db: + args += [db] + return args + + def runshell(self): + args = DatabaseClient.settings_to_cmd_args(self.connection.settings_dict) + subprocess.check_call(args) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/mysql/creation.py b/venv/lib/python3.7/site-packages/django/db/backends/mysql/creation.py new file mode 100644 index 0000000..0e5bfca --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/mysql/creation.py @@ -0,0 +1,67 @@ +import subprocess +import sys + +from django.db.backends.base.creation import BaseDatabaseCreation + +from .client import DatabaseClient + + +class DatabaseCreation(BaseDatabaseCreation): + + def sql_table_creation_suffix(self): + suffix = [] + test_settings = self.connection.settings_dict['TEST'] + if test_settings['CHARSET']: + suffix.append('CHARACTER SET %s' % test_settings['CHARSET']) + if test_settings['COLLATION']: + suffix.append('COLLATE %s' % test_settings['COLLATION']) + return ' '.join(suffix) + + def _execute_create_test_db(self, cursor, parameters, keepdb=False): + try: + super()._execute_create_test_db(cursor, parameters, keepdb) + except Exception as e: + if len(e.args) < 1 or e.args[0] != 1007: + # All errors except "database exists" (1007) cancel tests. + self.log('Got an error creating the test database: %s' % e) + sys.exit(2) + else: + raise e + + def _clone_test_db(self, suffix, verbosity, keepdb=False): + source_database_name = self.connection.settings_dict['NAME'] + target_database_name = self.get_test_db_clone_settings(suffix)['NAME'] + test_db_params = { + 'dbname': self.connection.ops.quote_name(target_database_name), + 'suffix': self.sql_table_creation_suffix(), + } + with self._nodb_connection.cursor() as cursor: + try: + self._execute_create_test_db(cursor, test_db_params, keepdb) + except Exception: + if keepdb: + # If the database should be kept, skip everything else. + return + try: + if verbosity >= 1: + self.log('Destroying old test database for alias %s...' % ( + self._get_database_display_str(verbosity, target_database_name), + )) + cursor.execute('DROP DATABASE %(dbname)s' % test_db_params) + self._execute_create_test_db(cursor, test_db_params, keepdb) + except Exception as e: + self.log('Got an error recreating the test database: %s' % e) + sys.exit(2) + self._clone_db(source_database_name, target_database_name) + + def _clone_db(self, source_database_name, target_database_name): + dump_args = DatabaseClient.settings_to_cmd_args(self.connection.settings_dict)[1:] + dump_args[-1] = source_database_name + dump_cmd = ['mysqldump', '--routines', '--events'] + dump_args + load_cmd = DatabaseClient.settings_to_cmd_args(self.connection.settings_dict) + load_cmd[-1] = target_database_name + + with subprocess.Popen(dump_cmd, stdout=subprocess.PIPE) as dump_proc: + with subprocess.Popen(load_cmd, stdin=dump_proc.stdout, stdout=subprocess.DEVNULL): + # Allow dump_proc to receive a SIGPIPE if the load process exits. + dump_proc.stdout.close() diff --git a/venv/lib/python3.7/site-packages/django/db/backends/mysql/features.py b/venv/lib/python3.7/site-packages/django/db/backends/mysql/features.py new file mode 100644 index 0000000..21e2e04 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/mysql/features.py @@ -0,0 +1,120 @@ +import operator + +from django.db.backends.base.features import BaseDatabaseFeatures +from django.utils.functional import cached_property + + +class DatabaseFeatures(BaseDatabaseFeatures): + empty_fetchmany_value = () + update_can_self_select = False + allows_group_by_pk = True + related_fields_match_type = True + # MySQL doesn't support sliced subqueries with IN/ALL/ANY/SOME. + allow_sliced_subqueries_with_in = False + has_select_for_update = True + supports_forward_references = False + supports_regex_backreferencing = False + supports_date_lookup_using_string = False + can_introspect_autofield = True + can_introspect_binary_field = False + can_introspect_duration_field = False + can_introspect_small_integer_field = True + can_introspect_positive_integer_field = True + introspected_boolean_field_type = 'IntegerField' + supports_index_column_ordering = False + supports_timezones = False + requires_explicit_null_ordering_when_grouping = True + allows_auto_pk_0 = False + can_release_savepoints = True + atomic_transactions = False + supports_column_check_constraints = False + supports_table_check_constraints = False + can_clone_databases = True + supports_temporal_subtraction = True + supports_select_intersection = False + supports_select_difference = False + supports_slicing_ordering_in_compound = True + supports_index_on_text_field = False + has_case_insensitive_like = False + create_test_procedure_without_params_sql = """ + CREATE PROCEDURE test_procedure () + BEGIN + DECLARE V_I INTEGER; + SET V_I = 1; + END; + """ + create_test_procedure_with_int_param_sql = """ + CREATE PROCEDURE test_procedure (P_I INTEGER) + BEGIN + DECLARE V_I INTEGER; + SET V_I = P_I; + END; + """ + db_functions_convert_bytes_to_str = True + # Alias MySQL's TRADITIONAL to TEXT for consistency with other backends. + supported_explain_formats = {'JSON', 'TEXT', 'TRADITIONAL'} + # Neither MySQL nor MariaDB support partial indexes. + supports_partial_indexes = False + + @cached_property + def _mysql_storage_engine(self): + "Internal method used in Django tests. Don't rely on this from your code" + with self.connection.cursor() as cursor: + cursor.execute("SELECT ENGINE FROM INFORMATION_SCHEMA.ENGINES WHERE SUPPORT = 'DEFAULT'") + result = cursor.fetchone() + return result[0] + + @cached_property + def can_introspect_foreign_keys(self): + "Confirm support for introspected foreign keys" + return self._mysql_storage_engine != 'MyISAM' + + @cached_property + def has_zoneinfo_database(self): + # Test if the time zone definitions are installed. + with self.connection.cursor() as cursor: + cursor.execute("SELECT 1 FROM mysql.time_zone LIMIT 1") + return cursor.fetchone() is not None + + @cached_property + def is_sql_auto_is_null_enabled(self): + with self.connection.cursor() as cursor: + cursor.execute('SELECT @@SQL_AUTO_IS_NULL') + result = cursor.fetchone() + return result and result[0] == 1 + + @cached_property + def supports_over_clause(self): + if self.connection.mysql_is_mariadb: + return self.connection.mysql_version >= (10, 2) + return self.connection.mysql_version >= (8, 0, 2) + + @cached_property + def has_select_for_update_skip_locked(self): + return not self.connection.mysql_is_mariadb and self.connection.mysql_version >= (8, 0, 1) + + has_select_for_update_nowait = property(operator.attrgetter('has_select_for_update_skip_locked')) + + @cached_property + def needs_explain_extended(self): + # EXTENDED is deprecated (and not required) in MySQL 5.7. + return not self.connection.mysql_is_mariadb and self.connection.mysql_version < (5, 7) + + @cached_property + def supports_transactions(self): + """ + All storage engines except MyISAM support transactions. + """ + return self._mysql_storage_engine != 'MyISAM' + + @cached_property + def ignores_table_name_case(self): + with self.connection.cursor() as cursor: + cursor.execute('SELECT @@LOWER_CASE_TABLE_NAMES') + result = cursor.fetchone() + return result and result[0] != 0 + + @cached_property + def supports_default_in_lead_lag(self): + # To be added in https://jira.mariadb.org/browse/MDEV-12981. + return not self.connection.mysql_is_mariadb diff --git a/venv/lib/python3.7/site-packages/django/db/backends/mysql/operations.py b/venv/lib/python3.7/site-packages/django/db/backends/mysql/operations.py new file mode 100644 index 0000000..43f4f74 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/mysql/operations.py @@ -0,0 +1,306 @@ +import uuid + +from django.conf import settings +from django.db.backends.base.operations import BaseDatabaseOperations +from django.utils import timezone +from django.utils.duration import duration_microseconds + + +class DatabaseOperations(BaseDatabaseOperations): + compiler_module = "django.db.backends.mysql.compiler" + + # MySQL stores positive fields as UNSIGNED ints. + integer_field_ranges = { + **BaseDatabaseOperations.integer_field_ranges, + 'PositiveSmallIntegerField': (0, 65535), + 'PositiveIntegerField': (0, 4294967295), + } + cast_data_types = { + 'AutoField': 'signed integer', + 'BigAutoField': 'signed integer', + 'CharField': 'char(%(max_length)s)', + 'DecimalField': 'decimal(%(max_digits)s, %(decimal_places)s)', + 'TextField': 'char', + 'IntegerField': 'signed integer', + 'BigIntegerField': 'signed integer', + 'SmallIntegerField': 'signed integer', + 'PositiveIntegerField': 'unsigned integer', + 'PositiveSmallIntegerField': 'unsigned integer', + } + cast_char_field_without_max_length = 'char' + explain_prefix = 'EXPLAIN' + + def date_extract_sql(self, lookup_type, field_name): + # https://dev.mysql.com/doc/mysql/en/date-and-time-functions.html + if lookup_type == 'week_day': + # DAYOFWEEK() returns an integer, 1-7, Sunday=1. + # Note: WEEKDAY() returns 0-6, Monday=0. + return "DAYOFWEEK(%s)" % field_name + elif lookup_type == 'week': + # Override the value of default_week_format for consistency with + # other database backends. + # Mode 3: Monday, 1-53, with 4 or more days this year. + return "WEEK(%s, 3)" % field_name + elif lookup_type == 'iso_year': + # Get the year part from the YEARWEEK function, which returns a + # number as year * 100 + week. + return "TRUNCATE(YEARWEEK(%s, 3), -2) / 100" % field_name + else: + # EXTRACT returns 1-53 based on ISO-8601 for the week number. + return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name) + + def date_trunc_sql(self, lookup_type, field_name): + fields = { + 'year': '%%Y-01-01', + 'month': '%%Y-%%m-01', + } # Use double percents to escape. + if lookup_type in fields: + format_str = fields[lookup_type] + return "CAST(DATE_FORMAT(%s, '%s') AS DATE)" % (field_name, format_str) + elif lookup_type == 'quarter': + return "MAKEDATE(YEAR(%s), 1) + INTERVAL QUARTER(%s) QUARTER - INTERVAL 1 QUARTER" % ( + field_name, field_name + ) + elif lookup_type == 'week': + return "DATE_SUB(%s, INTERVAL WEEKDAY(%s) DAY)" % ( + field_name, field_name + ) + else: + return "DATE(%s)" % (field_name) + + def _convert_field_to_tz(self, field_name, tzname): + if settings.USE_TZ: + field_name = "CONVERT_TZ(%s, 'UTC', '%s')" % (field_name, tzname) + return field_name + + def datetime_cast_date_sql(self, field_name, tzname): + field_name = self._convert_field_to_tz(field_name, tzname) + return "DATE(%s)" % field_name + + def datetime_cast_time_sql(self, field_name, tzname): + field_name = self._convert_field_to_tz(field_name, tzname) + return "TIME(%s)" % field_name + + def datetime_extract_sql(self, lookup_type, field_name, tzname): + field_name = self._convert_field_to_tz(field_name, tzname) + return self.date_extract_sql(lookup_type, field_name) + + def datetime_trunc_sql(self, lookup_type, field_name, tzname): + field_name = self._convert_field_to_tz(field_name, tzname) + fields = ['year', 'month', 'day', 'hour', 'minute', 'second'] + format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape. + format_def = ('0000-', '01', '-01', ' 00:', '00', ':00') + if lookup_type == 'quarter': + return ( + "CAST(DATE_FORMAT(MAKEDATE(YEAR({field_name}), 1) + " + "INTERVAL QUARTER({field_name}) QUARTER - " + + "INTERVAL 1 QUARTER, '%%Y-%%m-01 00:00:00') AS DATETIME)" + ).format(field_name=field_name) + if lookup_type == 'week': + return ( + "CAST(DATE_FORMAT(DATE_SUB({field_name}, " + "INTERVAL WEEKDAY({field_name}) DAY), " + "'%%Y-%%m-%%d 00:00:00') AS DATETIME)" + ).format(field_name=field_name) + try: + i = fields.index(lookup_type) + 1 + except ValueError: + sql = field_name + else: + format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]]) + sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str) + return sql + + def time_trunc_sql(self, lookup_type, field_name): + fields = { + 'hour': '%%H:00:00', + 'minute': '%%H:%%i:00', + 'second': '%%H:%%i:%%s', + } # Use double percents to escape. + if lookup_type in fields: + format_str = fields[lookup_type] + return "CAST(DATE_FORMAT(%s, '%s') AS TIME)" % (field_name, format_str) + else: + return "TIME(%s)" % (field_name) + + def date_interval_sql(self, timedelta): + return 'INTERVAL %s MICROSECOND' % duration_microseconds(timedelta) + + def format_for_duration_arithmetic(self, sql): + return 'INTERVAL %s MICROSECOND' % sql + + def force_no_ordering(self): + """ + "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped + columns. If no ordering would otherwise be applied, we don't want any + implicit sorting going on. + """ + return [(None, ("NULL", [], False))] + + def last_executed_query(self, cursor, sql, params): + # With MySQLdb, cursor objects have an (undocumented) "_executed" + # attribute where the exact query sent to the database is saved. + # See MySQLdb/cursors.py in the source distribution. + query = getattr(cursor, '_executed', None) + if query is not None: + query = query.decode(errors='replace') + return query + + def no_limit_value(self): + # 2**64 - 1, as recommended by the MySQL documentation + return 18446744073709551615 + + def quote_name(self, name): + if name.startswith("`") and name.endswith("`"): + return name # Quoting once is enough. + return "`%s`" % name + + def random_function_sql(self): + return 'RAND()' + + def sql_flush(self, style, tables, sequences, allow_cascade=False): + # NB: The generated SQL below is specific to MySQL + # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements + # to clear all tables of all data + if tables: + sql = ['SET FOREIGN_KEY_CHECKS = 0;'] + for table in tables: + sql.append('%s %s;' % ( + style.SQL_KEYWORD('TRUNCATE'), + style.SQL_FIELD(self.quote_name(table)), + )) + sql.append('SET FOREIGN_KEY_CHECKS = 1;') + sql.extend(self.sequence_reset_by_name_sql(style, sequences)) + return sql + else: + return [] + + def validate_autopk_value(self, value): + # MySQLism: zero in AUTO_INCREMENT field does not work. Refs #17653. + if value == 0: + raise ValueError('The database backend does not accept 0 as a ' + 'value for AutoField.') + return value + + def adapt_datetimefield_value(self, value): + if value is None: + return None + + # Expression values are adapted by the database. + if hasattr(value, 'resolve_expression'): + return value + + # MySQL doesn't support tz-aware datetimes + if timezone.is_aware(value): + if settings.USE_TZ: + value = timezone.make_naive(value, self.connection.timezone) + else: + raise ValueError("MySQL backend does not support timezone-aware datetimes when USE_TZ is False.") + return str(value) + + def adapt_timefield_value(self, value): + if value is None: + return None + + # Expression values are adapted by the database. + if hasattr(value, 'resolve_expression'): + return value + + # MySQL doesn't support tz-aware times + if timezone.is_aware(value): + raise ValueError("MySQL backend does not support timezone-aware times.") + + return str(value) + + def max_name_length(self): + return 64 + + def bulk_insert_sql(self, fields, placeholder_rows): + placeholder_rows_sql = (", ".join(row) for row in placeholder_rows) + values_sql = ", ".join("(%s)" % sql for sql in placeholder_rows_sql) + return "VALUES " + values_sql + + def combine_expression(self, connector, sub_expressions): + if connector == '^': + return 'POW(%s)' % ','.join(sub_expressions) + # Convert the result to a signed integer since MySQL's binary operators + # return an unsigned integer. + elif connector in ('&', '|', '<<'): + return 'CONVERT(%s, SIGNED)' % connector.join(sub_expressions) + elif connector == '>>': + lhs, rhs = sub_expressions + return 'FLOOR(%(lhs)s / POW(2, %(rhs)s))' % {'lhs': lhs, 'rhs': rhs} + return super().combine_expression(connector, sub_expressions) + + def get_db_converters(self, expression): + converters = super().get_db_converters(expression) + internal_type = expression.output_field.get_internal_type() + if internal_type in ['BooleanField', 'NullBooleanField']: + converters.append(self.convert_booleanfield_value) + elif internal_type == 'DateTimeField': + if settings.USE_TZ: + converters.append(self.convert_datetimefield_value) + elif internal_type == 'UUIDField': + converters.append(self.convert_uuidfield_value) + return converters + + def convert_booleanfield_value(self, value, expression, connection): + if value in (0, 1): + value = bool(value) + return value + + def convert_datetimefield_value(self, value, expression, connection): + if value is not None: + value = timezone.make_aware(value, self.connection.timezone) + return value + + def convert_uuidfield_value(self, value, expression, connection): + if value is not None: + value = uuid.UUID(value) + return value + + def binary_placeholder_sql(self, value): + return '_binary %s' if value is not None and not hasattr(value, 'as_sql') else '%s' + + def subtract_temporals(self, internal_type, lhs, rhs): + lhs_sql, lhs_params = lhs + rhs_sql, rhs_params = rhs + if internal_type == 'TimeField': + if self.connection.mysql_is_mariadb: + # MariaDB includes the microsecond component in TIME_TO_SEC as + # a decimal. MySQL returns an integer without microseconds. + return 'CAST((TIME_TO_SEC(%(lhs)s) - TIME_TO_SEC(%(rhs)s)) * 1000000 AS SIGNED)' % { + 'lhs': lhs_sql, 'rhs': rhs_sql + }, lhs_params + rhs_params + return ( + "((TIME_TO_SEC(%(lhs)s) * 1000000 + MICROSECOND(%(lhs)s)) -" + " (TIME_TO_SEC(%(rhs)s) * 1000000 + MICROSECOND(%(rhs)s)))" + ) % {'lhs': lhs_sql, 'rhs': rhs_sql}, lhs_params * 2 + rhs_params * 2 + else: + return "TIMESTAMPDIFF(MICROSECOND, %s, %s)" % (rhs_sql, lhs_sql), rhs_params + lhs_params + + def explain_query_prefix(self, format=None, **options): + # Alias MySQL's TRADITIONAL to TEXT for consistency with other backends. + if format and format.upper() == 'TEXT': + format = 'TRADITIONAL' + prefix = super().explain_query_prefix(format, **options) + if format: + prefix += ' FORMAT=%s' % format + if self.connection.features.needs_explain_extended and format is None: + # EXTENDED and FORMAT are mutually exclusive options. + prefix += ' EXTENDED' + return prefix + + def regex_lookup(self, lookup_type): + # REGEXP BINARY doesn't work correctly in MySQL 8+ and REGEXP_LIKE + # doesn't exist in MySQL 5.6 or in MariaDB. + if self.connection.mysql_version < (8, 0, 0) or self.connection.mysql_is_mariadb: + if lookup_type == 'regex': + return '%s REGEXP BINARY %s' + return '%s REGEXP %s' + + match_option = 'c' if lookup_type == 'regex' else 'i' + return "REGEXP_LIKE(%%s, %%s, '%s')" % match_option + + def insert_statement(self, ignore_conflicts=False): + return 'INSERT IGNORE INTO' if ignore_conflicts else super().insert_statement(ignore_conflicts) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/mysql/schema.py b/venv/lib/python3.7/site-packages/django/db/backends/mysql/schema.py new file mode 100644 index 0000000..65d1f24 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/mysql/schema.py @@ -0,0 +1,103 @@ +from django.db.backends.base.schema import BaseDatabaseSchemaEditor +from django.db.models import NOT_PROVIDED + + +class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): + + sql_rename_table = "RENAME TABLE %(old_table)s TO %(new_table)s" + + sql_alter_column_null = "MODIFY %(column)s %(type)s NULL" + sql_alter_column_not_null = "MODIFY %(column)s %(type)s NOT NULL" + sql_alter_column_type = "MODIFY %(column)s %(type)s" + + # No 'CASCADE' which works as a no-op in MySQL but is undocumented + sql_delete_column = "ALTER TABLE %(table)s DROP COLUMN %(column)s" + + sql_rename_column = "ALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s" + + sql_delete_unique = "ALTER TABLE %(table)s DROP INDEX %(name)s" + + sql_delete_fk = "ALTER TABLE %(table)s DROP FOREIGN KEY %(name)s" + + sql_delete_index = "DROP INDEX %(name)s ON %(table)s" + + sql_create_pk = "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)" + sql_delete_pk = "ALTER TABLE %(table)s DROP PRIMARY KEY" + + sql_create_index = 'CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s' + + def quote_value(self, value): + self.connection.ensure_connection() + quoted = self.connection.connection.escape(value, self.connection.connection.encoders) + if isinstance(value, str): + quoted = quoted.decode() + return quoted + + def _is_limited_data_type(self, field): + db_type = field.db_type(self.connection) + return db_type is not None and db_type.lower() in self.connection._limited_data_types + + def skip_default(self, field): + return self._is_limited_data_type(field) + + def add_field(self, model, field): + super().add_field(model, field) + + # Simulate the effect of a one-off default. + # field.default may be unhashable, so a set isn't used for "in" check. + if self.skip_default(field) and field.default not in (None, NOT_PROVIDED): + effective_default = self.effective_default(field) + self.execute('UPDATE %(table)s SET %(column)s = %%s' % { + 'table': self.quote_name(model._meta.db_table), + 'column': self.quote_name(field.column), + }, [effective_default]) + + def _field_should_be_indexed(self, model, field): + create_index = super()._field_should_be_indexed(model, field) + storage = self.connection.introspection.get_storage_engine( + self.connection.cursor(), model._meta.db_table + ) + # No need to create an index for ForeignKey fields except if + # db_constraint=False because the index from that constraint won't be + # created. + if (storage == "InnoDB" and + create_index and + field.get_internal_type() == 'ForeignKey' and + field.db_constraint): + return False + return not self._is_limited_data_type(field) and create_index + + def _delete_composed_index(self, model, fields, *args): + """ + MySQL can remove an implicit FK index on a field when that field is + covered by another index like a unique_together. "covered" here means + that the more complex index starts like the simpler one. + http://bugs.mysql.com/bug.php?id=37910 / Django ticket #24757 + We check here before removing the [unique|index]_together if we have to + recreate a FK index. + """ + first_field = model._meta.get_field(fields[0]) + if first_field.get_internal_type() == 'ForeignKey': + constraint_names = self._constraint_names(model, [first_field.column], index=True) + if not constraint_names: + self.execute(self._create_index_sql(model, [first_field], suffix="")) + return super()._delete_composed_index(model, fields, *args) + + def _set_field_new_type_null_status(self, field, new_type): + """ + Keep the null property of the old field. If it has changed, it will be + handled separately. + """ + if field.null: + new_type += " NULL" + else: + new_type += " NOT NULL" + return new_type + + def _alter_column_type_sql(self, model, old_field, new_field, new_type): + new_type = self._set_field_new_type_null_status(old_field, new_type) + return super()._alter_column_type_sql(model, old_field, new_field, new_type) + + def _rename_field_sql(self, table, old_field, new_field, new_type): + new_type = self._set_field_new_type_null_status(old_field, new_type) + return super()._rename_field_sql(table, old_field, new_field, new_type) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/oracle/client.py b/venv/lib/python3.7/site-packages/django/db/backends/oracle/client.py new file mode 100644 index 0000000..4c5070a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/oracle/client.py @@ -0,0 +1,17 @@ +import shutil +import subprocess + +from django.db.backends.base.client import BaseDatabaseClient + + +class DatabaseClient(BaseDatabaseClient): + executable_name = 'sqlplus' + wrapper_name = 'rlwrap' + + def runshell(self): + conn_string = self.connection._connect_string() + args = [self.executable_name, "-L", conn_string] + wrapper_path = shutil.which(self.wrapper_name) + if wrapper_path: + args = [wrapper_path, *args] + subprocess.check_call(args) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/oracle/features.py b/venv/lib/python3.7/site-packages/django/db/backends/oracle/features.py new file mode 100644 index 0000000..55bf327 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/oracle/features.py @@ -0,0 +1,71 @@ +from django.db.backends.base.features import BaseDatabaseFeatures +from django.db.utils import InterfaceError +from django.utils.functional import cached_property + + +class DatabaseFeatures(BaseDatabaseFeatures): + interprets_empty_strings_as_nulls = True + has_select_for_update = True + has_select_for_update_nowait = True + has_select_for_update_skip_locked = True + has_select_for_update_of = True + select_for_update_of_column = True + can_return_id_from_insert = True + can_introspect_autofield = True + supports_subqueries_in_group_by = False + supports_transactions = True + supports_timezones = False + has_native_duration_field = True + can_defer_constraint_checks = True + supports_partially_nullable_unique_constraints = False + truncates_names = True + supports_tablespaces = True + supports_sequence_reset = False + can_introspect_materialized_views = True + can_introspect_time_field = False + atomic_transactions = False + supports_combined_alters = False + nulls_order_largest = True + requires_literal_defaults = True + closed_cursor_error_class = InterfaceError + bare_select_suffix = " FROM DUAL" + # select for update with limit can be achieved on Oracle, but not with the current backend. + supports_select_for_update_with_limit = False + supports_temporal_subtraction = True + # Oracle doesn't ignore quoted identifiers case but the current backend + # does by uppercasing all identifiers. + ignores_table_name_case = True + supports_index_on_text_field = False + has_case_insensitive_like = False + create_test_procedure_without_params_sql = """ + CREATE PROCEDURE "TEST_PROCEDURE" AS + V_I INTEGER; + BEGIN + V_I := 1; + END; + """ + create_test_procedure_with_int_param_sql = """ + CREATE PROCEDURE "TEST_PROCEDURE" (P_I INTEGER) AS + V_I INTEGER; + BEGIN + V_I := P_I; + END; + """ + supports_callproc_kwargs = True + supports_over_clause = True + supports_ignore_conflicts = False + max_query_params = 2**16 - 1 + supports_partial_indexes = False + allows_multiple_constraints_on_same_fields = False + + @cached_property + def has_fetch_offset_support(self): + return self.connection.oracle_version >= (12, 2) + + @cached_property + def allow_sliced_subqueries_with_in(self): + return self.has_fetch_offset_support + + @cached_property + def supports_slicing_ordering_in_compound(self): + return self.has_fetch_offset_support diff --git a/venv/lib/python3.7/site-packages/django/db/backends/oracle/functions.py b/venv/lib/python3.7/site-packages/django/db/backends/oracle/functions.py new file mode 100644 index 0000000..1aeb459 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/oracle/functions.py @@ -0,0 +1,22 @@ +from django.db.models import DecimalField, DurationField, Func + + +class IntervalToSeconds(Func): + function = '' + template = """ + EXTRACT(day from %(expressions)s) * 86400 + + EXTRACT(hour from %(expressions)s) * 3600 + + EXTRACT(minute from %(expressions)s) * 60 + + EXTRACT(second from %(expressions)s) + """ + + def __init__(self, expression, *, output_field=None, **extra): + super().__init__(expression, output_field=output_field or DecimalField(), **extra) + + +class SecondsToInterval(Func): + function = 'NUMTODSINTERVAL' + template = "%(function)s(%(expressions)s, 'SECOND')" + + def __init__(self, expression, *, output_field=None, **extra): + super().__init__(expression, output_field=output_field or DurationField(), **extra) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql/base.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/base.py new file mode 100644 index 0000000..f0d66ef --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/base.py @@ -0,0 +1,283 @@ +""" +PostgreSQL database backend for Django. + +Requires psycopg 2: http://initd.org/projects/psycopg2 +""" + +import threading +import warnings + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import connections +from django.db.backends.base.base import BaseDatabaseWrapper +from django.db.utils import DatabaseError as WrappedDatabaseError +from django.utils.functional import cached_property +from django.utils.safestring import SafeText +from django.utils.version import get_version_tuple + +try: + import psycopg2 as Database + import psycopg2.extensions + import psycopg2.extras +except ImportError as e: + raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e) + + +def psycopg2_version(): + version = psycopg2.__version__.split(' ', 1)[0] + return get_version_tuple(version) + + +PSYCOPG2_VERSION = psycopg2_version() + +if PSYCOPG2_VERSION < (2, 5, 4): + raise ImproperlyConfigured("psycopg2_version 2.5.4 or newer is required; you have %s" % psycopg2.__version__) + + +# Some of these import psycopg2, so import them after checking if it's installed. +from .client import DatabaseClient # NOQA isort:skip +from .creation import DatabaseCreation # NOQA isort:skip +from .features import DatabaseFeatures # NOQA isort:skip +from .introspection import DatabaseIntrospection # NOQA isort:skip +from .operations import DatabaseOperations # NOQA isort:skip +from .schema import DatabaseSchemaEditor # NOQA isort:skip +from .utils import utc_tzinfo_factory # NOQA isort:skip + +psycopg2.extensions.register_adapter(SafeText, psycopg2.extensions.QuotedString) +psycopg2.extras.register_uuid() + +# Register support for inet[] manually so we don't have to handle the Inet() +# object on load all the time. +INETARRAY_OID = 1041 +INETARRAY = psycopg2.extensions.new_array_type( + (INETARRAY_OID,), + 'INETARRAY', + psycopg2.extensions.UNICODE, +) +psycopg2.extensions.register_type(INETARRAY) + + +class DatabaseWrapper(BaseDatabaseWrapper): + vendor = 'postgresql' + display_name = 'PostgreSQL' + # This dictionary maps Field objects to their associated PostgreSQL column + # types, as strings. Column-type strings can contain format strings; they'll + # be interpolated against the values of Field.__dict__ before being output. + # If a column type is set to None, it won't be included in the output. + data_types = { + 'AutoField': 'serial', + 'BigAutoField': 'bigserial', + 'BinaryField': 'bytea', + 'BooleanField': 'boolean', + 'CharField': 'varchar(%(max_length)s)', + 'DateField': 'date', + 'DateTimeField': 'timestamp with time zone', + 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', + 'DurationField': 'interval', + 'FileField': 'varchar(%(max_length)s)', + 'FilePathField': 'varchar(%(max_length)s)', + 'FloatField': 'double precision', + 'IntegerField': 'integer', + 'BigIntegerField': 'bigint', + 'IPAddressField': 'inet', + 'GenericIPAddressField': 'inet', + 'NullBooleanField': 'boolean', + 'OneToOneField': 'integer', + 'PositiveIntegerField': 'integer', + 'PositiveSmallIntegerField': 'smallint', + 'SlugField': 'varchar(%(max_length)s)', + 'SmallIntegerField': 'smallint', + 'TextField': 'text', + 'TimeField': 'time', + 'UUIDField': 'uuid', + } + data_type_check_constraints = { + 'PositiveIntegerField': '"%(column)s" >= 0', + 'PositiveSmallIntegerField': '"%(column)s" >= 0', + } + operators = { + 'exact': '= %s', + 'iexact': '= UPPER(%s)', + 'contains': 'LIKE %s', + 'icontains': 'LIKE UPPER(%s)', + 'regex': '~ %s', + 'iregex': '~* %s', + 'gt': '> %s', + 'gte': '>= %s', + 'lt': '< %s', + 'lte': '<= %s', + 'startswith': 'LIKE %s', + 'endswith': 'LIKE %s', + 'istartswith': 'LIKE UPPER(%s)', + 'iendswith': 'LIKE UPPER(%s)', + } + + # The patterns below are used to generate SQL pattern lookup clauses when + # the right-hand side of the lookup isn't a raw string (it might be an expression + # or the result of a bilateral transformation). + # In those cases, special characters for LIKE operators (e.g. \, *, _) should be + # escaped on database side. + # + # Note: we use str.format() here for readability as '%' is used as a wildcard for + # the LIKE operator. + pattern_esc = r"REPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')" + pattern_ops = { + 'contains': "LIKE '%%' || {} || '%%'", + 'icontains': "LIKE '%%' || UPPER({}) || '%%'", + 'startswith': "LIKE {} || '%%'", + 'istartswith': "LIKE UPPER({}) || '%%'", + 'endswith': "LIKE '%%' || {}", + 'iendswith': "LIKE '%%' || UPPER({})", + } + + Database = Database + SchemaEditorClass = DatabaseSchemaEditor + # Classes instantiated in __init__(). + client_class = DatabaseClient + creation_class = DatabaseCreation + features_class = DatabaseFeatures + introspection_class = DatabaseIntrospection + ops_class = DatabaseOperations + # PostgreSQL backend-specific attributes. + _named_cursor_idx = 0 + + def get_connection_params(self): + settings_dict = self.settings_dict + # None may be used to connect to the default 'postgres' db + if settings_dict['NAME'] == '': + raise ImproperlyConfigured( + "settings.DATABASES is improperly configured. " + "Please supply the NAME value.") + if len(settings_dict['NAME'] or '') > self.ops.max_name_length(): + raise ImproperlyConfigured( + "The database name '%s' (%d characters) is longer than " + "PostgreSQL's limit of %d characters. Supply a shorter NAME " + "in settings.DATABASES." % ( + settings_dict['NAME'], + len(settings_dict['NAME']), + self.ops.max_name_length(), + ) + ) + conn_params = { + 'database': settings_dict['NAME'] or 'postgres', + **settings_dict['OPTIONS'], + } + conn_params.pop('isolation_level', None) + if settings_dict['USER']: + conn_params['user'] = settings_dict['USER'] + if settings_dict['PASSWORD']: + conn_params['password'] = settings_dict['PASSWORD'] + if settings_dict['HOST']: + conn_params['host'] = settings_dict['HOST'] + if settings_dict['PORT']: + conn_params['port'] = settings_dict['PORT'] + return conn_params + + def get_new_connection(self, conn_params): + connection = Database.connect(**conn_params) + + # self.isolation_level must be set: + # - after connecting to the database in order to obtain the database's + # default when no value is explicitly specified in options. + # - before calling _set_autocommit() because if autocommit is on, that + # will set connection.isolation_level to ISOLATION_LEVEL_AUTOCOMMIT. + options = self.settings_dict['OPTIONS'] + try: + self.isolation_level = options['isolation_level'] + except KeyError: + self.isolation_level = connection.isolation_level + else: + # Set the isolation level to the value from OPTIONS. + if self.isolation_level != connection.isolation_level: + connection.set_session(isolation_level=self.isolation_level) + + return connection + + def ensure_timezone(self): + if self.connection is None: + return False + conn_timezone_name = self.connection.get_parameter_status('TimeZone') + timezone_name = self.timezone_name + if timezone_name and conn_timezone_name != timezone_name: + with self.connection.cursor() as cursor: + cursor.execute(self.ops.set_time_zone_sql(), [timezone_name]) + return True + return False + + def init_connection_state(self): + self.connection.set_client_encoding('UTF8') + + timezone_changed = self.ensure_timezone() + if timezone_changed: + # Commit after setting the time zone (see #17062) + if not self.get_autocommit(): + self.connection.commit() + + def create_cursor(self, name=None): + if name: + # In autocommit mode, the cursor will be used outside of a + # transaction, hence use a holdable cursor. + cursor = self.connection.cursor(name, scrollable=False, withhold=self.connection.autocommit) + else: + cursor = self.connection.cursor() + cursor.tzinfo_factory = utc_tzinfo_factory if settings.USE_TZ else None + return cursor + + def chunked_cursor(self): + self._named_cursor_idx += 1 + return self._cursor( + name='_django_curs_%d_%d' % ( + # Avoid reusing name in other threads + threading.current_thread().ident, + self._named_cursor_idx, + ) + ) + + def _set_autocommit(self, autocommit): + with self.wrap_database_errors: + self.connection.autocommit = autocommit + + def check_constraints(self, table_names=None): + """ + Check constraints by setting them to immediate. Return them to deferred + afterward. + """ + self.cursor().execute('SET CONSTRAINTS ALL IMMEDIATE') + self.cursor().execute('SET CONSTRAINTS ALL DEFERRED') + + def is_usable(self): + try: + # Use a psycopg cursor directly, bypassing Django's utilities. + self.connection.cursor().execute("SELECT 1") + except Database.Error: + return False + else: + return True + + @property + def _nodb_connection(self): + nodb_connection = super()._nodb_connection + try: + nodb_connection.ensure_connection() + except (Database.DatabaseError, WrappedDatabaseError): + warnings.warn( + "Normally Django will use a connection to the 'postgres' database " + "to avoid running initialization queries against the production " + "database when it's not needed (for example, when running tests). " + "Django was unable to create a connection to the 'postgres' database " + "and will use the first PostgreSQL database instead.", + RuntimeWarning + ) + for connection in connections.all(): + if connection.vendor == 'postgresql' and connection.settings_dict['NAME'] != 'postgres': + return self.__class__( + {**self.settings_dict, 'NAME': connection.settings_dict['NAME']}, + alias=self.alias, + ) + return nodb_connection + + @cached_property + def pg_version(self): + with self.temporary_connection(): + return self.connection.server_version diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql/client.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/client.py new file mode 100644 index 0000000..7fca6ef --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/client.py @@ -0,0 +1,71 @@ +import os +import signal +import subprocess + +from django.core.files.temp import NamedTemporaryFile +from django.db.backends.base.client import BaseDatabaseClient + + +def _escape_pgpass(txt): + """ + Escape a fragment of a PostgreSQL .pgpass file. + """ + return txt.replace('\\', '\\\\').replace(':', '\\:') + + +class DatabaseClient(BaseDatabaseClient): + executable_name = 'psql' + + @classmethod + def runshell_db(cls, conn_params): + args = [cls.executable_name] + + host = conn_params.get('host', '') + port = conn_params.get('port', '') + dbname = conn_params.get('database', '') + user = conn_params.get('user', '') + passwd = conn_params.get('password', '') + + if user: + args += ['-U', user] + if host: + args += ['-h', host] + if port: + args += ['-p', str(port)] + args += [dbname] + + temp_pgpass = None + sigint_handler = signal.getsignal(signal.SIGINT) + try: + if passwd: + # Create temporary .pgpass file. + temp_pgpass = NamedTemporaryFile(mode='w+') + try: + print( + _escape_pgpass(host) or '*', + str(port) or '*', + _escape_pgpass(dbname) or '*', + _escape_pgpass(user) or '*', + _escape_pgpass(passwd), + file=temp_pgpass, + sep=':', + flush=True, + ) + os.environ['PGPASSFILE'] = temp_pgpass.name + except UnicodeEncodeError: + # If the current locale can't encode the data, let the + # user input the password manually. + pass + # Allow SIGINT to pass to psql to abort queries. + signal.signal(signal.SIGINT, signal.SIG_IGN) + subprocess.check_call(args) + finally: + # Restore the original SIGINT handler. + signal.signal(signal.SIGINT, sigint_handler) + if temp_pgpass: + temp_pgpass.close() + if 'PGPASSFILE' in os.environ: # unit tests need cleanup + del os.environ['PGPASSFILE'] + + def runshell(self): + DatabaseClient.runshell_db(self.connection.get_connection_params()) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql/creation.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/creation.py new file mode 100644 index 0000000..09af818 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/creation.py @@ -0,0 +1,77 @@ +import sys + +from psycopg2 import errorcodes + +from django.db.backends.base.creation import BaseDatabaseCreation +from django.db.backends.utils import strip_quotes + + +class DatabaseCreation(BaseDatabaseCreation): + + def _quote_name(self, name): + return self.connection.ops.quote_name(name) + + def _get_database_create_suffix(self, encoding=None, template=None): + suffix = "" + if encoding: + suffix += " ENCODING '{}'".format(encoding) + if template: + suffix += " TEMPLATE {}".format(self._quote_name(template)) + return suffix and "WITH" + suffix + + def sql_table_creation_suffix(self): + test_settings = self.connection.settings_dict['TEST'] + assert test_settings['COLLATION'] is None, ( + "PostgreSQL does not support collation setting at database creation time." + ) + return self._get_database_create_suffix( + encoding=test_settings['CHARSET'], + template=test_settings.get('TEMPLATE'), + ) + + def _database_exists(self, cursor, database_name): + cursor.execute('SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s', [strip_quotes(database_name)]) + return cursor.fetchone() is not None + + def _execute_create_test_db(self, cursor, parameters, keepdb=False): + try: + if keepdb and self._database_exists(cursor, parameters['dbname']): + # If the database should be kept and it already exists, don't + # try to create a new one. + return + super()._execute_create_test_db(cursor, parameters, keepdb) + except Exception as e: + if getattr(e.__cause__, 'pgcode', '') != errorcodes.DUPLICATE_DATABASE: + # All errors except "database already exists" cancel tests. + self.log('Got an error creating the test database: %s' % e) + sys.exit(2) + elif not keepdb: + # If the database should be kept, ignore "database already + # exists". + raise e + + def _clone_test_db(self, suffix, verbosity, keepdb=False): + # CREATE DATABASE ... WITH TEMPLATE ... requires closing connections + # to the template database. + self.connection.close() + + source_database_name = self.connection.settings_dict['NAME'] + target_database_name = self.get_test_db_clone_settings(suffix)['NAME'] + test_db_params = { + 'dbname': self._quote_name(target_database_name), + 'suffix': self._get_database_create_suffix(template=source_database_name), + } + with self._nodb_connection.cursor() as cursor: + try: + self._execute_create_test_db(cursor, test_db_params, keepdb) + except Exception: + try: + if verbosity >= 1: + self.log('Destroying old test database for alias %s...' % ( + self._get_database_display_str(verbosity, target_database_name), + )) + cursor.execute('DROP DATABASE %(dbname)s' % test_db_params) + self._execute_create_test_db(cursor, test_db_params, keepdb) + except Exception as e: + self.log('Got an error cloning the test database: %s' % e) + sys.exit(2) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql/schema.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/schema.py new file mode 100644 index 0000000..994f43c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql/schema.py @@ -0,0 +1,141 @@ +import psycopg2 + +from django.db.backends.base.schema import BaseDatabaseSchemaEditor +from django.db.backends.ddl_references import IndexColumns + + +class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): + + sql_alter_column_type = "ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::%(type)s" + + sql_create_sequence = "CREATE SEQUENCE %(sequence)s" + sql_delete_sequence = "DROP SEQUENCE IF EXISTS %(sequence)s CASCADE" + sql_set_sequence_max = "SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)s" + + sql_create_index = "CREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)s" + sql_delete_index = "DROP INDEX IF EXISTS %(name)s" + + # Setting the constraint to IMMEDIATE runs any deferred checks to allow + # dropping it in the same transaction. + sql_delete_fk = "SET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)s" + + sql_delete_procedure = 'DROP FUNCTION %(procedure)s(%(param_types)s)' + + def quote_value(self, value): + if isinstance(value, str): + value = value.replace('%', '%%') + # getquoted() returns a quoted bytestring of the adapted value. + return psycopg2.extensions.adapt(value).getquoted().decode() + + def _field_indexes_sql(self, model, field): + output = super()._field_indexes_sql(model, field) + like_index_statement = self._create_like_index_sql(model, field) + if like_index_statement is not None: + output.append(like_index_statement) + return output + + def _create_like_index_sql(self, model, field): + """ + Return the statement to create an index with varchar operator pattern + when the column type is 'varchar' or 'text', otherwise return None. + """ + db_type = field.db_type(connection=self.connection) + if db_type is not None and (field.db_index or field.unique): + # Fields with database column types of `varchar` and `text` need + # a second index that specifies their operator class, which is + # needed when performing correct LIKE queries outside the + # C locale. See #12234. + # + # The same doesn't apply to array fields such as varchar[size] + # and text[size], so skip them. + if '[' in db_type: + return None + if db_type.startswith('varchar'): + return self._create_index_sql(model, [field], suffix='_like', opclasses=['varchar_pattern_ops']) + elif db_type.startswith('text'): + return self._create_index_sql(model, [field], suffix='_like', opclasses=['text_pattern_ops']) + return None + + def _alter_column_type_sql(self, model, old_field, new_field, new_type): + """Make ALTER TYPE with SERIAL make sense.""" + table = model._meta.db_table + if new_type.lower() in ("serial", "bigserial"): + column = new_field.column + sequence_name = "%s_%s_seq" % (table, column) + col_type = "integer" if new_type.lower() == "serial" else "bigint" + return ( + ( + self.sql_alter_column_type % { + "column": self.quote_name(column), + "type": col_type, + }, + [], + ), + [ + ( + self.sql_delete_sequence % { + "sequence": self.quote_name(sequence_name), + }, + [], + ), + ( + self.sql_create_sequence % { + "sequence": self.quote_name(sequence_name), + }, + [], + ), + ( + self.sql_alter_column % { + "table": self.quote_name(table), + "changes": self.sql_alter_column_default % { + "column": self.quote_name(column), + "default": "nextval('%s')" % self.quote_name(sequence_name), + } + }, + [], + ), + ( + self.sql_set_sequence_max % { + "table": self.quote_name(table), + "column": self.quote_name(column), + "sequence": self.quote_name(sequence_name), + }, + [], + ), + ], + ) + else: + return super()._alter_column_type_sql(model, old_field, new_field, new_type) + + def _alter_field(self, model, old_field, new_field, old_type, new_type, + old_db_params, new_db_params, strict=False): + # Drop indexes on varchar/text/citext columns that are changing to a + # different type. + if (old_field.db_index or old_field.unique) and ( + (old_type.startswith('varchar') and not new_type.startswith('varchar')) or + (old_type.startswith('text') and not new_type.startswith('text')) or + (old_type.startswith('citext') and not new_type.startswith('citext')) + ): + index_name = self._create_index_name(model._meta.db_table, [old_field.column], suffix='_like') + self.execute(self._delete_index_sql(model, index_name)) + + super()._alter_field( + model, old_field, new_field, old_type, new_type, old_db_params, + new_db_params, strict, + ) + # Added an index? Create any PostgreSQL-specific indexes. + if ((not (old_field.db_index or old_field.unique) and new_field.db_index) or + (not old_field.unique and new_field.unique)): + like_index_statement = self._create_like_index_sql(model, new_field) + if like_index_statement is not None: + self.execute(like_index_statement) + + # Removed an index? Drop any PostgreSQL-specific indexes. + if old_field.unique and not (new_field.db_index or new_field.unique): + index_to_remove = self._create_index_name(model._meta.db_table, [old_field.column], suffix='_like') + self.execute(self._delete_index_sql(model, index_to_remove)) + + def _index_columns(self, table, columns, col_suffixes, opclasses): + if opclasses: + return IndexColumns(table, columns, self.quote_name, col_suffixes=col_suffixes, opclasses=opclasses) + return super()._index_columns(table, columns, col_suffixes, opclasses) diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/client.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/client.py new file mode 100644 index 0000000..2bf134b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/client.py @@ -0,0 +1 @@ +from ..postgresql.client import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/introspection.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/introspection.py new file mode 100644 index 0000000..1191bb2 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/introspection.py @@ -0,0 +1 @@ +from ..postgresql.introspection import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/operations.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/operations.py new file mode 100644 index 0000000..a45f5e5 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/operations.py @@ -0,0 +1 @@ +from ..postgresql.operations import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/schema.py b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/schema.py new file mode 100644 index 0000000..b0263d1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/postgresql_psycopg2/schema.py @@ -0,0 +1 @@ +from ..postgresql.schema import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/db/backends/sqlite3/introspection.py b/venv/lib/python3.7/site-packages/django/db/backends/sqlite3/introspection.py new file mode 100644 index 0000000..89b1cd3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/backends/sqlite3/introspection.py @@ -0,0 +1,434 @@ +import re +from collections import namedtuple + +import sqlparse + +from django.db.backends.base.introspection import ( + BaseDatabaseIntrospection, FieldInfo as BaseFieldInfo, TableInfo, +) +from django.db.models.indexes import Index + +FieldInfo = namedtuple('FieldInfo', BaseFieldInfo._fields + ('pk',)) + +field_size_re = re.compile(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$') + + +def get_field_size(name): + """ Extract the size number from a "varchar(11)" type name """ + m = field_size_re.search(name) + return int(m.group(1)) if m else None + + +# This light wrapper "fakes" a dictionary interface, because some SQLite data +# types include variables in them -- e.g. "varchar(30)" -- and can't be matched +# as a simple dictionary lookup. +class FlexibleFieldLookupDict: + # Maps SQL types to Django Field types. Some of the SQL types have multiple + # entries here because SQLite allows for anything and doesn't normalize the + # field type; it uses whatever was given. + base_data_types_reverse = { + 'bool': 'BooleanField', + 'boolean': 'BooleanField', + 'smallint': 'SmallIntegerField', + 'smallint unsigned': 'PositiveSmallIntegerField', + 'smallinteger': 'SmallIntegerField', + 'int': 'IntegerField', + 'integer': 'IntegerField', + 'bigint': 'BigIntegerField', + 'integer unsigned': 'PositiveIntegerField', + 'decimal': 'DecimalField', + 'real': 'FloatField', + 'text': 'TextField', + 'char': 'CharField', + 'varchar': 'CharField', + 'blob': 'BinaryField', + 'date': 'DateField', + 'datetime': 'DateTimeField', + 'time': 'TimeField', + } + + def __getitem__(self, key): + key = key.lower().split('(', 1)[0].strip() + return self.base_data_types_reverse[key] + + +class DatabaseIntrospection(BaseDatabaseIntrospection): + data_types_reverse = FlexibleFieldLookupDict() + + def get_field_type(self, data_type, description): + field_type = super().get_field_type(data_type, description) + if description.pk and field_type in {'BigIntegerField', 'IntegerField'}: + # No support for BigAutoField as SQLite treats all integer primary + # keys as signed 64-bit integers. + return 'AutoField' + return field_type + + def get_table_list(self, cursor): + """Return a list of table and view names in the current database.""" + # Skip the sqlite_sequence system table used for autoincrement key + # generation. + cursor.execute(""" + SELECT name, type FROM sqlite_master + WHERE type in ('table', 'view') AND NOT name='sqlite_sequence' + ORDER BY name""") + return [TableInfo(row[0], row[1][0]) for row in cursor.fetchall()] + + def get_table_description(self, cursor, table_name): + """ + Return a description of the table with the DB-API cursor.description + interface. + """ + return [ + FieldInfo( + info['name'], + info['type'], + None, + info['size'], + None, + None, + info['null_ok'], + info['default'], + info['pk'] == 1, + ) for info in self._table_info(cursor, table_name) + ] + + def get_sequences(self, cursor, table_name, table_fields=()): + pk_col = self.get_primary_key_column(cursor, table_name) + return [{'table': table_name, 'column': pk_col}] + + def get_relations(self, cursor, table_name): + """ + Return a dictionary of {field_name: (field_name_other_table, other_table)} + representing all relationships to the given table. + """ + # Dictionary of relations to return + relations = {} + + # Schema for this table + cursor.execute( + "SELECT sql, type FROM sqlite_master " + "WHERE tbl_name = %s AND type IN ('table', 'view')", + [table_name] + ) + create_sql, table_type = cursor.fetchone() + if table_type == 'view': + # It might be a view, then no results will be returned + return relations + results = create_sql[create_sql.index('(') + 1:create_sql.rindex(')')] + + # Walk through and look for references to other tables. SQLite doesn't + # really have enforced references, but since it echoes out the SQL used + # to create the table we can look for REFERENCES statements used there. + for field_desc in results.split(','): + field_desc = field_desc.strip() + if field_desc.startswith("UNIQUE"): + continue + + m = re.search(r'references (\S*) ?\(["|]?(.*)["|]?\)', field_desc, re.I) + if not m: + continue + table, column = [s.strip('"') for s in m.groups()] + + if field_desc.startswith("FOREIGN KEY"): + # Find name of the target FK field + m = re.match(r'FOREIGN KEY\s*\(([^\)]*)\).*', field_desc, re.I) + field_name = m.groups()[0].strip('"') + else: + field_name = field_desc.split()[0].strip('"') + + cursor.execute("SELECT sql FROM sqlite_master WHERE tbl_name = %s", [table]) + result = cursor.fetchall()[0] + other_table_results = result[0].strip() + li, ri = other_table_results.index('('), other_table_results.rindex(')') + other_table_results = other_table_results[li + 1:ri] + + for other_desc in other_table_results.split(','): + other_desc = other_desc.strip() + if other_desc.startswith('UNIQUE'): + continue + + other_name = other_desc.split(' ', 1)[0].strip('"') + if other_name == column: + relations[field_name] = (other_name, table) + break + + return relations + + def get_key_columns(self, cursor, table_name): + """ + Return a list of (column_name, referenced_table_name, referenced_column_name) + for all key columns in given table. + """ + key_columns = [] + + # Schema for this table + cursor.execute("SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %s", [table_name, "table"]) + results = cursor.fetchone()[0].strip() + results = results[results.index('(') + 1:results.rindex(')')] + + # Walk through and look for references to other tables. SQLite doesn't + # really have enforced references, but since it echoes out the SQL used + # to create the table we can look for REFERENCES statements used there. + for field_index, field_desc in enumerate(results.split(',')): + field_desc = field_desc.strip() + if field_desc.startswith("UNIQUE"): + continue + + m = re.search(r'"(.*)".*references (.*) \(["|](.*)["|]\)', field_desc, re.I) + if not m: + continue + + # This will append (column_name, referenced_table_name, referenced_column_name) to key_columns + key_columns.append(tuple(s.strip('"') for s in m.groups())) + + return key_columns + + def get_primary_key_column(self, cursor, table_name): + """Return the column name of the primary key for the given table.""" + # Don't use PRAGMA because that causes issues with some transactions + cursor.execute( + "SELECT sql, type FROM sqlite_master " + "WHERE tbl_name = %s AND type IN ('table', 'view')", + [table_name] + ) + row = cursor.fetchone() + if row is None: + raise ValueError("Table %s does not exist" % table_name) + create_sql, table_type = row + if table_type == 'view': + # Views don't have a primary key. + return None + fields_sql = create_sql[create_sql.index('(') + 1:create_sql.rindex(')')] + for field_desc in fields_sql.split(','): + field_desc = field_desc.strip() + m = re.match(r'(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*', field_desc) + if m: + return m.group(1) if m.group(1) else m.group(2) + return None + + def _table_info(self, cursor, name): + cursor.execute('PRAGMA table_info(%s)' % self.connection.ops.quote_name(name)) + # cid, name, type, notnull, default_value, pk + return [{ + 'name': field[1], + 'type': field[2], + 'size': get_field_size(field[2]), + 'null_ok': not field[3], + 'default': field[4], + 'pk': field[5], # undocumented + } for field in cursor.fetchall()] + + def _get_foreign_key_constraints(self, cursor, table_name): + constraints = {} + cursor.execute('PRAGMA foreign_key_list(%s)' % self.connection.ops.quote_name(table_name)) + for row in cursor.fetchall(): + # Remaining on_update/on_delete/match values are of no interest. + id_, _, table, from_, to = row[:5] + constraints['fk_%d' % id_] = { + 'columns': [from_], + 'primary_key': False, + 'unique': False, + 'foreign_key': (table, to), + 'check': False, + 'index': False, + } + return constraints + + def _parse_column_or_constraint_definition(self, tokens, columns): + token = None + is_constraint_definition = None + field_name = None + constraint_name = None + unique = False + unique_columns = [] + check = False + check_columns = [] + braces_deep = 0 + for token in tokens: + if token.match(sqlparse.tokens.Punctuation, '('): + braces_deep += 1 + elif token.match(sqlparse.tokens.Punctuation, ')'): + braces_deep -= 1 + if braces_deep < 0: + # End of columns and constraints for table definition. + break + elif braces_deep == 0 and token.match(sqlparse.tokens.Punctuation, ','): + # End of current column or constraint definition. + break + # Detect column or constraint definition by first token. + if is_constraint_definition is None: + is_constraint_definition = token.match(sqlparse.tokens.Keyword, 'CONSTRAINT') + if is_constraint_definition: + continue + if is_constraint_definition: + # Detect constraint name by second token. + if constraint_name is None: + if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): + constraint_name = token.value + elif token.ttype == sqlparse.tokens.Literal.String.Symbol: + constraint_name = token.value[1:-1] + # Start constraint columns parsing after UNIQUE keyword. + if token.match(sqlparse.tokens.Keyword, 'UNIQUE'): + unique = True + unique_braces_deep = braces_deep + elif unique: + if unique_braces_deep == braces_deep: + if unique_columns: + # Stop constraint parsing. + unique = False + continue + if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): + unique_columns.append(token.value) + elif token.ttype == sqlparse.tokens.Literal.String.Symbol: + unique_columns.append(token.value[1:-1]) + else: + # Detect field name by first token. + if field_name is None: + if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): + field_name = token.value + elif token.ttype == sqlparse.tokens.Literal.String.Symbol: + field_name = token.value[1:-1] + if token.match(sqlparse.tokens.Keyword, 'UNIQUE'): + unique_columns = [field_name] + # Start constraint columns parsing after CHECK keyword. + if token.match(sqlparse.tokens.Keyword, 'CHECK'): + check = True + check_braces_deep = braces_deep + elif check: + if check_braces_deep == braces_deep: + if check_columns: + # Stop constraint parsing. + check = False + continue + if token.ttype in (sqlparse.tokens.Name, sqlparse.tokens.Keyword): + if token.value in columns: + check_columns.append(token.value) + elif token.ttype == sqlparse.tokens.Literal.String.Symbol: + if token.value[1:-1] in columns: + check_columns.append(token.value[1:-1]) + unique_constraint = { + 'unique': True, + 'columns': unique_columns, + 'primary_key': False, + 'foreign_key': None, + 'check': False, + 'index': False, + } if unique_columns else None + check_constraint = { + 'check': True, + 'columns': check_columns, + 'primary_key': False, + 'unique': False, + 'foreign_key': None, + 'index': False, + } if check_columns else None + return constraint_name, unique_constraint, check_constraint, token + + def _parse_table_constraints(self, sql, columns): + # Check constraint parsing is based of SQLite syntax diagram. + # https://www.sqlite.org/syntaxdiagrams.html#table-constraint + statement = sqlparse.parse(sql)[0] + constraints = {} + unnamed_constrains_index = 0 + tokens = (token for token in statement.flatten() if not token.is_whitespace) + # Go to columns and constraint definition + for token in tokens: + if token.match(sqlparse.tokens.Punctuation, '('): + break + # Parse columns and constraint definition + while True: + constraint_name, unique, check, end_token = self._parse_column_or_constraint_definition(tokens, columns) + if unique: + if constraint_name: + constraints[constraint_name] = unique + else: + unnamed_constrains_index += 1 + constraints['__unnamed_constraint_%s__' % unnamed_constrains_index] = unique + if check: + if constraint_name: + constraints[constraint_name] = check + else: + unnamed_constrains_index += 1 + constraints['__unnamed_constraint_%s__' % unnamed_constrains_index] = check + if end_token.match(sqlparse.tokens.Punctuation, ')'): + break + return constraints + + def get_constraints(self, cursor, table_name): + """ + Retrieve any constraints or keys (unique, pk, fk, check, index) across + one or more columns. + """ + constraints = {} + # Find inline check constraints. + try: + table_schema = cursor.execute( + "SELECT sql FROM sqlite_master WHERE type='table' and name=%s" % ( + self.connection.ops.quote_name(table_name), + ) + ).fetchone()[0] + except TypeError: + # table_name is a view. + pass + else: + columns = {info.name for info in self.get_table_description(cursor, table_name)} + constraints.update(self._parse_table_constraints(table_schema, columns)) + + # Get the index info + cursor.execute("PRAGMA index_list(%s)" % self.connection.ops.quote_name(table_name)) + for row in cursor.fetchall(): + # SQLite 3.8.9+ has 5 columns, however older versions only give 3 + # columns. Discard last 2 columns if there. + number, index, unique = row[:3] + cursor.execute( + "SELECT sql FROM sqlite_master " + "WHERE type='index' AND name=%s" % self.connection.ops.quote_name(index) + ) + # There's at most one row. + sql, = cursor.fetchone() or (None,) + # Inline constraints are already detected in + # _parse_table_constraints(). The reasons to avoid fetching inline + # constraints from `PRAGMA index_list` are: + # - Inline constraints can have a different name and information + # than what `PRAGMA index_list` gives. + # - Not all inline constraints may appear in `PRAGMA index_list`. + if not sql: + # An inline constraint + continue + # Get the index info for that index + cursor.execute('PRAGMA index_info(%s)' % self.connection.ops.quote_name(index)) + for index_rank, column_rank, column in cursor.fetchall(): + if index not in constraints: + constraints[index] = { + "columns": [], + "primary_key": False, + "unique": bool(unique), + "foreign_key": None, + "check": False, + "index": True, + } + constraints[index]['columns'].append(column) + # Add type and column orders for indexes + if constraints[index]['index'] and not constraints[index]['unique']: + # SQLite doesn't support any index type other than b-tree + constraints[index]['type'] = Index.suffix + order_info = sql.split('(')[-1].split(')')[0].split(',') + orders = ['DESC' if info.endswith('DESC') else 'ASC' for info in order_info] + constraints[index]['orders'] = orders + # Get the PK + pk_column = self.get_primary_key_column(cursor, table_name) + if pk_column: + # SQLite doesn't actually give a name to the PK constraint, + # so we invent one. This is fine, as the SQLite backend never + # deletes PK constraints by name, as you can't delete constraints + # in SQLite; we remake the table with a new PK instead. + constraints["__primary__"] = { + "columns": [pk_column], + "primary_key": True, + "unique": False, # It's not actually a unique constraint. + "foreign_key": None, + "check": False, + "index": False, + } + constraints.update(self._get_foreign_key_constraints(cursor, table_name)) + return constraints diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/__init__.py b/venv/lib/python3.7/site-packages/django/db/migrations/__init__.py new file mode 100644 index 0000000..e7f3d2d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/__init__.py @@ -0,0 +1,2 @@ +from .migration import Migration, swappable_dependency # NOQA +from .operations import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/autodetector.py b/venv/lib/python3.7/site-packages/django/db/migrations/autodetector.py new file mode 100644 index 0000000..0dc1c77 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/autodetector.py @@ -0,0 +1,1320 @@ +import functools +import re +from itertools import chain + +from django.conf import settings +from django.db import models +from django.db.migrations import operations +from django.db.migrations.migration import Migration +from django.db.migrations.operations.models import AlterModelOptions +from django.db.migrations.optimizer import MigrationOptimizer +from django.db.migrations.questioner import MigrationQuestioner +from django.db.migrations.utils import ( + COMPILED_REGEX_TYPE, RegexObject, get_migration_name_timestamp, +) +from django.utils.topological_sort import stable_topological_sort + + +class MigrationAutodetector: + """ + Take a pair of ProjectStates and compare them to see what the first would + need doing to make it match the second (the second usually being the + project's current state). + + Note that this naturally operates on entire projects at a time, + as it's likely that changes interact (for example, you can't + add a ForeignKey without having a migration to add the table it + depends on first). A user interface may offer single-app usage + if it wishes, with the caveat that it may not always be possible. + """ + + def __init__(self, from_state, to_state, questioner=None): + self.from_state = from_state + self.to_state = to_state + self.questioner = questioner or MigrationQuestioner() + self.existing_apps = {app for app, model in from_state.models} + + def changes(self, graph, trim_to_apps=None, convert_apps=None, migration_name=None): + """ + Main entry point to produce a list of applicable changes. + Take a graph to base names on and an optional set of apps + to try and restrict to (restriction is not guaranteed) + """ + changes = self._detect_changes(convert_apps, graph) + changes = self.arrange_for_graph(changes, graph, migration_name) + if trim_to_apps: + changes = self._trim_to_apps(changes, trim_to_apps) + return changes + + def deep_deconstruct(self, obj): + """ + Recursive deconstruction for a field and its arguments. + Used for full comparison for rename/alter; sometimes a single-level + deconstruction will not compare correctly. + """ + if isinstance(obj, list): + return [self.deep_deconstruct(value) for value in obj] + elif isinstance(obj, tuple): + return tuple(self.deep_deconstruct(value) for value in obj) + elif isinstance(obj, dict): + return { + key: self.deep_deconstruct(value) + for key, value in obj.items() + } + elif isinstance(obj, functools.partial): + return (obj.func, self.deep_deconstruct(obj.args), self.deep_deconstruct(obj.keywords)) + elif isinstance(obj, COMPILED_REGEX_TYPE): + return RegexObject(obj) + elif isinstance(obj, type): + # If this is a type that implements 'deconstruct' as an instance method, + # avoid treating this as being deconstructible itself - see #22951 + return obj + elif hasattr(obj, 'deconstruct'): + deconstructed = obj.deconstruct() + if isinstance(obj, models.Field): + # we have a field which also returns a name + deconstructed = deconstructed[1:] + path, args, kwargs = deconstructed + return ( + path, + [self.deep_deconstruct(value) for value in args], + { + key: self.deep_deconstruct(value) + for key, value in kwargs.items() + }, + ) + else: + return obj + + def only_relation_agnostic_fields(self, fields): + """ + Return a definition of the fields that ignores field names and + what related fields actually relate to. Used for detecting renames (as, + of course, the related fields change during renames). + """ + fields_def = [] + for name, field in sorted(fields): + deconstruction = self.deep_deconstruct(field) + if field.remote_field and field.remote_field.model: + del deconstruction[2]['to'] + fields_def.append(deconstruction) + return fields_def + + def _detect_changes(self, convert_apps=None, graph=None): + """ + Return a dict of migration plans which will achieve the + change from from_state to to_state. The dict has app labels + as keys and a list of migrations as values. + + The resulting migrations aren't specially named, but the names + do matter for dependencies inside the set. + + convert_apps is the list of apps to convert to use migrations + (i.e. to make initial migrations for, in the usual case) + + graph is an optional argument that, if provided, can help improve + dependency generation and avoid potential circular dependencies. + """ + # The first phase is generating all the operations for each app + # and gathering them into a big per-app list. + # Then go through that list, order it, and split into migrations to + # resolve dependencies caused by M2Ms and FKs. + self.generated_operations = {} + self.altered_indexes = {} + self.altered_constraints = {} + + # Prepare some old/new state and model lists, separating + # proxy models and ignoring unmigrated apps. + self.old_apps = self.from_state.concrete_apps + self.new_apps = self.to_state.apps + self.old_model_keys = set() + self.old_proxy_keys = set() + self.old_unmanaged_keys = set() + self.new_model_keys = set() + self.new_proxy_keys = set() + self.new_unmanaged_keys = set() + for al, mn in self.from_state.models: + model = self.old_apps.get_model(al, mn) + if not model._meta.managed: + self.old_unmanaged_keys.add((al, mn)) + elif al not in self.from_state.real_apps: + if model._meta.proxy: + self.old_proxy_keys.add((al, mn)) + else: + self.old_model_keys.add((al, mn)) + + for al, mn in self.to_state.models: + model = self.new_apps.get_model(al, mn) + if not model._meta.managed: + self.new_unmanaged_keys.add((al, mn)) + elif ( + al not in self.from_state.real_apps or + (convert_apps and al in convert_apps) + ): + if model._meta.proxy: + self.new_proxy_keys.add((al, mn)) + else: + self.new_model_keys.add((al, mn)) + + # Renames have to come first + self.generate_renamed_models() + + # Prepare lists of fields and generate through model map + self._prepare_field_lists() + self._generate_through_model_map() + + # Generate non-rename model operations + self.generate_deleted_models() + self.generate_created_models() + self.generate_deleted_proxies() + self.generate_created_proxies() + self.generate_altered_options() + self.generate_altered_managers() + + # Create the altered indexes and store them in self.altered_indexes. + # This avoids the same computation in generate_removed_indexes() + # and generate_added_indexes(). + self.create_altered_indexes() + self.create_altered_constraints() + # Generate index removal operations before field is removed + self.generate_removed_constraints() + self.generate_removed_indexes() + # Generate field operations + self.generate_renamed_fields() + self.generate_removed_fields() + self.generate_added_fields() + self.generate_altered_fields() + self.generate_altered_unique_together() + self.generate_altered_index_together() + self.generate_added_indexes() + self.generate_added_constraints() + self.generate_altered_db_table() + self.generate_altered_order_with_respect_to() + + self._sort_migrations() + self._build_migration_list(graph) + self._optimize_migrations() + + return self.migrations + + def _prepare_field_lists(self): + """ + Prepare field lists and a list of the fields that used through models + in the old state so dependencies can be made from the through model + deletion to the field that uses it. + """ + self.kept_model_keys = self.old_model_keys & self.new_model_keys + self.kept_proxy_keys = self.old_proxy_keys & self.new_proxy_keys + self.kept_unmanaged_keys = self.old_unmanaged_keys & self.new_unmanaged_keys + self.through_users = {} + self.old_field_keys = { + (app_label, model_name, x) + for app_label, model_name in self.kept_model_keys + for x, y in self.from_state.models[ + app_label, + self.renamed_models.get((app_label, model_name), model_name) + ].fields + } + self.new_field_keys = { + (app_label, model_name, x) + for app_label, model_name in self.kept_model_keys + for x, y in self.to_state.models[app_label, model_name].fields + } + + def _generate_through_model_map(self): + """Through model map generation.""" + for app_label, model_name in sorted(self.old_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + for field_name, field in old_model_state.fields: + old_field = self.old_apps.get_model(app_label, old_model_name)._meta.get_field(field_name) + if (hasattr(old_field, "remote_field") and getattr(old_field.remote_field, "through", None) and + not old_field.remote_field.through._meta.auto_created): + through_key = ( + old_field.remote_field.through._meta.app_label, + old_field.remote_field.through._meta.model_name, + ) + self.through_users[through_key] = (app_label, old_model_name, field_name) + + @staticmethod + def _resolve_dependency(dependency): + """ + Return the resolved dependency and a boolean denoting whether or not + it was swappable. + """ + if dependency[0] != '__setting__': + return dependency, False + resolved_app_label, resolved_object_name = getattr(settings, dependency[1]).split('.') + return (resolved_app_label, resolved_object_name.lower()) + dependency[2:], True + + def _build_migration_list(self, graph=None): + """ + Chop the lists of operations up into migrations with dependencies on + each other. Do this by going through an app's list of operations until + one is found that has an outgoing dependency that isn't in another + app's migration yet (hasn't been chopped off its list). Then chop off + the operations before it into a migration and move onto the next app. + If the loops completes without doing anything, there's a circular + dependency (which _should_ be impossible as the operations are + all split at this point so they can't depend and be depended on). + """ + self.migrations = {} + num_ops = sum(len(x) for x in self.generated_operations.values()) + chop_mode = False + while num_ops: + # On every iteration, we step through all the apps and see if there + # is a completed set of operations. + # If we find that a subset of the operations are complete we can + # try to chop it off from the rest and continue, but we only + # do this if we've already been through the list once before + # without any chopping and nothing has changed. + for app_label in sorted(self.generated_operations): + chopped = [] + dependencies = set() + for operation in list(self.generated_operations[app_label]): + deps_satisfied = True + operation_dependencies = set() + for dep in operation._auto_deps: + # Temporarily resolve the swappable dependency to + # prevent circular references. While keeping the + # dependency checks on the resolved model, add the + # swappable dependencies. + original_dep = dep + dep, is_swappable_dep = self._resolve_dependency(dep) + if dep[0] != app_label: + # External app dependency. See if it's not yet + # satisfied. + for other_operation in self.generated_operations.get(dep[0], []): + if self.check_dependency(other_operation, dep): + deps_satisfied = False + break + if not deps_satisfied: + break + else: + if is_swappable_dep: + operation_dependencies.add((original_dep[0], original_dep[1])) + elif dep[0] in self.migrations: + operation_dependencies.add((dep[0], self.migrations[dep[0]][-1].name)) + else: + # If we can't find the other app, we add a first/last dependency, + # but only if we've already been through once and checked everything + if chop_mode: + # If the app already exists, we add a dependency on the last migration, + # as we don't know which migration contains the target field. + # If it's not yet migrated or has no migrations, we use __first__ + if graph and graph.leaf_nodes(dep[0]): + operation_dependencies.add(graph.leaf_nodes(dep[0])[0]) + else: + operation_dependencies.add((dep[0], "__first__")) + else: + deps_satisfied = False + if deps_satisfied: + chopped.append(operation) + dependencies.update(operation_dependencies) + del self.generated_operations[app_label][0] + else: + break + # Make a migration! Well, only if there's stuff to put in it + if dependencies or chopped: + if not self.generated_operations[app_label] or chop_mode: + subclass = type("Migration", (Migration,), {"operations": [], "dependencies": []}) + instance = subclass("auto_%i" % (len(self.migrations.get(app_label, [])) + 1), app_label) + instance.dependencies = list(dependencies) + instance.operations = chopped + instance.initial = app_label not in self.existing_apps + self.migrations.setdefault(app_label, []).append(instance) + chop_mode = False + else: + self.generated_operations[app_label] = chopped + self.generated_operations[app_label] + new_num_ops = sum(len(x) for x in self.generated_operations.values()) + if new_num_ops == num_ops: + if not chop_mode: + chop_mode = True + else: + raise ValueError("Cannot resolve operation dependencies: %r" % self.generated_operations) + num_ops = new_num_ops + + def _sort_migrations(self): + """ + Reorder to make things possible. Reordering may be needed so FKs work + nicely inside the same app. + """ + for app_label, ops in sorted(self.generated_operations.items()): + # construct a dependency graph for intra-app dependencies + dependency_graph = {op: set() for op in ops} + for op in ops: + for dep in op._auto_deps: + # Resolve intra-app dependencies to handle circular + # references involving a swappable model. + dep = self._resolve_dependency(dep)[0] + if dep[0] == app_label: + for op2 in ops: + if self.check_dependency(op2, dep): + dependency_graph[op].add(op2) + + # we use a stable sort for deterministic tests & general behavior + self.generated_operations[app_label] = stable_topological_sort(ops, dependency_graph) + + def _optimize_migrations(self): + # Add in internal dependencies among the migrations + for app_label, migrations in self.migrations.items(): + for m1, m2 in zip(migrations, migrations[1:]): + m2.dependencies.append((app_label, m1.name)) + + # De-dupe dependencies + for migrations in self.migrations.values(): + for migration in migrations: + migration.dependencies = list(set(migration.dependencies)) + + # Optimize migrations + for app_label, migrations in self.migrations.items(): + for migration in migrations: + migration.operations = MigrationOptimizer().optimize(migration.operations, app_label=app_label) + + def check_dependency(self, operation, dependency): + """ + Return True if the given operation depends on the given dependency, + False otherwise. + """ + # Created model + if dependency[2] is None and dependency[3] is True: + return ( + isinstance(operation, operations.CreateModel) and + operation.name_lower == dependency[1].lower() + ) + # Created field + elif dependency[2] is not None and dependency[3] is True: + return ( + ( + isinstance(operation, operations.CreateModel) and + operation.name_lower == dependency[1].lower() and + any(dependency[2] == x for x, y in operation.fields) + ) or + ( + isinstance(operation, operations.AddField) and + operation.model_name_lower == dependency[1].lower() and + operation.name_lower == dependency[2].lower() + ) + ) + # Removed field + elif dependency[2] is not None and dependency[3] is False: + return ( + isinstance(operation, operations.RemoveField) and + operation.model_name_lower == dependency[1].lower() and + operation.name_lower == dependency[2].lower() + ) + # Removed model + elif dependency[2] is None and dependency[3] is False: + return ( + isinstance(operation, operations.DeleteModel) and + operation.name_lower == dependency[1].lower() + ) + # Field being altered + elif dependency[2] is not None and dependency[3] == "alter": + return ( + isinstance(operation, operations.AlterField) and + operation.model_name_lower == dependency[1].lower() and + operation.name_lower == dependency[2].lower() + ) + # order_with_respect_to being unset for a field + elif dependency[2] is not None and dependency[3] == "order_wrt_unset": + return ( + isinstance(operation, operations.AlterOrderWithRespectTo) and + operation.name_lower == dependency[1].lower() and + (operation.order_with_respect_to or "").lower() != dependency[2].lower() + ) + # Field is removed and part of an index/unique_together + elif dependency[2] is not None and dependency[3] == "foo_together_change": + return ( + isinstance(operation, (operations.AlterUniqueTogether, + operations.AlterIndexTogether)) and + operation.name_lower == dependency[1].lower() + ) + # Unknown dependency. Raise an error. + else: + raise ValueError("Can't handle dependency %r" % (dependency,)) + + def add_operation(self, app_label, operation, dependencies=None, beginning=False): + # Dependencies are (app_label, model_name, field_name, create/delete as True/False) + operation._auto_deps = dependencies or [] + if beginning: + self.generated_operations.setdefault(app_label, []).insert(0, operation) + else: + self.generated_operations.setdefault(app_label, []).append(operation) + + def swappable_first_key(self, item): + """ + Place potential swappable models first in lists of created models (only + real way to solve #22783). + """ + try: + model = self.new_apps.get_model(item[0], item[1]) + base_names = [base.__name__ for base in model.__bases__] + string_version = "%s.%s" % (item[0], item[1]) + if ( + model._meta.swappable or + "AbstractUser" in base_names or + "AbstractBaseUser" in base_names or + settings.AUTH_USER_MODEL.lower() == string_version.lower() + ): + return ("___" + item[0], "___" + item[1]) + except LookupError: + pass + return item + + def generate_renamed_models(self): + """ + Find any renamed models, generate the operations for them, and remove + the old entry from the model lists. Must be run before other + model-level generation. + """ + self.renamed_models = {} + self.renamed_models_rel = {} + added_models = self.new_model_keys - self.old_model_keys + for app_label, model_name in sorted(added_models): + model_state = self.to_state.models[app_label, model_name] + model_fields_def = self.only_relation_agnostic_fields(model_state.fields) + + removed_models = self.old_model_keys - self.new_model_keys + for rem_app_label, rem_model_name in removed_models: + if rem_app_label == app_label: + rem_model_state = self.from_state.models[rem_app_label, rem_model_name] + rem_model_fields_def = self.only_relation_agnostic_fields(rem_model_state.fields) + if model_fields_def == rem_model_fields_def: + if self.questioner.ask_rename_model(rem_model_state, model_state): + model_opts = self.new_apps.get_model(app_label, model_name)._meta + dependencies = [] + for field in model_opts.get_fields(): + if field.is_relation: + dependencies.extend(self._get_dependencies_for_foreign_key(field)) + self.add_operation( + app_label, + operations.RenameModel( + old_name=rem_model_state.name, + new_name=model_state.name, + ), + dependencies=dependencies, + ) + self.renamed_models[app_label, model_name] = rem_model_name + renamed_models_rel_key = '%s.%s' % (rem_model_state.app_label, rem_model_state.name) + self.renamed_models_rel[renamed_models_rel_key] = '%s.%s' % ( + model_state.app_label, + model_state.name, + ) + self.old_model_keys.remove((rem_app_label, rem_model_name)) + self.old_model_keys.add((app_label, model_name)) + break + + def generate_created_models(self): + """ + Find all new models (both managed and unmanaged) and make create + operations for them as well as separate operations to create any + foreign key or M2M relationships (these are optimized later, if + possible). + + Defer any model options that refer to collections of fields that might + be deferred (e.g. unique_together, index_together). + """ + old_keys = self.old_model_keys | self.old_unmanaged_keys + added_models = self.new_model_keys - old_keys + added_unmanaged_models = self.new_unmanaged_keys - old_keys + all_added_models = chain( + sorted(added_models, key=self.swappable_first_key, reverse=True), + sorted(added_unmanaged_models, key=self.swappable_first_key, reverse=True) + ) + for app_label, model_name in all_added_models: + model_state = self.to_state.models[app_label, model_name] + model_opts = self.new_apps.get_model(app_label, model_name)._meta + # Gather related fields + related_fields = {} + primary_key_rel = None + for field in model_opts.local_fields: + if field.remote_field: + if field.remote_field.model: + if field.primary_key: + primary_key_rel = field.remote_field.model + elif not field.remote_field.parent_link: + related_fields[field.name] = field + # through will be none on M2Ms on swapped-out models; + # we can treat lack of through as auto_created=True, though. + if (getattr(field.remote_field, "through", None) and + not field.remote_field.through._meta.auto_created): + related_fields[field.name] = field + for field in model_opts.local_many_to_many: + if field.remote_field.model: + related_fields[field.name] = field + if getattr(field.remote_field, "through", None) and not field.remote_field.through._meta.auto_created: + related_fields[field.name] = field + # Are there indexes/unique|index_together to defer? + indexes = model_state.options.pop('indexes') + constraints = model_state.options.pop('constraints') + unique_together = model_state.options.pop('unique_together', None) + index_together = model_state.options.pop('index_together', None) + order_with_respect_to = model_state.options.pop('order_with_respect_to', None) + # Depend on the deletion of any possible proxy version of us + dependencies = [ + (app_label, model_name, None, False), + ] + # Depend on all bases + for base in model_state.bases: + if isinstance(base, str) and "." in base: + base_app_label, base_name = base.split(".", 1) + dependencies.append((base_app_label, base_name, None, True)) + # Depend on the other end of the primary key if it's a relation + if primary_key_rel: + dependencies.append(( + primary_key_rel._meta.app_label, + primary_key_rel._meta.object_name, + None, + True + )) + # Generate creation operation + self.add_operation( + app_label, + operations.CreateModel( + name=model_state.name, + fields=[d for d in model_state.fields if d[0] not in related_fields], + options=model_state.options, + bases=model_state.bases, + managers=model_state.managers, + ), + dependencies=dependencies, + beginning=True, + ) + + # Don't add operations which modify the database for unmanaged models + if not model_opts.managed: + continue + + # Generate operations for each related field + for name, field in sorted(related_fields.items()): + dependencies = self._get_dependencies_for_foreign_key(field) + # Depend on our own model being created + dependencies.append((app_label, model_name, None, True)) + # Make operation + self.add_operation( + app_label, + operations.AddField( + model_name=model_name, + name=name, + field=field, + ), + dependencies=list(set(dependencies)), + ) + # Generate other opns + related_dependencies = [ + (app_label, model_name, name, True) + for name in sorted(related_fields) + ] + related_dependencies.append((app_label, model_name, None, True)) + for index in indexes: + self.add_operation( + app_label, + operations.AddIndex( + model_name=model_name, + index=index, + ), + dependencies=related_dependencies, + ) + for constraint in constraints: + self.add_operation( + app_label, + operations.AddConstraint( + model_name=model_name, + constraint=constraint, + ), + dependencies=related_dependencies, + ) + if unique_together: + self.add_operation( + app_label, + operations.AlterUniqueTogether( + name=model_name, + unique_together=unique_together, + ), + dependencies=related_dependencies + ) + if index_together: + self.add_operation( + app_label, + operations.AlterIndexTogether( + name=model_name, + index_together=index_together, + ), + dependencies=related_dependencies + ) + if order_with_respect_to: + self.add_operation( + app_label, + operations.AlterOrderWithRespectTo( + name=model_name, + order_with_respect_to=order_with_respect_to, + ), + dependencies=[ + (app_label, model_name, order_with_respect_to, True), + (app_label, model_name, None, True), + ] + ) + + # Fix relationships if the model changed from a proxy model to a + # concrete model. + if (app_label, model_name) in self.old_proxy_keys: + for related_object in model_opts.related_objects: + self.add_operation( + related_object.related_model._meta.app_label, + operations.AlterField( + model_name=related_object.related_model._meta.object_name, + name=related_object.field.name, + field=related_object.field, + ), + dependencies=[(app_label, model_name, None, True)], + ) + + def generate_created_proxies(self): + """ + Make CreateModel statements for proxy models. Use the same statements + as that way there's less code duplication, but of course for proxy + models it's safe to skip all the pointless field stuff and just chuck + out an operation. + """ + added = self.new_proxy_keys - self.old_proxy_keys + for app_label, model_name in sorted(added): + model_state = self.to_state.models[app_label, model_name] + assert model_state.options.get("proxy") + # Depend on the deletion of any possible non-proxy version of us + dependencies = [ + (app_label, model_name, None, False), + ] + # Depend on all bases + for base in model_state.bases: + if isinstance(base, str) and "." in base: + base_app_label, base_name = base.split(".", 1) + dependencies.append((base_app_label, base_name, None, True)) + # Generate creation operation + self.add_operation( + app_label, + operations.CreateModel( + name=model_state.name, + fields=[], + options=model_state.options, + bases=model_state.bases, + managers=model_state.managers, + ), + # Depend on the deletion of any possible non-proxy version of us + dependencies=dependencies, + ) + + def generate_deleted_models(self): + """ + Find all deleted models (managed and unmanaged) and make delete + operations for them as well as separate operations to delete any + foreign key or M2M relationships (these are optimized later, if + possible). + + Also bring forward removal of any model options that refer to + collections of fields - the inverse of generate_created_models(). + """ + new_keys = self.new_model_keys | self.new_unmanaged_keys + deleted_models = self.old_model_keys - new_keys + deleted_unmanaged_models = self.old_unmanaged_keys - new_keys + all_deleted_models = chain(sorted(deleted_models), sorted(deleted_unmanaged_models)) + for app_label, model_name in all_deleted_models: + model_state = self.from_state.models[app_label, model_name] + model = self.old_apps.get_model(app_label, model_name) + # Gather related fields + related_fields = {} + for field in model._meta.local_fields: + if field.remote_field: + if field.remote_field.model: + related_fields[field.name] = field + # through will be none on M2Ms on swapped-out models; + # we can treat lack of through as auto_created=True, though. + if (getattr(field.remote_field, "through", None) and + not field.remote_field.through._meta.auto_created): + related_fields[field.name] = field + for field in model._meta.local_many_to_many: + if field.remote_field.model: + related_fields[field.name] = field + if getattr(field.remote_field, "through", None) and not field.remote_field.through._meta.auto_created: + related_fields[field.name] = field + # Generate option removal first + unique_together = model_state.options.pop('unique_together', None) + index_together = model_state.options.pop('index_together', None) + if unique_together: + self.add_operation( + app_label, + operations.AlterUniqueTogether( + name=model_name, + unique_together=None, + ) + ) + if index_together: + self.add_operation( + app_label, + operations.AlterIndexTogether( + name=model_name, + index_together=None, + ) + ) + # Then remove each related field + for name in sorted(related_fields): + self.add_operation( + app_label, + operations.RemoveField( + model_name=model_name, + name=name, + ) + ) + # Finally, remove the model. + # This depends on both the removal/alteration of all incoming fields + # and the removal of all its own related fields, and if it's + # a through model the field that references it. + dependencies = [] + for related_object in model._meta.related_objects: + related_object_app_label = related_object.related_model._meta.app_label + object_name = related_object.related_model._meta.object_name + field_name = related_object.field.name + dependencies.append((related_object_app_label, object_name, field_name, False)) + if not related_object.many_to_many: + dependencies.append((related_object_app_label, object_name, field_name, "alter")) + + for name in sorted(related_fields): + dependencies.append((app_label, model_name, name, False)) + # We're referenced in another field's through= + through_user = self.through_users.get((app_label, model_state.name_lower)) + if through_user: + dependencies.append((through_user[0], through_user[1], through_user[2], False)) + # Finally, make the operation, deduping any dependencies + self.add_operation( + app_label, + operations.DeleteModel( + name=model_state.name, + ), + dependencies=list(set(dependencies)), + ) + + def generate_deleted_proxies(self): + """Make DeleteModel options for proxy models.""" + deleted = self.old_proxy_keys - self.new_proxy_keys + for app_label, model_name in sorted(deleted): + model_state = self.from_state.models[app_label, model_name] + assert model_state.options.get("proxy") + self.add_operation( + app_label, + operations.DeleteModel( + name=model_state.name, + ), + ) + + def generate_renamed_fields(self): + """Work out renamed fields.""" + self.renamed_fields = {} + for app_label, model_name, field_name in sorted(self.new_field_keys - self.old_field_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + field = self.new_apps.get_model(app_label, model_name)._meta.get_field(field_name) + # Scan to see if this is actually a rename! + field_dec = self.deep_deconstruct(field) + for rem_app_label, rem_model_name, rem_field_name in sorted(self.old_field_keys - self.new_field_keys): + if rem_app_label == app_label and rem_model_name == model_name: + old_field = old_model_state.get_field_by_name(rem_field_name) + old_field_dec = self.deep_deconstruct(old_field) + if field.remote_field and field.remote_field.model and 'to' in old_field_dec[2]: + old_rel_to = old_field_dec[2]['to'] + if old_rel_to in self.renamed_models_rel: + old_field_dec[2]['to'] = self.renamed_models_rel[old_rel_to] + old_field.set_attributes_from_name(rem_field_name) + old_db_column = old_field.get_attname_column()[1] + if (old_field_dec == field_dec or ( + # Was the field renamed and db_column equal to the + # old field's column added? + old_field_dec[0:2] == field_dec[0:2] and + dict(old_field_dec[2], db_column=old_db_column) == field_dec[2])): + if self.questioner.ask_rename(model_name, rem_field_name, field_name, field): + self.add_operation( + app_label, + operations.RenameField( + model_name=model_name, + old_name=rem_field_name, + new_name=field_name, + ) + ) + self.old_field_keys.remove((rem_app_label, rem_model_name, rem_field_name)) + self.old_field_keys.add((app_label, model_name, field_name)) + self.renamed_fields[app_label, model_name, field_name] = rem_field_name + break + + def generate_added_fields(self): + """Make AddField operations.""" + for app_label, model_name, field_name in sorted(self.new_field_keys - self.old_field_keys): + self._generate_added_field(app_label, model_name, field_name) + + def _generate_added_field(self, app_label, model_name, field_name): + field = self.new_apps.get_model(app_label, model_name)._meta.get_field(field_name) + # Fields that are foreignkeys/m2ms depend on stuff + dependencies = [] + if field.remote_field and field.remote_field.model: + dependencies.extend(self._get_dependencies_for_foreign_key(field)) + # You can't just add NOT NULL fields with no default or fields + # which don't allow empty strings as default. + time_fields = (models.DateField, models.DateTimeField, models.TimeField) + preserve_default = ( + field.null or field.has_default() or field.many_to_many or + (field.blank and field.empty_strings_allowed) or + (isinstance(field, time_fields) and field.auto_now) + ) + if not preserve_default: + field = field.clone() + if isinstance(field, time_fields) and field.auto_now_add: + field.default = self.questioner.ask_auto_now_add_addition(field_name, model_name) + else: + field.default = self.questioner.ask_not_null_addition(field_name, model_name) + self.add_operation( + app_label, + operations.AddField( + model_name=model_name, + name=field_name, + field=field, + preserve_default=preserve_default, + ), + dependencies=dependencies, + ) + + def generate_removed_fields(self): + """Make RemoveField operations.""" + for app_label, model_name, field_name in sorted(self.old_field_keys - self.new_field_keys): + self._generate_removed_field(app_label, model_name, field_name) + + def _generate_removed_field(self, app_label, model_name, field_name): + self.add_operation( + app_label, + operations.RemoveField( + model_name=model_name, + name=field_name, + ), + # We might need to depend on the removal of an + # order_with_respect_to or index/unique_together operation; + # this is safely ignored if there isn't one + dependencies=[ + (app_label, model_name, field_name, "order_wrt_unset"), + (app_label, model_name, field_name, "foo_together_change"), + ], + ) + + def generate_altered_fields(self): + """ + Make AlterField operations, or possibly RemovedField/AddField if alter + isn's possible. + """ + for app_label, model_name, field_name in sorted(self.old_field_keys & self.new_field_keys): + # Did the field change? + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_field_name = self.renamed_fields.get((app_label, model_name, field_name), field_name) + old_field = self.old_apps.get_model(app_label, old_model_name)._meta.get_field(old_field_name) + new_field = self.new_apps.get_model(app_label, model_name)._meta.get_field(field_name) + # Implement any model renames on relations; these are handled by RenameModel + # so we need to exclude them from the comparison + if hasattr(new_field, "remote_field") and getattr(new_field.remote_field, "model", None): + rename_key = ( + new_field.remote_field.model._meta.app_label, + new_field.remote_field.model._meta.model_name, + ) + if rename_key in self.renamed_models: + new_field.remote_field.model = old_field.remote_field.model + # Handle ForeignKey which can only have a single to_field. + remote_field_name = getattr(new_field.remote_field, 'field_name', None) + if remote_field_name: + to_field_rename_key = rename_key + (remote_field_name,) + if to_field_rename_key in self.renamed_fields: + new_field.remote_field.field_name = old_field.remote_field.field_name + # Handle ForeignObjects which can have multiple from_fields/to_fields. + from_fields = getattr(new_field, 'from_fields', None) + if from_fields: + from_rename_key = (app_label, model_name) + new_field.from_fields = tuple([ + self.renamed_fields.get(from_rename_key + (from_field,), from_field) + for from_field in from_fields + ]) + new_field.to_fields = tuple([ + self.renamed_fields.get(rename_key + (to_field,), to_field) + for to_field in new_field.to_fields + ]) + if hasattr(new_field, "remote_field") and getattr(new_field.remote_field, "through", None): + rename_key = ( + new_field.remote_field.through._meta.app_label, + new_field.remote_field.through._meta.model_name, + ) + if rename_key in self.renamed_models: + new_field.remote_field.through = old_field.remote_field.through + old_field_dec = self.deep_deconstruct(old_field) + new_field_dec = self.deep_deconstruct(new_field) + if old_field_dec != new_field_dec: + both_m2m = old_field.many_to_many and new_field.many_to_many + neither_m2m = not old_field.many_to_many and not new_field.many_to_many + if both_m2m or neither_m2m: + # Either both fields are m2m or neither is + preserve_default = True + if (old_field.null and not new_field.null and not new_field.has_default() and + not new_field.many_to_many): + field = new_field.clone() + new_default = self.questioner.ask_not_null_alteration(field_name, model_name) + if new_default is not models.NOT_PROVIDED: + field.default = new_default + preserve_default = False + else: + field = new_field + self.add_operation( + app_label, + operations.AlterField( + model_name=model_name, + name=field_name, + field=field, + preserve_default=preserve_default, + ) + ) + else: + # We cannot alter between m2m and concrete fields + self._generate_removed_field(app_label, model_name, field_name) + self._generate_added_field(app_label, model_name, field_name) + + def create_altered_indexes(self): + option_name = operations.AddIndex.option_name + for app_label, model_name in sorted(self.kept_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + + old_indexes = old_model_state.options[option_name] + new_indexes = new_model_state.options[option_name] + add_idx = [idx for idx in new_indexes if idx not in old_indexes] + rem_idx = [idx for idx in old_indexes if idx not in new_indexes] + + self.altered_indexes.update({ + (app_label, model_name): { + 'added_indexes': add_idx, 'removed_indexes': rem_idx, + } + }) + + def generate_added_indexes(self): + for (app_label, model_name), alt_indexes in self.altered_indexes.items(): + for index in alt_indexes['added_indexes']: + self.add_operation( + app_label, + operations.AddIndex( + model_name=model_name, + index=index, + ) + ) + + def generate_removed_indexes(self): + for (app_label, model_name), alt_indexes in self.altered_indexes.items(): + for index in alt_indexes['removed_indexes']: + self.add_operation( + app_label, + operations.RemoveIndex( + model_name=model_name, + name=index.name, + ) + ) + + def create_altered_constraints(self): + option_name = operations.AddConstraint.option_name + for app_label, model_name in sorted(self.kept_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + + old_constraints = old_model_state.options[option_name] + new_constraints = new_model_state.options[option_name] + add_constraints = [c for c in new_constraints if c not in old_constraints] + rem_constraints = [c for c in old_constraints if c not in new_constraints] + + self.altered_constraints.update({ + (app_label, model_name): { + 'added_constraints': add_constraints, 'removed_constraints': rem_constraints, + } + }) + + def generate_added_constraints(self): + for (app_label, model_name), alt_constraints in self.altered_constraints.items(): + for constraint in alt_constraints['added_constraints']: + self.add_operation( + app_label, + operations.AddConstraint( + model_name=model_name, + constraint=constraint, + ) + ) + + def generate_removed_constraints(self): + for (app_label, model_name), alt_constraints in self.altered_constraints.items(): + for constraint in alt_constraints['removed_constraints']: + self.add_operation( + app_label, + operations.RemoveConstraint( + model_name=model_name, + name=constraint.name, + ) + ) + + def _get_dependencies_for_foreign_key(self, field): + # Account for FKs to swappable models + swappable_setting = getattr(field, 'swappable_setting', None) + if swappable_setting is not None: + dep_app_label = "__setting__" + dep_object_name = swappable_setting + else: + dep_app_label = field.remote_field.model._meta.app_label + dep_object_name = field.remote_field.model._meta.object_name + dependencies = [(dep_app_label, dep_object_name, None, True)] + if getattr(field.remote_field, "through", None) and not field.remote_field.through._meta.auto_created: + dependencies.append(( + field.remote_field.through._meta.app_label, + field.remote_field.through._meta.object_name, + None, + True, + )) + return dependencies + + def _generate_altered_foo_together(self, operation): + option_name = operation.option_name + for app_label, model_name in sorted(self.kept_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + + # We run the old version through the field renames to account for those + old_value = old_model_state.options.get(option_name) + old_value = { + tuple( + self.renamed_fields.get((app_label, model_name, n), n) + for n in unique + ) + for unique in old_value + } if old_value else set() + + new_value = new_model_state.options.get(option_name) + new_value = set(new_value) if new_value else set() + + if old_value != new_value: + dependencies = [] + for foo_togethers in new_value: + for field_name in foo_togethers: + field = self.new_apps.get_model(app_label, model_name)._meta.get_field(field_name) + if field.remote_field and field.remote_field.model: + dependencies.extend(self._get_dependencies_for_foreign_key(field)) + + self.add_operation( + app_label, + operation( + name=model_name, + **{option_name: new_value} + ), + dependencies=dependencies, + ) + + def generate_altered_unique_together(self): + self._generate_altered_foo_together(operations.AlterUniqueTogether) + + def generate_altered_index_together(self): + self._generate_altered_foo_together(operations.AlterIndexTogether) + + def generate_altered_db_table(self): + models_to_check = self.kept_model_keys.union(self.kept_proxy_keys, self.kept_unmanaged_keys) + for app_label, model_name in sorted(models_to_check): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + old_db_table_name = old_model_state.options.get('db_table') + new_db_table_name = new_model_state.options.get('db_table') + if old_db_table_name != new_db_table_name: + self.add_operation( + app_label, + operations.AlterModelTable( + name=model_name, + table=new_db_table_name, + ) + ) + + def generate_altered_options(self): + """ + Work out if any non-schema-affecting options have changed and make an + operation to represent them in state changes (in case Python code in + migrations needs them). + """ + models_to_check = self.kept_model_keys.union( + self.kept_proxy_keys, + self.kept_unmanaged_keys, + # unmanaged converted to managed + self.old_unmanaged_keys & self.new_model_keys, + # managed converted to unmanaged + self.old_model_keys & self.new_unmanaged_keys, + ) + + for app_label, model_name in sorted(models_to_check): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + old_options = { + key: value for key, value in old_model_state.options.items() + if key in AlterModelOptions.ALTER_OPTION_KEYS + } + new_options = { + key: value for key, value in new_model_state.options.items() + if key in AlterModelOptions.ALTER_OPTION_KEYS + } + if old_options != new_options: + self.add_operation( + app_label, + operations.AlterModelOptions( + name=model_name, + options=new_options, + ) + ) + + def generate_altered_order_with_respect_to(self): + for app_label, model_name in sorted(self.kept_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + if (old_model_state.options.get("order_with_respect_to") != + new_model_state.options.get("order_with_respect_to")): + # Make sure it comes second if we're adding + # (removal dependency is part of RemoveField) + dependencies = [] + if new_model_state.options.get("order_with_respect_to"): + dependencies.append(( + app_label, + model_name, + new_model_state.options["order_with_respect_to"], + True, + )) + # Actually generate the operation + self.add_operation( + app_label, + operations.AlterOrderWithRespectTo( + name=model_name, + order_with_respect_to=new_model_state.options.get('order_with_respect_to'), + ), + dependencies=dependencies, + ) + + def generate_altered_managers(self): + for app_label, model_name in sorted(self.kept_model_keys): + old_model_name = self.renamed_models.get((app_label, model_name), model_name) + old_model_state = self.from_state.models[app_label, old_model_name] + new_model_state = self.to_state.models[app_label, model_name] + if old_model_state.managers != new_model_state.managers: + self.add_operation( + app_label, + operations.AlterModelManagers( + name=model_name, + managers=new_model_state.managers, + ) + ) + + def arrange_for_graph(self, changes, graph, migration_name=None): + """ + Take a result from changes() and a MigrationGraph, and fix the names + and dependencies of the changes so they extend the graph from the leaf + nodes for each app. + """ + leaves = graph.leaf_nodes() + name_map = {} + for app_label, migrations in list(changes.items()): + if not migrations: + continue + # Find the app label's current leaf node + app_leaf = None + for leaf in leaves: + if leaf[0] == app_label: + app_leaf = leaf + break + # Do they want an initial migration for this app? + if app_leaf is None and not self.questioner.ask_initial(app_label): + # They don't. + for migration in migrations: + name_map[(app_label, migration.name)] = (app_label, "__first__") + del changes[app_label] + continue + # Work out the next number in the sequence + if app_leaf is None: + next_number = 1 + else: + next_number = (self.parse_number(app_leaf[1]) or 0) + 1 + # Name each migration + for i, migration in enumerate(migrations): + if i == 0 and app_leaf: + migration.dependencies.append(app_leaf) + if i == 0 and not app_leaf: + new_name = "0001_%s" % migration_name if migration_name else "0001_initial" + else: + new_name = "%04i_%s" % ( + next_number, + migration_name or self.suggest_name(migration.operations)[:100], + ) + name_map[(app_label, migration.name)] = (app_label, new_name) + next_number += 1 + migration.name = new_name + # Now fix dependencies + for migrations in changes.values(): + for migration in migrations: + migration.dependencies = [name_map.get(d, d) for d in migration.dependencies] + return changes + + def _trim_to_apps(self, changes, app_labels): + """ + Take changes from arrange_for_graph() and set of app labels, and return + a modified set of changes which trims out as many migrations that are + not in app_labels as possible. Note that some other migrations may + still be present as they may be required dependencies. + """ + # Gather other app dependencies in a first pass + app_dependencies = {} + for app_label, migrations in changes.items(): + for migration in migrations: + for dep_app_label, name in migration.dependencies: + app_dependencies.setdefault(app_label, set()).add(dep_app_label) + required_apps = set(app_labels) + # Keep resolving till there's no change + old_required_apps = None + while old_required_apps != required_apps: + old_required_apps = set(required_apps) + required_apps.update(*[app_dependencies.get(app_label, ()) for app_label in required_apps]) + # Remove all migrations that aren't needed + for app_label in list(changes): + if app_label not in required_apps: + del changes[app_label] + return changes + + @classmethod + def suggest_name(cls, ops): + """ + Given a set of operations, suggest a name for the migration they might + represent. Names are not guaranteed to be unique, but put some effort + into the fallback name to avoid VCS conflicts if possible. + """ + if len(ops) == 1: + if isinstance(ops[0], operations.CreateModel): + return ops[0].name_lower + elif isinstance(ops[0], operations.DeleteModel): + return "delete_%s" % ops[0].name_lower + elif isinstance(ops[0], operations.AddField): + return "%s_%s" % (ops[0].model_name_lower, ops[0].name_lower) + elif isinstance(ops[0], operations.RemoveField): + return "remove_%s_%s" % (ops[0].model_name_lower, ops[0].name_lower) + elif ops: + if all(isinstance(o, operations.CreateModel) for o in ops): + return "_".join(sorted(o.name_lower for o in ops)) + return "auto_%s" % get_migration_name_timestamp() + + @classmethod + def parse_number(cls, name): + """ + Given a migration name, try to extract a number from the beginning of + it. If no number is found, return None. + """ + match = re.match(r'^\d+', name) + if match: + return int(match.group()) + return None diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/exceptions.py b/venv/lib/python3.7/site-packages/django/db/migrations/exceptions.py new file mode 100644 index 0000000..f389701 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/exceptions.py @@ -0,0 +1,54 @@ +from django.db.utils import DatabaseError + + +class AmbiguityError(Exception): + """More than one migration matches a name prefix.""" + pass + + +class BadMigrationError(Exception): + """There's a bad migration (unreadable/bad format/etc.).""" + pass + + +class CircularDependencyError(Exception): + """There's an impossible-to-resolve circular dependency.""" + pass + + +class InconsistentMigrationHistory(Exception): + """An applied migration has some of its dependencies not applied.""" + pass + + +class InvalidBasesError(ValueError): + """A model's base classes can't be resolved.""" + pass + + +class IrreversibleError(RuntimeError): + """An irreversible migration is about to be reversed.""" + pass + + +class NodeNotFoundError(LookupError): + """An attempt on a node is made that is not available in the graph.""" + + def __init__(self, message, node, origin=None): + self.message = message + self.origin = origin + self.node = node + + def __str__(self): + return self.message + + def __repr__(self): + return "NodeNotFoundError(%r)" % (self.node,) + + +class MigrationSchemaMissing(DatabaseError): + pass + + +class InvalidMigrationPlan(ValueError): + pass diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/executor.py b/venv/lib/python3.7/site-packages/django/db/migrations/executor.py new file mode 100644 index 0000000..4aaa91e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/executor.py @@ -0,0 +1,376 @@ +from django.apps.registry import apps as global_apps +from django.db import migrations, router + +from .exceptions import InvalidMigrationPlan +from .loader import MigrationLoader +from .recorder import MigrationRecorder +from .state import ProjectState + + +class MigrationExecutor: + """ + End-to-end migration execution - load migrations and run them up or down + to a specified set of targets. + """ + + def __init__(self, connection, progress_callback=None): + self.connection = connection + self.loader = MigrationLoader(self.connection) + self.recorder = MigrationRecorder(self.connection) + self.progress_callback = progress_callback + + def migration_plan(self, targets, clean_start=False): + """ + Given a set of targets, return a list of (Migration instance, backwards?). + """ + plan = [] + if clean_start: + applied = set() + else: + applied = set(self.loader.applied_migrations) + for target in targets: + # If the target is (app_label, None), that means unmigrate everything + if target[1] is None: + for root in self.loader.graph.root_nodes(): + if root[0] == target[0]: + for migration in self.loader.graph.backwards_plan(root): + if migration in applied: + plan.append((self.loader.graph.nodes[migration], True)) + applied.remove(migration) + # If the migration is already applied, do backwards mode, + # otherwise do forwards mode. + elif target in applied: + # Don't migrate backwards all the way to the target node (that + # may roll back dependencies in other apps that don't need to + # be rolled back); instead roll back through target's immediate + # child(ren) in the same app, and no further. + next_in_app = sorted( + n for n in + self.loader.graph.node_map[target].children + if n[0] == target[0] + ) + for node in next_in_app: + for migration in self.loader.graph.backwards_plan(node): + if migration in applied: + plan.append((self.loader.graph.nodes[migration], True)) + applied.remove(migration) + else: + for migration in self.loader.graph.forwards_plan(target): + if migration not in applied: + plan.append((self.loader.graph.nodes[migration], False)) + applied.add(migration) + return plan + + def _create_project_state(self, with_applied_migrations=False): + """ + Create a project state including all the applications without + migrations and applied migrations if with_applied_migrations=True. + """ + state = ProjectState(real_apps=list(self.loader.unmigrated_apps)) + if with_applied_migrations: + # Create the forwards plan Django would follow on an empty database + full_plan = self.migration_plan(self.loader.graph.leaf_nodes(), clean_start=True) + applied_migrations = { + self.loader.graph.nodes[key] for key in self.loader.applied_migrations + if key in self.loader.graph.nodes + } + for migration, _ in full_plan: + if migration in applied_migrations: + migration.mutate_state(state, preserve=False) + return state + + def migrate(self, targets, plan=None, state=None, fake=False, fake_initial=False): + """ + Migrate the database up to the given targets. + + Django first needs to create all project states before a migration is + (un)applied and in a second step run all the database operations. + """ + # The django_migrations table must be present to record applied + # migrations. + self.recorder.ensure_schema() + + if plan is None: + plan = self.migration_plan(targets) + # Create the forwards plan Django would follow on an empty database + full_plan = self.migration_plan(self.loader.graph.leaf_nodes(), clean_start=True) + + all_forwards = all(not backwards for mig, backwards in plan) + all_backwards = all(backwards for mig, backwards in plan) + + if not plan: + if state is None: + # The resulting state should include applied migrations. + state = self._create_project_state(with_applied_migrations=True) + elif all_forwards == all_backwards: + # This should only happen if there's a mixed plan + raise InvalidMigrationPlan( + "Migration plans with both forwards and backwards migrations " + "are not supported. Please split your migration process into " + "separate plans of only forwards OR backwards migrations.", + plan + ) + elif all_forwards: + if state is None: + # The resulting state should still include applied migrations. + state = self._create_project_state(with_applied_migrations=True) + state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) + else: + # No need to check for `elif all_backwards` here, as that condition + # would always evaluate to true. + state = self._migrate_all_backwards(plan, full_plan, fake=fake) + + self.check_replacements() + + return state + + def _migrate_all_forwards(self, state, plan, full_plan, fake, fake_initial): + """ + Take a list of 2-tuples of the form (migration instance, False) and + apply them in the order they occur in the full_plan. + """ + migrations_to_run = {m[0] for m in plan} + for migration, _ in full_plan: + if not migrations_to_run: + # We remove every migration that we applied from these sets so + # that we can bail out once the last migration has been applied + # and don't always run until the very end of the migration + # process. + break + if migration in migrations_to_run: + if 'apps' not in state.__dict__: + if self.progress_callback: + self.progress_callback("render_start") + state.apps # Render all -- performance critical + if self.progress_callback: + self.progress_callback("render_success") + state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) + migrations_to_run.remove(migration) + + return state + + def _migrate_all_backwards(self, plan, full_plan, fake): + """ + Take a list of 2-tuples of the form (migration instance, True) and + unapply them in reverse order they occur in the full_plan. + + Since unapplying a migration requires the project state prior to that + migration, Django will compute the migration states before each of them + in a first run over the plan and then unapply them in a second run over + the plan. + """ + migrations_to_run = {m[0] for m in plan} + # Holds all migration states prior to the migrations being unapplied + states = {} + state = self._create_project_state() + applied_migrations = { + self.loader.graph.nodes[key] for key in self.loader.applied_migrations + if key in self.loader.graph.nodes + } + if self.progress_callback: + self.progress_callback("render_start") + for migration, _ in full_plan: + if not migrations_to_run: + # We remove every migration that we applied from this set so + # that we can bail out once the last migration has been applied + # and don't always run until the very end of the migration + # process. + break + if migration in migrations_to_run: + if 'apps' not in state.__dict__: + state.apps # Render all -- performance critical + # The state before this migration + states[migration] = state + # The old state keeps as-is, we continue with the new state + state = migration.mutate_state(state, preserve=True) + migrations_to_run.remove(migration) + elif migration in applied_migrations: + # Only mutate the state if the migration is actually applied + # to make sure the resulting state doesn't include changes + # from unrelated migrations. + migration.mutate_state(state, preserve=False) + if self.progress_callback: + self.progress_callback("render_success") + + for migration, _ in plan: + self.unapply_migration(states[migration], migration, fake=fake) + applied_migrations.remove(migration) + + # Generate the post migration state by starting from the state before + # the last migration is unapplied and mutating it to include all the + # remaining applied migrations. + last_unapplied_migration = plan[-1][0] + state = states[last_unapplied_migration] + for index, (migration, _) in enumerate(full_plan): + if migration == last_unapplied_migration: + for migration, _ in full_plan[index:]: + if migration in applied_migrations: + migration.mutate_state(state, preserve=False) + break + + return state + + def collect_sql(self, plan): + """ + Take a migration plan and return a list of collected SQL statements + that represent the best-efforts version of that plan. + """ + statements = [] + state = None + for migration, backwards in plan: + with self.connection.schema_editor(collect_sql=True, atomic=migration.atomic) as schema_editor: + if state is None: + state = self.loader.project_state((migration.app_label, migration.name), at_end=False) + if not backwards: + state = migration.apply(state, schema_editor, collect_sql=True) + else: + state = migration.unapply(state, schema_editor, collect_sql=True) + statements.extend(schema_editor.collected_sql) + return statements + + def apply_migration(self, state, migration, fake=False, fake_initial=False): + """Run a migration forwards.""" + migration_recorded = False + if self.progress_callback: + self.progress_callback("apply_start", migration, fake) + if not fake: + if fake_initial: + # Test to see if this is an already-applied initial migration + applied, state = self.detect_soft_applied(state, migration) + if applied: + fake = True + if not fake: + # Alright, do it normally + with self.connection.schema_editor(atomic=migration.atomic) as schema_editor: + state = migration.apply(state, schema_editor) + self.record_migration(migration) + migration_recorded = True + if not migration_recorded: + self.record_migration(migration) + # Report progress + if self.progress_callback: + self.progress_callback("apply_success", migration, fake) + return state + + def record_migration(self, migration): + # For replacement migrations, record individual statuses + if migration.replaces: + for app_label, name in migration.replaces: + self.recorder.record_applied(app_label, name) + else: + self.recorder.record_applied(migration.app_label, migration.name) + + def unapply_migration(self, state, migration, fake=False): + """Run a migration backwards.""" + if self.progress_callback: + self.progress_callback("unapply_start", migration, fake) + if not fake: + with self.connection.schema_editor(atomic=migration.atomic) as schema_editor: + state = migration.unapply(state, schema_editor) + # For replacement migrations, record individual statuses + if migration.replaces: + for app_label, name in migration.replaces: + self.recorder.record_unapplied(app_label, name) + else: + self.recorder.record_unapplied(migration.app_label, migration.name) + # Report progress + if self.progress_callback: + self.progress_callback("unapply_success", migration, fake) + return state + + def check_replacements(self): + """ + Mark replacement migrations applied if their replaced set all are. + + Do this unconditionally on every migrate, rather than just when + migrations are applied or unapplied, to correctly handle the case + when a new squash migration is pushed to a deployment that already had + all its replaced migrations applied. In this case no new migration will + be applied, but the applied state of the squashed migration must be + maintained. + """ + applied = self.recorder.applied_migrations() + for key, migration in self.loader.replacements.items(): + all_applied = all(m in applied for m in migration.replaces) + if all_applied and key not in applied: + self.recorder.record_applied(*key) + + def detect_soft_applied(self, project_state, migration): + """ + Test whether a migration has been implicitly applied - that the + tables or columns it would create exist. This is intended only for use + on initial migrations (as it only looks for CreateModel and AddField). + """ + def should_skip_detecting_model(migration, model): + """ + No need to detect tables for proxy models, unmanaged models, or + models that can't be migrated on the current database. + """ + return ( + model._meta.proxy or not model._meta.managed or not + router.allow_migrate( + self.connection.alias, migration.app_label, + model_name=model._meta.model_name, + ) + ) + + if migration.initial is None: + # Bail if the migration isn't the first one in its app + if any(app == migration.app_label for app, name in migration.dependencies): + return False, project_state + elif migration.initial is False: + # Bail if it's NOT an initial migration + return False, project_state + + if project_state is None: + after_state = self.loader.project_state((migration.app_label, migration.name), at_end=True) + else: + after_state = migration.mutate_state(project_state) + apps = after_state.apps + found_create_model_migration = False + found_add_field_migration = False + with self.connection.cursor() as cursor: + existing_table_names = self.connection.introspection.table_names(cursor) + # Make sure all create model and add field operations are done + for operation in migration.operations: + if isinstance(operation, migrations.CreateModel): + model = apps.get_model(migration.app_label, operation.name) + if model._meta.swapped: + # We have to fetch the model to test with from the + # main app cache, as it's not a direct dependency. + model = global_apps.get_model(model._meta.swapped) + if should_skip_detecting_model(migration, model): + continue + if model._meta.db_table not in existing_table_names: + return False, project_state + found_create_model_migration = True + elif isinstance(operation, migrations.AddField): + model = apps.get_model(migration.app_label, operation.model_name) + if model._meta.swapped: + # We have to fetch the model to test with from the + # main app cache, as it's not a direct dependency. + model = global_apps.get_model(model._meta.swapped) + if should_skip_detecting_model(migration, model): + continue + + table = model._meta.db_table + field = model._meta.get_field(operation.name) + + # Handle implicit many-to-many tables created by AddField. + if field.many_to_many: + if field.remote_field.through._meta.db_table not in existing_table_names: + return False, project_state + else: + found_add_field_migration = True + continue + + column_names = [ + column.name for column in + self.connection.introspection.get_table_description(self.connection.cursor(), table) + ] + if field.column not in column_names: + return False, project_state + found_add_field_migration = True + # If we get this far and we found at least one CreateModel or AddField migration, + # the migration is considered implicitly applied. + return (found_create_model_migration or found_add_field_migration), after_state diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/questioner.py b/venv/lib/python3.7/site-packages/django/db/migrations/questioner.py new file mode 100644 index 0000000..47a3052 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/questioner.py @@ -0,0 +1,239 @@ +import datetime +import importlib +import os +import sys + +from django.apps import apps +from django.db.models.fields import NOT_PROVIDED +from django.utils import timezone + +from .loader import MigrationLoader + + +class MigrationQuestioner: + """ + Give the autodetector responses to questions it might have. + This base class has a built-in noninteractive mode, but the + interactive subclass is what the command-line arguments will use. + """ + + def __init__(self, defaults=None, specified_apps=None, dry_run=None): + self.defaults = defaults or {} + self.specified_apps = specified_apps or set() + self.dry_run = dry_run + + def ask_initial(self, app_label): + """Should we create an initial migration for the app?""" + # If it was specified on the command line, definitely true + if app_label in self.specified_apps: + return True + # Otherwise, we look to see if it has a migrations module + # without any Python files in it, apart from __init__.py. + # Apps from the new app template will have these; the Python + # file check will ensure we skip South ones. + try: + app_config = apps.get_app_config(app_label) + except LookupError: # It's a fake app. + return self.defaults.get("ask_initial", False) + migrations_import_path, _ = MigrationLoader.migrations_module(app_config.label) + if migrations_import_path is None: + # It's an application with migrations disabled. + return self.defaults.get("ask_initial", False) + try: + migrations_module = importlib.import_module(migrations_import_path) + except ImportError: + return self.defaults.get("ask_initial", False) + else: + # getattr() needed on PY36 and older (replace with attribute access). + if getattr(migrations_module, "__file__", None): + filenames = os.listdir(os.path.dirname(migrations_module.__file__)) + elif hasattr(migrations_module, "__path__"): + if len(migrations_module.__path__) > 1: + return False + filenames = os.listdir(list(migrations_module.__path__)[0]) + return not any(x.endswith(".py") for x in filenames if x != "__init__.py") + + def ask_not_null_addition(self, field_name, model_name): + """Adding a NOT NULL field to a model.""" + # None means quit + return None + + def ask_not_null_alteration(self, field_name, model_name): + """Changing a NULL field to NOT NULL.""" + # None means quit + return None + + def ask_rename(self, model_name, old_name, new_name, field_instance): + """Was this field really renamed?""" + return self.defaults.get("ask_rename", False) + + def ask_rename_model(self, old_model_state, new_model_state): + """Was this model really renamed?""" + return self.defaults.get("ask_rename_model", False) + + def ask_merge(self, app_label): + """Do you really want to merge these migrations?""" + return self.defaults.get("ask_merge", False) + + def ask_auto_now_add_addition(self, field_name, model_name): + """Adding an auto_now_add field to a model.""" + # None means quit + return None + + +class InteractiveMigrationQuestioner(MigrationQuestioner): + + def _boolean_input(self, question, default=None): + result = input("%s " % question) + if not result and default is not None: + return default + while not result or result[0].lower() not in "yn": + result = input("Please answer yes or no: ") + return result[0].lower() == "y" + + def _choice_input(self, question, choices): + print(question) + for i, choice in enumerate(choices): + print(" %s) %s" % (i + 1, choice)) + result = input("Select an option: ") + while True: + try: + value = int(result) + except ValueError: + pass + else: + if 0 < value <= len(choices): + return value + result = input("Please select a valid option: ") + + def _ask_default(self, default=''): + """ + Prompt for a default value. + + The ``default`` argument allows providing a custom default value (as a + string) which will be shown to the user and used as the return value + if the user doesn't provide any other input. + """ + print("Please enter the default value now, as valid Python") + if default: + print( + "You can accept the default '{}' by pressing 'Enter' or you " + "can provide another value.".format(default) + ) + print("The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now") + print("Type 'exit' to exit this prompt") + while True: + if default: + prompt = "[default: {}] >>> ".format(default) + else: + prompt = ">>> " + code = input(prompt) + if not code and default: + code = default + if not code: + print("Please enter some code, or 'exit' (with no quotes) to exit.") + elif code == "exit": + sys.exit(1) + else: + try: + return eval(code, {}, {'datetime': datetime, 'timezone': timezone}) + except (SyntaxError, NameError) as e: + print("Invalid input: %s" % e) + + def ask_not_null_addition(self, field_name, model_name): + """Adding a NOT NULL field to a model.""" + if not self.dry_run: + choice = self._choice_input( + "You are trying to add a non-nullable field '%s' to %s without a default; " + "we can't do that (the database needs something to populate existing rows).\n" + "Please select a fix:" % (field_name, model_name), + [ + ("Provide a one-off default now (will be set on all existing " + "rows with a null value for this column)"), + "Quit, and let me add a default in models.py", + ] + ) + if choice == 2: + sys.exit(3) + else: + return self._ask_default() + return None + + def ask_not_null_alteration(self, field_name, model_name): + """Changing a NULL field to NOT NULL.""" + if not self.dry_run: + choice = self._choice_input( + "You are trying to change the nullable field '%s' on %s to non-nullable " + "without a default; we can't do that (the database needs something to " + "populate existing rows).\n" + "Please select a fix:" % (field_name, model_name), + [ + ("Provide a one-off default now (will be set on all existing " + "rows with a null value for this column)"), + ("Ignore for now, and let me handle existing rows with NULL myself " + "(e.g. because you added a RunPython or RunSQL operation to handle " + "NULL values in a previous data migration)"), + "Quit, and let me add a default in models.py", + ] + ) + if choice == 2: + return NOT_PROVIDED + elif choice == 3: + sys.exit(3) + else: + return self._ask_default() + return None + + def ask_rename(self, model_name, old_name, new_name, field_instance): + """Was this field really renamed?""" + msg = "Did you rename %s.%s to %s.%s (a %s)? [y/N]" + return self._boolean_input(msg % (model_name, old_name, model_name, new_name, + field_instance.__class__.__name__), False) + + def ask_rename_model(self, old_model_state, new_model_state): + """Was this model really renamed?""" + msg = "Did you rename the %s.%s model to %s? [y/N]" + return self._boolean_input(msg % (old_model_state.app_label, old_model_state.name, + new_model_state.name), False) + + def ask_merge(self, app_label): + return self._boolean_input( + "\nMerging will only work if the operations printed above do not conflict\n" + + "with each other (working on different fields or models)\n" + + "Do you want to merge these migration branches? [y/N]", + False, + ) + + def ask_auto_now_add_addition(self, field_name, model_name): + """Adding an auto_now_add field to a model.""" + if not self.dry_run: + choice = self._choice_input( + "You are trying to add the field '{}' with 'auto_now_add=True' " + "to {} without a default; the database needs something to " + "populate existing rows.\n".format(field_name, model_name), + [ + "Provide a one-off default now (will be set on all " + "existing rows)", + "Quit, and let me add a default in models.py", + ] + ) + if choice == 2: + sys.exit(3) + else: + return self._ask_default(default='timezone.now') + return None + + +class NonInteractiveMigrationQuestioner(MigrationQuestioner): + + def ask_not_null_addition(self, field_name, model_name): + # We can't ask the user, so act like the user aborted. + sys.exit(3) + + def ask_not_null_alteration(self, field_name, model_name): + # We can't ask the user, so set as not provided. + return NOT_PROVIDED + + def ask_auto_now_add_addition(self, field_name, model_name): + # We can't ask the user, so act like the user aborted. + sys.exit(3) diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/recorder.py b/venv/lib/python3.7/site-packages/django/db/migrations/recorder.py new file mode 100644 index 0000000..ad5435d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/recorder.py @@ -0,0 +1,92 @@ +from django.apps.registry import Apps +from django.db import models +from django.db.utils import DatabaseError +from django.utils.decorators import classproperty +from django.utils.timezone import now + +from .exceptions import MigrationSchemaMissing + + +class MigrationRecorder: + """ + Deal with storing migration records in the database. + + Because this table is actually itself used for dealing with model + creation, it's the one thing we can't do normally via migrations. + We manually handle table creation/schema updating (using schema backend) + and then have a floating model to do queries with. + + If a migration is unapplied its row is removed from the table. Having + a row in the table always means a migration is applied. + """ + _migration_class = None + + @classproperty + def Migration(cls): + """ + Lazy load to avoid AppRegistryNotReady if installed apps import + MigrationRecorder. + """ + if cls._migration_class is None: + class Migration(models.Model): + app = models.CharField(max_length=255) + name = models.CharField(max_length=255) + applied = models.DateTimeField(default=now) + + class Meta: + apps = Apps() + app_label = 'migrations' + db_table = 'django_migrations' + + def __str__(self): + return 'Migration %s for %s' % (self.name, self.app) + + cls._migration_class = Migration + return cls._migration_class + + def __init__(self, connection): + self.connection = connection + + @property + def migration_qs(self): + return self.Migration.objects.using(self.connection.alias) + + def has_table(self): + """Return True if the django_migrations table exists.""" + return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor()) + + def ensure_schema(self): + """Ensure the table exists and has the correct schema.""" + # If the table's there, that's fine - we've never changed its schema + # in the codebase. + if self.has_table(): + return + # Make the table + try: + with self.connection.schema_editor() as editor: + editor.create_model(self.Migration) + except DatabaseError as exc: + raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc) + + def applied_migrations(self): + """Return a set of (app, name) of applied migrations.""" + if self.has_table(): + return {tuple(x) for x in self.migration_qs.values_list('app', 'name')} + else: + # If the django_migrations table doesn't exist, then no migrations + # are applied. + return set() + + def record_applied(self, app, name): + """Record that a migration was applied.""" + self.ensure_schema() + self.migration_qs.create(app=app, name=name) + + def record_unapplied(self, app, name): + """Record that a migration was unapplied.""" + self.ensure_schema() + self.migration_qs.filter(app=app, name=name).delete() + + def flush(self): + """Delete all migration records. Useful for testing migrations.""" + self.migration_qs.all().delete() diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/state.py b/venv/lib/python3.7/site-packages/django/db/migrations/state.py new file mode 100644 index 0000000..a20aa0b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/state.py @@ -0,0 +1,612 @@ +import copy +from collections import OrderedDict +from contextlib import contextmanager + +from django.apps import AppConfig +from django.apps.registry import Apps, apps as global_apps +from django.conf import settings +from django.db import models +from django.db.models.fields.proxy import OrderWrt +from django.db.models.fields.related import RECURSIVE_RELATIONSHIP_CONSTANT +from django.db.models.options import DEFAULT_NAMES, normalize_together +from django.db.models.utils import make_model_tuple +from django.utils.functional import cached_property +from django.utils.module_loading import import_string +from django.utils.version import get_docs_version + +from .exceptions import InvalidBasesError + + +def _get_app_label_and_model_name(model, app_label=''): + if isinstance(model, str): + split = model.split('.', 1) + return tuple(split) if len(split) == 2 else (app_label, split[0]) + else: + return model._meta.app_label, model._meta.model_name + + +def _get_related_models(m): + """Return all models that have a direct relationship to the given model.""" + related_models = [ + subclass for subclass in m.__subclasses__() + if issubclass(subclass, models.Model) + ] + related_fields_models = set() + for f in m._meta.get_fields(include_parents=True, include_hidden=True): + if f.is_relation and f.related_model is not None and not isinstance(f.related_model, str): + related_fields_models.add(f.model) + related_models.append(f.related_model) + # Reverse accessors of foreign keys to proxy models are attached to their + # concrete proxied model. + opts = m._meta + if opts.proxy and m in related_fields_models: + related_models.append(opts.concrete_model) + return related_models + + +def get_related_models_tuples(model): + """ + Return a list of typical (app_label, model_name) tuples for all related + models for the given model. + """ + return { + (rel_mod._meta.app_label, rel_mod._meta.model_name) + for rel_mod in _get_related_models(model) + } + + +def get_related_models_recursive(model): + """ + Return all models that have a direct or indirect relationship + to the given model. + + Relationships are either defined by explicit relational fields, like + ForeignKey, ManyToManyField or OneToOneField, or by inheriting from another + model (a superclass is related to its subclasses, but not vice versa). Note, + however, that a model inheriting from a concrete model is also related to + its superclass through the implicit *_ptr OneToOneField on the subclass. + """ + seen = set() + queue = _get_related_models(model) + for rel_mod in queue: + rel_app_label, rel_model_name = rel_mod._meta.app_label, rel_mod._meta.model_name + if (rel_app_label, rel_model_name) in seen: + continue + seen.add((rel_app_label, rel_model_name)) + queue.extend(_get_related_models(rel_mod)) + return seen - {(model._meta.app_label, model._meta.model_name)} + + +class ProjectState: + """ + Represent the entire project's overall state. This is the item that is + passed around - do it here rather than at the app level so that cross-app + FKs/etc. resolve properly. + """ + + def __init__(self, models=None, real_apps=None): + self.models = models or {} + # Apps to include from main registry, usually unmigrated ones + self.real_apps = real_apps or [] + self.is_delayed = False + + def add_model(self, model_state): + app_label, model_name = model_state.app_label, model_state.name_lower + self.models[(app_label, model_name)] = model_state + if 'apps' in self.__dict__: # hasattr would cache the property + self.reload_model(app_label, model_name) + + def remove_model(self, app_label, model_name): + del self.models[app_label, model_name] + if 'apps' in self.__dict__: # hasattr would cache the property + self.apps.unregister_model(app_label, model_name) + # Need to do this explicitly since unregister_model() doesn't clear + # the cache automatically (#24513) + self.apps.clear_cache() + + def _find_reload_model(self, app_label, model_name, delay=False): + if delay: + self.is_delayed = True + + related_models = set() + + try: + old_model = self.apps.get_model(app_label, model_name) + except LookupError: + pass + else: + # Get all relations to and from the old model before reloading, + # as _meta.apps may change + if delay: + related_models = get_related_models_tuples(old_model) + else: + related_models = get_related_models_recursive(old_model) + + # Get all outgoing references from the model to be rendered + model_state = self.models[(app_label, model_name)] + # Directly related models are the models pointed to by ForeignKeys, + # OneToOneFields, and ManyToManyFields. + direct_related_models = set() + for name, field in model_state.fields: + if field.is_relation: + if field.remote_field.model == RECURSIVE_RELATIONSHIP_CONSTANT: + continue + rel_app_label, rel_model_name = _get_app_label_and_model_name(field.related_model, app_label) + direct_related_models.add((rel_app_label, rel_model_name.lower())) + + # For all direct related models recursively get all related models. + related_models.update(direct_related_models) + for rel_app_label, rel_model_name in direct_related_models: + try: + rel_model = self.apps.get_model(rel_app_label, rel_model_name) + except LookupError: + pass + else: + if delay: + related_models.update(get_related_models_tuples(rel_model)) + else: + related_models.update(get_related_models_recursive(rel_model)) + + # Include the model itself + related_models.add((app_label, model_name)) + + return related_models + + def reload_model(self, app_label, model_name, delay=False): + if 'apps' in self.__dict__: # hasattr would cache the property + related_models = self._find_reload_model(app_label, model_name, delay) + self._reload(related_models) + + def reload_models(self, models, delay=True): + if 'apps' in self.__dict__: # hasattr would cache the property + related_models = set() + for app_label, model_name in models: + related_models.update(self._find_reload_model(app_label, model_name, delay)) + self._reload(related_models) + + def _reload(self, related_models): + # Unregister all related models + with self.apps.bulk_update(): + for rel_app_label, rel_model_name in related_models: + self.apps.unregister_model(rel_app_label, rel_model_name) + + states_to_be_rendered = [] + # Gather all models states of those models that will be rerendered. + # This includes: + # 1. All related models of unmigrated apps + for model_state in self.apps.real_models: + if (model_state.app_label, model_state.name_lower) in related_models: + states_to_be_rendered.append(model_state) + + # 2. All related models of migrated apps + for rel_app_label, rel_model_name in related_models: + try: + model_state = self.models[rel_app_label, rel_model_name] + except KeyError: + pass + else: + states_to_be_rendered.append(model_state) + + # Render all models + self.apps.render_multiple(states_to_be_rendered) + + def clone(self): + """Return an exact copy of this ProjectState.""" + new_state = ProjectState( + models={k: v.clone() for k, v in self.models.items()}, + real_apps=self.real_apps, + ) + if 'apps' in self.__dict__: + new_state.apps = self.apps.clone() + new_state.is_delayed = self.is_delayed + return new_state + + def clear_delayed_apps_cache(self): + if self.is_delayed and 'apps' in self.__dict__: + del self.__dict__['apps'] + + @cached_property + def apps(self): + return StateApps(self.real_apps, self.models) + + @property + def concrete_apps(self): + self.apps = StateApps(self.real_apps, self.models, ignore_swappable=True) + return self.apps + + @classmethod + def from_apps(cls, apps): + """Take an Apps and return a ProjectState matching it.""" + app_models = {} + for model in apps.get_models(include_swapped=True): + model_state = ModelState.from_model(model) + app_models[(model_state.app_label, model_state.name_lower)] = model_state + return cls(app_models) + + def __eq__(self, other): + return self.models == other.models and set(self.real_apps) == set(other.real_apps) + + +class AppConfigStub(AppConfig): + """Stub of an AppConfig. Only provides a label and a dict of models.""" + # Not used, but required by AppConfig.__init__ + path = '' + + def __init__(self, label): + self.label = label + # App-label and app-name are not the same thing, so technically passing + # in the label here is wrong. In practice, migrations don't care about + # the app name, but we need something unique, and the label works fine. + super().__init__(label, None) + + def import_models(self): + self.models = self.apps.all_models[self.label] + + +class StateApps(Apps): + """ + Subclass of the global Apps registry class to better handle dynamic model + additions and removals. + """ + def __init__(self, real_apps, models, ignore_swappable=False): + # Any apps in self.real_apps should have all their models included + # in the render. We don't use the original model instances as there + # are some variables that refer to the Apps object. + # FKs/M2Ms from real apps are also not included as they just + # mess things up with partial states (due to lack of dependencies) + self.real_models = [] + for app_label in real_apps: + app = global_apps.get_app_config(app_label) + for model in app.get_models(): + self.real_models.append(ModelState.from_model(model, exclude_rels=True)) + # Populate the app registry with a stub for each application. + app_labels = {model_state.app_label for model_state in models.values()} + app_configs = [AppConfigStub(label) for label in sorted([*real_apps, *app_labels])] + super().__init__(app_configs) + + # These locks get in the way of copying as implemented in clone(), + # which is called whenever Django duplicates a StateApps before + # updating it. + self._lock = None + self.ready_event = None + + self.render_multiple([*models.values(), *self.real_models]) + + # There shouldn't be any operations pending at this point. + from django.core.checks.model_checks import _check_lazy_references + ignore = {make_model_tuple(settings.AUTH_USER_MODEL)} if ignore_swappable else set() + errors = _check_lazy_references(self, ignore=ignore) + if errors: + raise ValueError("\n".join(error.msg for error in errors)) + + @contextmanager + def bulk_update(self): + # Avoid clearing each model's cache for each change. Instead, clear + # all caches when we're finished updating the model instances. + ready = self.ready + self.ready = False + try: + yield + finally: + self.ready = ready + self.clear_cache() + + def render_multiple(self, model_states): + # We keep trying to render the models in a loop, ignoring invalid + # base errors, until the size of the unrendered models doesn't + # decrease by at least one, meaning there's a base dependency loop/ + # missing base. + if not model_states: + return + # Prevent that all model caches are expired for each render. + with self.bulk_update(): + unrendered_models = model_states + while unrendered_models: + new_unrendered_models = [] + for model in unrendered_models: + try: + model.render(self) + except InvalidBasesError: + new_unrendered_models.append(model) + if len(new_unrendered_models) == len(unrendered_models): + raise InvalidBasesError( + "Cannot resolve bases for %r\nThis can happen if you are inheriting models from an " + "app with migrations (e.g. contrib.auth)\n in an app with no migrations; see " + "https://docs.djangoproject.com/en/%s/topics/migrations/#dependencies " + "for more" % (new_unrendered_models, get_docs_version()) + ) + unrendered_models = new_unrendered_models + + def clone(self): + """Return a clone of this registry.""" + clone = StateApps([], {}) + clone.all_models = copy.deepcopy(self.all_models) + clone.app_configs = copy.deepcopy(self.app_configs) + # Set the pointer to the correct app registry. + for app_config in clone.app_configs.values(): + app_config.apps = clone + # No need to actually clone them, they'll never change + clone.real_models = self.real_models + return clone + + def register_model(self, app_label, model): + self.all_models[app_label][model._meta.model_name] = model + if app_label not in self.app_configs: + self.app_configs[app_label] = AppConfigStub(app_label) + self.app_configs[app_label].apps = self + self.app_configs[app_label].models = OrderedDict() + self.app_configs[app_label].models[model._meta.model_name] = model + self.do_pending_operations(model) + self.clear_cache() + + def unregister_model(self, app_label, model_name): + try: + del self.all_models[app_label][model_name] + del self.app_configs[app_label].models[model_name] + except KeyError: + pass + + +class ModelState: + """ + Represent a Django Model. Don't use the actual Model class as it's not + designed to have its options changed - instead, mutate this one and then + render it into a Model as required. + + Note that while you are allowed to mutate .fields, you are not allowed + to mutate the Field instances inside there themselves - you must instead + assign new ones, as these are not detached during a clone. + """ + + def __init__(self, app_label, name, fields, options=None, bases=None, managers=None): + self.app_label = app_label + self.name = name + self.fields = fields + self.options = options or {} + self.options.setdefault('indexes', []) + self.options.setdefault('constraints', []) + self.bases = bases or (models.Model,) + self.managers = managers or [] + # Sanity-check that fields is NOT a dict. It must be ordered. + if isinstance(self.fields, dict): + raise ValueError("ModelState.fields cannot be a dict - it must be a list of 2-tuples.") + for name, field in fields: + # Sanity-check that fields are NOT already bound to a model. + if hasattr(field, 'model'): + raise ValueError( + 'ModelState.fields cannot be bound to a model - "%s" is.' % name + ) + # Sanity-check that relation fields are NOT referring to a model class. + if field.is_relation and hasattr(field.related_model, '_meta'): + raise ValueError( + 'ModelState.fields cannot refer to a model class - "%s.to" does. ' + 'Use a string reference instead.' % name + ) + if field.many_to_many and hasattr(field.remote_field.through, '_meta'): + raise ValueError( + 'ModelState.fields cannot refer to a model class - "%s.through" does. ' + 'Use a string reference instead.' % name + ) + # Sanity-check that indexes have their name set. + for index in self.options['indexes']: + if not index.name: + raise ValueError( + "Indexes passed to ModelState require a name attribute. " + "%r doesn't have one." % index + ) + + @cached_property + def name_lower(self): + return self.name.lower() + + @classmethod + def from_model(cls, model, exclude_rels=False): + """Given a model, return a ModelState representing it.""" + # Deconstruct the fields + fields = [] + for field in model._meta.local_fields: + if getattr(field, "remote_field", None) and exclude_rels: + continue + if isinstance(field, OrderWrt): + continue + name = field.name + try: + fields.append((name, field.clone())) + except TypeError as e: + raise TypeError("Couldn't reconstruct field %s on %s: %s" % ( + name, + model._meta.label, + e, + )) + if not exclude_rels: + for field in model._meta.local_many_to_many: + name = field.name + try: + fields.append((name, field.clone())) + except TypeError as e: + raise TypeError("Couldn't reconstruct m2m field %s on %s: %s" % ( + name, + model._meta.object_name, + e, + )) + # Extract the options + options = {} + for name in DEFAULT_NAMES: + # Ignore some special options + if name in ["apps", "app_label"]: + continue + elif name in model._meta.original_attrs: + if name == "unique_together": + ut = model._meta.original_attrs["unique_together"] + options[name] = set(normalize_together(ut)) + elif name == "index_together": + it = model._meta.original_attrs["index_together"] + options[name] = set(normalize_together(it)) + elif name == "indexes": + indexes = [idx.clone() for idx in model._meta.indexes] + for index in indexes: + if not index.name: + index.set_name_with_model(model) + options['indexes'] = indexes + elif name == 'constraints': + options['constraints'] = [con.clone() for con in model._meta.constraints] + else: + options[name] = model._meta.original_attrs[name] + # If we're ignoring relationships, remove all field-listing model + # options (that option basically just means "make a stub model") + if exclude_rels: + for key in ["unique_together", "index_together", "order_with_respect_to"]: + if key in options: + del options[key] + # Private fields are ignored, so remove options that refer to them. + elif options.get('order_with_respect_to') in {field.name for field in model._meta.private_fields}: + del options['order_with_respect_to'] + + def flatten_bases(model): + bases = [] + for base in model.__bases__: + if hasattr(base, "_meta") and base._meta.abstract: + bases.extend(flatten_bases(base)) + else: + bases.append(base) + return bases + + # We can't rely on __mro__ directly because we only want to flatten + # abstract models and not the whole tree. However by recursing on + # __bases__ we may end up with duplicates and ordering issues, we + # therefore discard any duplicates and reorder the bases according + # to their index in the MRO. + flattened_bases = sorted(set(flatten_bases(model)), key=lambda x: model.__mro__.index(x)) + + # Make our record + bases = tuple( + ( + base._meta.label_lower + if hasattr(base, "_meta") else + base + ) + for base in flattened_bases + ) + # Ensure at least one base inherits from models.Model + if not any((isinstance(base, str) or issubclass(base, models.Model)) for base in bases): + bases = (models.Model,) + + managers = [] + manager_names = set() + default_manager_shim = None + for manager in model._meta.managers: + if manager.name in manager_names: + # Skip overridden managers. + continue + elif manager.use_in_migrations: + # Copy managers usable in migrations. + new_manager = copy.copy(manager) + new_manager._set_creation_counter() + elif manager is model._base_manager or manager is model._default_manager: + # Shim custom managers used as default and base managers. + new_manager = models.Manager() + new_manager.model = manager.model + new_manager.name = manager.name + if manager is model._default_manager: + default_manager_shim = new_manager + else: + continue + manager_names.add(manager.name) + managers.append((manager.name, new_manager)) + + # Ignore a shimmed default manager called objects if it's the only one. + if managers == [('objects', default_manager_shim)]: + managers = [] + + # Construct the new ModelState + return cls( + model._meta.app_label, + model._meta.object_name, + fields, + options, + bases, + managers, + ) + + def construct_managers(self): + """Deep-clone the managers using deconstruction.""" + # Sort all managers by their creation counter + sorted_managers = sorted(self.managers, key=lambda v: v[1].creation_counter) + for mgr_name, manager in sorted_managers: + as_manager, manager_path, qs_path, args, kwargs = manager.deconstruct() + if as_manager: + qs_class = import_string(qs_path) + yield mgr_name, qs_class.as_manager() + else: + manager_class = import_string(manager_path) + yield mgr_name, manager_class(*args, **kwargs) + + def clone(self): + """Return an exact copy of this ModelState.""" + return self.__class__( + app_label=self.app_label, + name=self.name, + fields=list(self.fields), + # Since options are shallow-copied here, operations such as + # AddIndex must replace their option (e.g 'indexes') rather + # than mutating it. + options=dict(self.options), + bases=self.bases, + managers=list(self.managers), + ) + + def render(self, apps): + """Create a Model object from our current state into the given apps.""" + # First, make a Meta object + meta_contents = {'app_label': self.app_label, 'apps': apps, **self.options} + meta = type("Meta", (), meta_contents) + # Then, work out our bases + try: + bases = tuple( + (apps.get_model(base) if isinstance(base, str) else base) + for base in self.bases + ) + except LookupError: + raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,)) + # Turn fields into a dict for the body, add other bits + body = {name: field.clone() for name, field in self.fields} + body['Meta'] = meta + body['__module__'] = "__fake__" + + # Restore managers + body.update(self.construct_managers()) + # Then, make a Model object (apps.register_model is called in __new__) + return type(self.name, bases, body) + + def get_field_by_name(self, name): + for fname, field in self.fields: + if fname == name: + return field + raise ValueError("No field called %s on model %s" % (name, self.name)) + + def get_index_by_name(self, name): + for index in self.options['indexes']: + if index.name == name: + return index + raise ValueError("No index named %s on model %s" % (name, self.name)) + + def get_constraint_by_name(self, name): + for constraint in self.options['constraints']: + if constraint.name == name: + return constraint + raise ValueError('No constraint named %s on model %s' % (name, self.name)) + + def __repr__(self): + return "<%s: '%s.%s'>" % (self.__class__.__name__, self.app_label, self.name) + + def __eq__(self, other): + return ( + (self.app_label == other.app_label) and + (self.name == other.name) and + (len(self.fields) == len(other.fields)) and + all((k1 == k2 and (f1.deconstruct()[1:] == f2.deconstruct()[1:])) + for (k1, f1), (k2, f2) in zip(self.fields, other.fields)) and + (self.options == other.options) and + (self.bases == other.bases) and + (self.managers == other.managers) + ) diff --git a/venv/lib/python3.7/site-packages/django/db/migrations/utils.py b/venv/lib/python3.7/site-packages/django/db/migrations/utils.py new file mode 100644 index 0000000..8939794 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/migrations/utils.py @@ -0,0 +1,17 @@ +import datetime +import re + +COMPILED_REGEX_TYPE = type(re.compile('')) + + +class RegexObject: + def __init__(self, obj): + self.pattern = obj.pattern + self.flags = obj.flags + + def __eq__(self, other): + return self.pattern == other.pattern and self.flags == other.flags + + +def get_migration_name_timestamp(): + return datetime.datetime.now().strftime("%Y%m%d_%H%M") diff --git a/venv/lib/python3.7/site-packages/django/db/models/constraints.py b/venv/lib/python3.7/site-packages/django/db/models/constraints.py new file mode 100644 index 0000000..e7f81d3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/constraints.py @@ -0,0 +1,121 @@ +from django.db.models.query_utils import Q +from django.db.models.sql.query import Query + +__all__ = ['CheckConstraint', 'UniqueConstraint'] + + +class BaseConstraint: + def __init__(self, name): + self.name = name + + def constraint_sql(self, model, schema_editor): + raise NotImplementedError('This method must be implemented by a subclass.') + + def create_sql(self, model, schema_editor): + raise NotImplementedError('This method must be implemented by a subclass.') + + def remove_sql(self, model, schema_editor): + raise NotImplementedError('This method must be implemented by a subclass.') + + def deconstruct(self): + path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) + path = path.replace('django.db.models.constraints', 'django.db.models') + return (path, (), {'name': self.name}) + + def clone(self): + _, args, kwargs = self.deconstruct() + return self.__class__(*args, **kwargs) + + +class CheckConstraint(BaseConstraint): + def __init__(self, *, check, name): + self.check = check + super().__init__(name) + + def _get_check_sql(self, model, schema_editor): + query = Query(model=model) + where = query.build_where(self.check) + compiler = query.get_compiler(connection=schema_editor.connection) + sql, params = where.as_sql(compiler, schema_editor.connection) + return sql % tuple(schema_editor.quote_value(p) for p in params) + + def constraint_sql(self, model, schema_editor): + check = self._get_check_sql(model, schema_editor) + return schema_editor._check_sql(self.name, check) + + def create_sql(self, model, schema_editor): + check = self._get_check_sql(model, schema_editor) + return schema_editor._create_check_sql(model, self.name, check) + + def remove_sql(self, model, schema_editor): + return schema_editor._delete_check_sql(model, self.name) + + def __repr__(self): + return "<%s: check='%s' name=%r>" % (self.__class__.__name__, self.check, self.name) + + def __eq__(self, other): + return ( + isinstance(other, CheckConstraint) and + self.name == other.name and + self.check == other.check + ) + + def deconstruct(self): + path, args, kwargs = super().deconstruct() + kwargs['check'] = self.check + return path, args, kwargs + + +class UniqueConstraint(BaseConstraint): + def __init__(self, *, fields, name, condition=None): + if not fields: + raise ValueError('At least one field is required to define a unique constraint.') + if not isinstance(condition, (type(None), Q)): + raise ValueError('UniqueConstraint.condition must be a Q instance.') + self.fields = tuple(fields) + self.condition = condition + super().__init__(name) + + def _get_condition_sql(self, model, schema_editor): + if self.condition is None: + return None + query = Query(model=model) + where = query.build_where(self.condition) + compiler = query.get_compiler(connection=schema_editor.connection) + sql, params = where.as_sql(compiler, schema_editor.connection) + return sql % tuple(schema_editor.quote_value(p) for p in params) + + def constraint_sql(self, model, schema_editor): + fields = [model._meta.get_field(field_name).column for field_name in self.fields] + condition = self._get_condition_sql(model, schema_editor) + return schema_editor._unique_sql(model, fields, self.name, condition=condition) + + def create_sql(self, model, schema_editor): + fields = [model._meta.get_field(field_name).column for field_name in self.fields] + condition = self._get_condition_sql(model, schema_editor) + return schema_editor._create_unique_sql(model, fields, self.name, condition=condition) + + def remove_sql(self, model, schema_editor): + condition = self._get_condition_sql(model, schema_editor) + return schema_editor._delete_unique_sql(model, self.name, condition=condition) + + def __repr__(self): + return '<%s: fields=%r name=%r%s>' % ( + self.__class__.__name__, self.fields, self.name, + '' if self.condition is None else ' condition=%s' % self.condition, + ) + + def __eq__(self, other): + return ( + isinstance(other, UniqueConstraint) and + self.name == other.name and + self.fields == other.fields and + self.condition == other.condition + ) + + def deconstruct(self): + path, args, kwargs = super().deconstruct() + kwargs['fields'] = self.fields + if self.condition: + kwargs['condition'] = self.condition + return path, args, kwargs diff --git a/venv/lib/python3.7/site-packages/django/db/models/fields/files.py b/venv/lib/python3.7/site-packages/django/db/models/fields/files.py new file mode 100644 index 0000000..bd8da95 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/fields/files.py @@ -0,0 +1,466 @@ +import datetime +import posixpath + +from django import forms +from django.core import checks +from django.core.files.base import File +from django.core.files.images import ImageFile +from django.core.files.storage import default_storage +from django.db.models import signals +from django.db.models.fields import Field +from django.utils.translation import gettext_lazy as _ + + +class FieldFile(File): + def __init__(self, instance, field, name): + super().__init__(None, name) + self.instance = instance + self.field = field + self.storage = field.storage + self._committed = True + + def __eq__(self, other): + # Older code may be expecting FileField values to be simple strings. + # By overriding the == operator, it can remain backwards compatibility. + if hasattr(other, 'name'): + return self.name == other.name + return self.name == other + + def __hash__(self): + return hash(self.name) + + # The standard File contains most of the necessary properties, but + # FieldFiles can be instantiated without a name, so that needs to + # be checked for here. + + def _require_file(self): + if not self: + raise ValueError("The '%s' attribute has no file associated with it." % self.field.name) + + def _get_file(self): + self._require_file() + if getattr(self, '_file', None) is None: + self._file = self.storage.open(self.name, 'rb') + return self._file + + def _set_file(self, file): + self._file = file + + def _del_file(self): + del self._file + + file = property(_get_file, _set_file, _del_file) + + @property + def path(self): + self._require_file() + return self.storage.path(self.name) + + @property + def url(self): + self._require_file() + return self.storage.url(self.name) + + @property + def size(self): + self._require_file() + if not self._committed: + return self.file.size + return self.storage.size(self.name) + + def open(self, mode='rb'): + self._require_file() + if getattr(self, '_file', None) is None: + self.file = self.storage.open(self.name, mode) + else: + self.file.open(mode) + return self + # open() doesn't alter the file's contents, but it does reset the pointer + open.alters_data = True + + # In addition to the standard File API, FieldFiles have extra methods + # to further manipulate the underlying file, as well as update the + # associated model instance. + + def save(self, name, content, save=True): + name = self.field.generate_filename(self.instance, name) + self.name = self.storage.save(name, content, max_length=self.field.max_length) + setattr(self.instance, self.field.name, self.name) + self._committed = True + + # Save the object because it has changed, unless save is False + if save: + self.instance.save() + save.alters_data = True + + def delete(self, save=True): + if not self: + return + # Only close the file if it's already open, which we know by the + # presence of self._file + if hasattr(self, '_file'): + self.close() + del self.file + + self.storage.delete(self.name) + + self.name = None + setattr(self.instance, self.field.name, self.name) + self._committed = False + + if save: + self.instance.save() + delete.alters_data = True + + @property + def closed(self): + file = getattr(self, '_file', None) + return file is None or file.closed + + def close(self): + file = getattr(self, '_file', None) + if file is not None: + file.close() + + def __getstate__(self): + # FieldFile needs access to its associated model field and an instance + # it's attached to in order to work properly, but the only necessary + # data to be pickled is the file's name itself. Everything else will + # be restored later, by FileDescriptor below. + return {'name': self.name, 'closed': False, '_committed': True, '_file': None} + + +class FileDescriptor: + """ + The descriptor for the file attribute on the model instance. Return a + FieldFile when accessed so you can write code like:: + + >>> from myapp.models import MyModel + >>> instance = MyModel.objects.get(pk=1) + >>> instance.file.size + + Assign a file object on assignment so you can do:: + + >>> with open('/path/to/hello.world', 'r') as f: + ... instance.file = File(f) + """ + def __init__(self, field): + self.field = field + + def __get__(self, instance, cls=None): + if instance is None: + return self + + # This is slightly complicated, so worth an explanation. + # instance.file`needs to ultimately return some instance of `File`, + # probably a subclass. Additionally, this returned object needs to have + # the FieldFile API so that users can easily do things like + # instance.file.path and have that delegated to the file storage engine. + # Easy enough if we're strict about assignment in __set__, but if you + # peek below you can see that we're not. So depending on the current + # value of the field we have to dynamically construct some sort of + # "thing" to return. + + # The instance dict contains whatever was originally assigned + # in __set__. + if self.field.name in instance.__dict__: + file = instance.__dict__[self.field.name] + else: + instance.refresh_from_db(fields=[self.field.name]) + file = getattr(instance, self.field.name) + + # If this value is a string (instance.file = "path/to/file") or None + # then we simply wrap it with the appropriate attribute class according + # to the file field. [This is FieldFile for FileFields and + # ImageFieldFile for ImageFields; it's also conceivable that user + # subclasses might also want to subclass the attribute class]. This + # object understands how to convert a path to a file, and also how to + # handle None. + if isinstance(file, str) or file is None: + attr = self.field.attr_class(instance, self.field, file) + instance.__dict__[self.field.name] = attr + + # Other types of files may be assigned as well, but they need to have + # the FieldFile interface added to them. Thus, we wrap any other type of + # File inside a FieldFile (well, the field's attr_class, which is + # usually FieldFile). + elif isinstance(file, File) and not isinstance(file, FieldFile): + file_copy = self.field.attr_class(instance, self.field, file.name) + file_copy.file = file + file_copy._committed = False + instance.__dict__[self.field.name] = file_copy + + # Finally, because of the (some would say boneheaded) way pickle works, + # the underlying FieldFile might not actually itself have an associated + # file. So we need to reset the details of the FieldFile in those cases. + elif isinstance(file, FieldFile) and not hasattr(file, 'field'): + file.instance = instance + file.field = self.field + file.storage = self.field.storage + + # Make sure that the instance is correct. + elif isinstance(file, FieldFile) and instance is not file.instance: + file.instance = instance + + # That was fun, wasn't it? + return instance.__dict__[self.field.name] + + def __set__(self, instance, value): + instance.__dict__[self.field.name] = value + + +class FileField(Field): + + # The class to wrap instance attributes in. Accessing the file object off + # the instance will always return an instance of attr_class. + attr_class = FieldFile + + # The descriptor to use for accessing the attribute off of the class. + descriptor_class = FileDescriptor + + description = _("File") + + def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, **kwargs): + self._primary_key_set_explicitly = 'primary_key' in kwargs + + self.storage = storage or default_storage + self.upload_to = upload_to + + kwargs.setdefault('max_length', 100) + super().__init__(verbose_name, name, **kwargs) + + def check(self, **kwargs): + return [ + *super().check(**kwargs), + *self._check_primary_key(), + *self._check_upload_to(), + ] + + def _check_primary_key(self): + if self._primary_key_set_explicitly: + return [ + checks.Error( + "'primary_key' is not a valid argument for a %s." % self.__class__.__name__, + obj=self, + id='fields.E201', + ) + ] + else: + return [] + + def _check_upload_to(self): + if isinstance(self.upload_to, str) and self.upload_to.startswith('/'): + return [ + checks.Error( + "%s's 'upload_to' argument must be a relative path, not an " + "absolute path." % self.__class__.__name__, + obj=self, + id='fields.E202', + hint='Remove the leading slash.', + ) + ] + else: + return [] + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + if kwargs.get("max_length") == 100: + del kwargs["max_length"] + kwargs['upload_to'] = self.upload_to + if self.storage is not default_storage: + kwargs['storage'] = self.storage + return name, path, args, kwargs + + def get_internal_type(self): + return "FileField" + + def get_prep_value(self, value): + value = super().get_prep_value(value) + # Need to convert File objects provided via a form to string for database insertion + if value is None: + return None + return str(value) + + def pre_save(self, model_instance, add): + file = super().pre_save(model_instance, add) + if file and not file._committed: + # Commit the file to storage prior to saving the model + file.save(file.name, file.file, save=False) + return file + + def contribute_to_class(self, cls, name, **kwargs): + super().contribute_to_class(cls, name, **kwargs) + setattr(cls, self.name, self.descriptor_class(self)) + + def generate_filename(self, instance, filename): + """ + Apply (if callable) or prepend (if a string) upload_to to the filename, + then delegate further processing of the name to the storage backend. + Until the storage layer, all file paths are expected to be Unix style + (with forward slashes). + """ + if callable(self.upload_to): + filename = self.upload_to(instance, filename) + else: + dirname = datetime.datetime.now().strftime(self.upload_to) + filename = posixpath.join(dirname, filename) + return self.storage.generate_filename(filename) + + def save_form_data(self, instance, data): + # Important: None means "no change", other false value means "clear" + # This subtle distinction (rather than a more explicit marker) is + # needed because we need to consume values that are also sane for a + # regular (non Model-) Form to find in its cleaned_data dictionary. + if data is not None: + # This value will be converted to str and stored in the + # database, so leaving False as-is is not acceptable. + setattr(instance, self.name, data or '') + + def formfield(self, **kwargs): + return super().formfield(**{ + 'form_class': forms.FileField, + 'max_length': self.max_length, + **kwargs, + }) + + +class ImageFileDescriptor(FileDescriptor): + """ + Just like the FileDescriptor, but for ImageFields. The only difference is + assigning the width/height to the width_field/height_field, if appropriate. + """ + def __set__(self, instance, value): + previous_file = instance.__dict__.get(self.field.name) + super().__set__(instance, value) + + # To prevent recalculating image dimensions when we are instantiating + # an object from the database (bug #11084), only update dimensions if + # the field had a value before this assignment. Since the default + # value for FileField subclasses is an instance of field.attr_class, + # previous_file will only be None when we are called from + # Model.__init__(). The ImageField.update_dimension_fields method + # hooked up to the post_init signal handles the Model.__init__() cases. + # Assignment happening outside of Model.__init__() will trigger the + # update right here. + if previous_file is not None: + self.field.update_dimension_fields(instance, force=True) + + +class ImageFieldFile(ImageFile, FieldFile): + def delete(self, save=True): + # Clear the image dimensions cache + if hasattr(self, '_dimensions_cache'): + del self._dimensions_cache + super().delete(save) + + +class ImageField(FileField): + attr_class = ImageFieldFile + descriptor_class = ImageFileDescriptor + description = _("Image") + + def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs): + self.width_field, self.height_field = width_field, height_field + super().__init__(verbose_name, name, **kwargs) + + def check(self, **kwargs): + return [ + *super().check(**kwargs), + *self._check_image_library_installed(), + ] + + def _check_image_library_installed(self): + try: + from PIL import Image # NOQA + except ImportError: + return [ + checks.Error( + 'Cannot use ImageField because Pillow is not installed.', + hint=('Get Pillow at https://pypi.org/project/Pillow/ ' + 'or run command "pip install Pillow".'), + obj=self, + id='fields.E210', + ) + ] + else: + return [] + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + if self.width_field: + kwargs['width_field'] = self.width_field + if self.height_field: + kwargs['height_field'] = self.height_field + return name, path, args, kwargs + + def contribute_to_class(self, cls, name, **kwargs): + super().contribute_to_class(cls, name, **kwargs) + # Attach update_dimension_fields so that dimension fields declared + # after their corresponding image field don't stay cleared by + # Model.__init__, see bug #11196. + # Only run post-initialization dimension update on non-abstract models + if not cls._meta.abstract: + signals.post_init.connect(self.update_dimension_fields, sender=cls) + + def update_dimension_fields(self, instance, force=False, *args, **kwargs): + """ + Update field's width and height fields, if defined. + + This method is hooked up to model's post_init signal to update + dimensions after instantiating a model instance. However, dimensions + won't be updated if the dimensions fields are already populated. This + avoids unnecessary recalculation when loading an object from the + database. + + Dimensions can be forced to update with force=True, which is how + ImageFileDescriptor.__set__ calls this method. + """ + # Nothing to update if the field doesn't have dimension fields or if + # the field is deferred. + has_dimension_fields = self.width_field or self.height_field + if not has_dimension_fields or self.attname not in instance.__dict__: + return + + # getattr will call the ImageFileDescriptor's __get__ method, which + # coerces the assigned value into an instance of self.attr_class + # (ImageFieldFile in this case). + file = getattr(instance, self.attname) + + # Nothing to update if we have no file and not being forced to update. + if not file and not force: + return + + dimension_fields_filled = not( + (self.width_field and not getattr(instance, self.width_field)) or + (self.height_field and not getattr(instance, self.height_field)) + ) + # When both dimension fields have values, we are most likely loading + # data from the database or updating an image field that already had + # an image stored. In the first case, we don't want to update the + # dimension fields because we are already getting their values from the + # database. In the second case, we do want to update the dimensions + # fields and will skip this return because force will be True since we + # were called from ImageFileDescriptor.__set__. + if dimension_fields_filled and not force: + return + + # file should be an instance of ImageFieldFile or should be None. + if file: + width = file.width + height = file.height + else: + # No file, so clear dimensions fields. + width = None + height = None + + # Update the width and height fields. + if self.width_field: + setattr(instance, self.width_field, width) + if self.height_field: + setattr(instance, self.height_field, height) + + def formfield(self, **kwargs): + return super().formfield(**{ + 'form_class': forms.ImageField, + **kwargs, + }) diff --git a/venv/lib/python3.7/site-packages/django/db/models/fields/proxy.py b/venv/lib/python3.7/site-packages/django/db/models/fields/proxy.py new file mode 100644 index 0000000..0ecf04a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/fields/proxy.py @@ -0,0 +1,18 @@ +""" +Field-like classes that aren't really fields. It's easier to use objects that +have the same attributes as fields sometimes (avoids a lot of special casing). +""" + +from django.db.models import fields + + +class OrderWrt(fields.IntegerField): + """ + A proxy for the _order database field that is used when + Meta.order_with_respect_to is specified. + """ + + def __init__(self, *args, **kwargs): + kwargs['name'] = '_order' + kwargs['editable'] = False + super().__init__(*args, **kwargs) diff --git a/venv/lib/python3.7/site-packages/django/db/models/functions/mixins.py b/venv/lib/python3.7/site-packages/django/db/models/functions/mixins.py new file mode 100644 index 0000000..636340f --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/functions/mixins.py @@ -0,0 +1,50 @@ +import sys + +from django.db.models.fields import DecimalField, FloatField, IntegerField +from django.db.models.functions import Cast + + +class FixDecimalInputMixin: + + def as_postgresql(self, compiler, connection, **extra_context): + # Cast FloatField to DecimalField as PostgreSQL doesn't support the + # following function signatures: + # - LOG(double, double) + # - MOD(double, double) + output_field = DecimalField(decimal_places=sys.float_info.dig, max_digits=1000) + clone = self.copy() + clone.set_source_expressions([ + Cast(expression, output_field) if isinstance(expression.output_field, FloatField) + else expression for expression in self.get_source_expressions() + ]) + return clone.as_sql(compiler, connection, **extra_context) + + +class FixDurationInputMixin: + + def as_mysql(self, compiler, connection, **extra_context): + sql, params = super().as_sql(compiler, connection, **extra_context) + if self.output_field.get_internal_type() == 'DurationField': + sql = 'CAST(%s AS SIGNED)' % sql + return sql, params + + def as_oracle(self, compiler, connection, **extra_context): + if self.output_field.get_internal_type() == 'DurationField': + expression = self.get_source_expressions()[0] + options = self._get_repr_options() + from django.db.backends.oracle.functions import IntervalToSeconds, SecondsToInterval + return compiler.compile( + SecondsToInterval(self.__class__(IntervalToSeconds(expression), **options)) + ) + return super().as_sql(compiler, connection, **extra_context) + + +class NumericOutputFieldMixin: + + def _resolve_output_field(self): + source_fields = self.get_source_fields() + if any(isinstance(s, DecimalField) for s in source_fields): + return DecimalField() + if any(isinstance(s, IntegerField) for s in source_fields): + return FloatField() + return super()._resolve_output_field() if source_fields else FloatField() diff --git a/venv/lib/python3.7/site-packages/django/db/models/functions/text.py b/venv/lib/python3.7/site-packages/django/db/models/functions/text.py new file mode 100644 index 0000000..a79c76a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/functions/text.py @@ -0,0 +1,267 @@ +from django.db.models.expressions import Func, Value +from django.db.models.fields import IntegerField +from django.db.models.functions import Coalesce +from django.db.models.lookups import Transform + + +class BytesToCharFieldConversionMixin: + """ + Convert CharField results from bytes to str. + + MySQL returns long data types (bytes) instead of chars when it can't + determine the length of the result string. For example: + LPAD(column1, CHAR_LENGTH(column2), ' ') + returns the LONGTEXT (bytes) instead of VARCHAR. + """ + def convert_value(self, value, expression, connection): + if connection.features.db_functions_convert_bytes_to_str: + if self.output_field.get_internal_type() == 'CharField' and isinstance(value, bytes): + return value.decode() + return super().convert_value(value, expression, connection) + + +class Chr(Transform): + function = 'CHR' + lookup_name = 'chr' + + def as_mysql(self, compiler, connection, **extra_context): + return super().as_sql( + compiler, connection, function='CHAR', + template='%(function)s(%(expressions)s USING utf16)', + **extra_context + ) + + def as_oracle(self, compiler, connection, **extra_context): + return super().as_sql( + compiler, connection, + template='%(function)s(%(expressions)s USING NCHAR_CS)', + **extra_context + ) + + def as_sqlite(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='CHAR', **extra_context) + + +class ConcatPair(Func): + """ + Concatenate two arguments together. This is used by `Concat` because not + all backend databases support more than two arguments. + """ + function = 'CONCAT' + + def as_sqlite(self, compiler, connection, **extra_context): + coalesced = self.coalesce() + return super(ConcatPair, coalesced).as_sql( + compiler, connection, template='%(expressions)s', arg_joiner=' || ', + **extra_context + ) + + def as_mysql(self, compiler, connection, **extra_context): + # Use CONCAT_WS with an empty separator so that NULLs are ignored. + return super().as_sql( + compiler, connection, function='CONCAT_WS', + template="%(function)s('', %(expressions)s)", + **extra_context + ) + + def coalesce(self): + # null on either side results in null for expression, wrap with coalesce + c = self.copy() + c.set_source_expressions([ + Coalesce(expression, Value('')) for expression in c.get_source_expressions() + ]) + return c + + +class Concat(Func): + """ + Concatenate text fields together. Backends that result in an entire + null expression when any arguments are null will wrap each argument in + coalesce functions to ensure a non-null result. + """ + function = None + template = "%(expressions)s" + + def __init__(self, *expressions, **extra): + if len(expressions) < 2: + raise ValueError('Concat must take at least two expressions') + paired = self._paired(expressions) + super().__init__(paired, **extra) + + def _paired(self, expressions): + # wrap pairs of expressions in successive concat functions + # exp = [a, b, c, d] + # -> ConcatPair(a, ConcatPair(b, ConcatPair(c, d)))) + if len(expressions) == 2: + return ConcatPair(*expressions) + return ConcatPair(expressions[0], self._paired(expressions[1:])) + + +class Left(Func): + function = 'LEFT' + arity = 2 + + def __init__(self, expression, length, **extra): + """ + expression: the name of a field, or an expression returning a string + length: the number of characters to return from the start of the string + """ + if not hasattr(length, 'resolve_expression'): + if length < 1: + raise ValueError("'length' must be greater than 0.") + super().__init__(expression, length, **extra) + + def get_substr(self): + return Substr(self.source_expressions[0], Value(1), self.source_expressions[1]) + + def as_oracle(self, compiler, connection, **extra_context): + return self.get_substr().as_oracle(compiler, connection, **extra_context) + + def as_sqlite(self, compiler, connection, **extra_context): + return self.get_substr().as_sqlite(compiler, connection, **extra_context) + + +class Length(Transform): + """Return the number of characters in the expression.""" + function = 'LENGTH' + lookup_name = 'length' + output_field = IntegerField() + + def as_mysql(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='CHAR_LENGTH', **extra_context) + + +class Lower(Transform): + function = 'LOWER' + lookup_name = 'lower' + + +class LPad(BytesToCharFieldConversionMixin, Func): + function = 'LPAD' + + def __init__(self, expression, length, fill_text=Value(' '), **extra): + if not hasattr(length, 'resolve_expression') and length is not None and length < 0: + raise ValueError("'length' must be greater or equal to 0.") + super().__init__(expression, length, fill_text, **extra) + + +class LTrim(Transform): + function = 'LTRIM' + lookup_name = 'ltrim' + + +class Ord(Transform): + function = 'ASCII' + lookup_name = 'ord' + output_field = IntegerField() + + def as_mysql(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='ORD', **extra_context) + + def as_sqlite(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='UNICODE', **extra_context) + + +class Repeat(BytesToCharFieldConversionMixin, Func): + function = 'REPEAT' + + def __init__(self, expression, number, **extra): + if not hasattr(number, 'resolve_expression') and number is not None and number < 0: + raise ValueError("'number' must be greater or equal to 0.") + super().__init__(expression, number, **extra) + + def as_oracle(self, compiler, connection, **extra_context): + expression, number = self.source_expressions + length = None if number is None else Length(expression) * number + rpad = RPad(expression, length, expression) + return rpad.as_sql(compiler, connection, **extra_context) + + +class Replace(Func): + function = 'REPLACE' + + def __init__(self, expression, text, replacement=Value(''), **extra): + super().__init__(expression, text, replacement, **extra) + + +class Reverse(Transform): + function = 'REVERSE' + lookup_name = 'reverse' + + def as_oracle(self, compiler, connection, **extra_context): + # REVERSE in Oracle is undocumented and doesn't support multi-byte + # strings. Use a special subquery instead. + return super().as_sql( + compiler, connection, + template=( + '(SELECT LISTAGG(s) WITHIN GROUP (ORDER BY n DESC) FROM ' + '(SELECT LEVEL n, SUBSTR(%(expressions)s, LEVEL, 1) s ' + 'FROM DUAL CONNECT BY LEVEL <= LENGTH(%(expressions)s)) ' + 'GROUP BY %(expressions)s)' + ), + **extra_context + ) + + +class Right(Left): + function = 'RIGHT' + + def get_substr(self): + return Substr(self.source_expressions[0], self.source_expressions[1] * Value(-1)) + + +class RPad(LPad): + function = 'RPAD' + + +class RTrim(Transform): + function = 'RTRIM' + lookup_name = 'rtrim' + + +class StrIndex(Func): + """ + Return a positive integer corresponding to the 1-indexed position of the + first occurrence of a substring inside another string, or 0 if the + substring is not found. + """ + function = 'INSTR' + arity = 2 + output_field = IntegerField() + + def as_postgresql(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='STRPOS', **extra_context) + + +class Substr(Func): + function = 'SUBSTRING' + + def __init__(self, expression, pos, length=None, **extra): + """ + expression: the name of a field, or an expression returning a string + pos: an integer > 0, or an expression returning an integer + length: an optional number of characters to return + """ + if not hasattr(pos, 'resolve_expression'): + if pos < 1: + raise ValueError("'pos' must be greater than 0") + expressions = [expression, pos] + if length is not None: + expressions.append(length) + super().__init__(*expressions, **extra) + + def as_sqlite(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='SUBSTR', **extra_context) + + def as_oracle(self, compiler, connection, **extra_context): + return super().as_sql(compiler, connection, function='SUBSTR', **extra_context) + + +class Trim(Transform): + function = 'TRIM' + lookup_name = 'trim' + + +class Upper(Transform): + function = 'UPPER' + lookup_name = 'upper' diff --git a/venv/lib/python3.7/site-packages/django/db/models/functions/window.py b/venv/lib/python3.7/site-packages/django/db/models/functions/window.py new file mode 100644 index 0000000..84b2b24 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/functions/window.py @@ -0,0 +1,108 @@ +from django.db.models.expressions import Func +from django.db.models.fields import FloatField, IntegerField + +__all__ = [ + 'CumeDist', 'DenseRank', 'FirstValue', 'Lag', 'LastValue', 'Lead', + 'NthValue', 'Ntile', 'PercentRank', 'Rank', 'RowNumber', +] + + +class CumeDist(Func): + function = 'CUME_DIST' + output_field = FloatField() + window_compatible = True + + +class DenseRank(Func): + function = 'DENSE_RANK' + output_field = IntegerField() + window_compatible = True + + +class FirstValue(Func): + arity = 1 + function = 'FIRST_VALUE' + window_compatible = True + + +class LagLeadFunction(Func): + window_compatible = True + + def __init__(self, expression, offset=1, default=None, **extra): + if expression is None: + raise ValueError( + '%s requires a non-null source expression.' % + self.__class__.__name__ + ) + if offset is None or offset <= 0: + raise ValueError( + '%s requires a positive integer for the offset.' % + self.__class__.__name__ + ) + args = (expression, offset) + if default is not None: + args += (default,) + super().__init__(*args, **extra) + + def _resolve_output_field(self): + sources = self.get_source_expressions() + return sources[0].output_field + + +class Lag(LagLeadFunction): + function = 'LAG' + + +class LastValue(Func): + arity = 1 + function = 'LAST_VALUE' + window_compatible = True + + +class Lead(LagLeadFunction): + function = 'LEAD' + + +class NthValue(Func): + function = 'NTH_VALUE' + window_compatible = True + + def __init__(self, expression, nth=1, **extra): + if expression is None: + raise ValueError('%s requires a non-null source expression.' % self.__class__.__name__) + if nth is None or nth <= 0: + raise ValueError('%s requires a positive integer as for nth.' % self.__class__.__name__) + super().__init__(expression, nth, **extra) + + def _resolve_output_field(self): + sources = self.get_source_expressions() + return sources[0].output_field + + +class Ntile(Func): + function = 'NTILE' + output_field = IntegerField() + window_compatible = True + + def __init__(self, num_buckets=1, **extra): + if num_buckets <= 0: + raise ValueError('num_buckets must be greater than 0.') + super().__init__(num_buckets, **extra) + + +class PercentRank(Func): + function = 'PERCENT_RANK' + output_field = FloatField() + window_compatible = True + + +class Rank(Func): + function = 'RANK' + output_field = IntegerField() + window_compatible = True + + +class RowNumber(Func): + function = 'ROW_NUMBER' + output_field = IntegerField() + window_compatible = True diff --git a/venv/lib/python3.7/site-packages/django/db/models/sql/datastructures.py b/venv/lib/python3.7/site-packages/django/db/models/sql/datastructures.py new file mode 100644 index 0000000..9c3bb05 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/db/models/sql/datastructures.py @@ -0,0 +1,170 @@ +""" +Useful auxiliary data structures for query construction. Not useful outside +the SQL domain. +""" +# for backwards-compatibility in Django 1.11 +from django.core.exceptions import EmptyResultSet # NOQA: F401 +from django.db.models.sql.constants import INNER, LOUTER + + +class MultiJoin(Exception): + """ + Used by join construction code to indicate the point at which a + multi-valued join was attempted (if the caller wants to treat that + exceptionally). + """ + def __init__(self, names_pos, path_with_names): + self.level = names_pos + # The path travelled, this includes the path to the multijoin. + self.names_with_path = path_with_names + + +class Empty: + pass + + +class Join: + """ + Used by sql.Query and sql.SQLCompiler to generate JOIN clauses into the + FROM entry. For example, the SQL generated could be + LEFT OUTER JOIN "sometable" T1 ON ("othertable"."sometable_id" = "sometable"."id") + + This class is primarily used in Query.alias_map. All entries in alias_map + must be Join compatible by providing the following attributes and methods: + - table_name (string) + - table_alias (possible alias for the table, can be None) + - join_type (can be None for those entries that aren't joined from + anything) + - parent_alias (which table is this join's parent, can be None similarly + to join_type) + - as_sql() + - relabeled_clone() + """ + def __init__(self, table_name, parent_alias, table_alias, join_type, + join_field, nullable, filtered_relation=None): + # Join table + self.table_name = table_name + self.parent_alias = parent_alias + # Note: table_alias is not necessarily known at instantiation time. + self.table_alias = table_alias + # LOUTER or INNER + self.join_type = join_type + # A list of 2-tuples to use in the ON clause of the JOIN. + # Each 2-tuple will create one join condition in the ON clause. + self.join_cols = join_field.get_joining_columns() + # Along which field (or ForeignObjectRel in the reverse join case) + self.join_field = join_field + # Is this join nullabled? + self.nullable = nullable + self.filtered_relation = filtered_relation + + def as_sql(self, compiler, connection): + """ + Generate the full + LEFT OUTER JOIN sometable ON sometable.somecol = othertable.othercol, params + clause for this join. + """ + join_conditions = [] + params = [] + qn = compiler.quote_name_unless_alias + qn2 = connection.ops.quote_name + + # Add a join condition for each pair of joining columns. + for lhs_col, rhs_col in self.join_cols: + join_conditions.append('%s.%s = %s.%s' % ( + qn(self.parent_alias), + qn2(lhs_col), + qn(self.table_alias), + qn2(rhs_col), + )) + + # Add a single condition inside parentheses for whatever + # get_extra_restriction() returns. + extra_cond = self.join_field.get_extra_restriction( + compiler.query.where_class, self.table_alias, self.parent_alias) + if extra_cond: + extra_sql, extra_params = compiler.compile(extra_cond) + join_conditions.append('(%s)' % extra_sql) + params.extend(extra_params) + if self.filtered_relation: + extra_sql, extra_params = compiler.compile(self.filtered_relation) + if extra_sql: + join_conditions.append('(%s)' % extra_sql) + params.extend(extra_params) + if not join_conditions: + # This might be a rel on the other end of an actual declared field. + declared_field = getattr(self.join_field, 'field', self.join_field) + raise ValueError( + "Join generated an empty ON clause. %s did not yield either " + "joining columns or extra restrictions." % declared_field.__class__ + ) + on_clause_sql = ' AND '.join(join_conditions) + alias_str = '' if self.table_alias == self.table_name else (' %s' % self.table_alias) + sql = '%s %s%s ON (%s)' % (self.join_type, qn(self.table_name), alias_str, on_clause_sql) + return sql, params + + def relabeled_clone(self, change_map): + new_parent_alias = change_map.get(self.parent_alias, self.parent_alias) + new_table_alias = change_map.get(self.table_alias, self.table_alias) + if self.filtered_relation is not None: + filtered_relation = self.filtered_relation.clone() + filtered_relation.path = [change_map.get(p, p) for p in self.filtered_relation.path] + else: + filtered_relation = None + return self.__class__( + self.table_name, new_parent_alias, new_table_alias, self.join_type, + self.join_field, self.nullable, filtered_relation=filtered_relation, + ) + + def equals(self, other, with_filtered_relation): + return ( + isinstance(other, self.__class__) and + self.table_name == other.table_name and + self.parent_alias == other.parent_alias and + self.join_field == other.join_field and + (not with_filtered_relation or self.filtered_relation == other.filtered_relation) + ) + + def __eq__(self, other): + return self.equals(other, with_filtered_relation=True) + + def demote(self): + new = self.relabeled_clone({}) + new.join_type = INNER + return new + + def promote(self): + new = self.relabeled_clone({}) + new.join_type = LOUTER + return new + + +class BaseTable: + """ + The BaseTable class is used for base table references in FROM clause. For + example, the SQL "foo" in + SELECT * FROM "foo" WHERE somecond + could be generated by this class. + """ + join_type = None + parent_alias = None + filtered_relation = None + + def __init__(self, table_name, alias): + self.table_name = table_name + self.table_alias = alias + + def as_sql(self, compiler, connection): + alias_str = '' if self.table_alias == self.table_name else (' %s' % self.table_alias) + base_sql = compiler.quote_name_unless_alias(self.table_name) + return base_sql + alias_str, [] + + def relabeled_clone(self, change_map): + return self.__class__(self.table_name, change_map.get(self.table_alias, self.table_alias)) + + def equals(self, other, with_filtered_relation): + return ( + isinstance(self, other.__class__) and + self.table_name == other.table_name and + self.table_alias == other.table_alias + ) diff --git a/venv/lib/python3.7/site-packages/django/dispatch/__init__.py b/venv/lib/python3.7/site-packages/django/dispatch/__init__.py new file mode 100644 index 0000000..a615f99 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/dispatch/__init__.py @@ -0,0 +1,9 @@ +"""Multi-consumer multi-producer dispatching mechanism + +Originally based on pydispatch (BSD) https://pypi.org/project/PyDispatcher/2.0.1/ +See license.txt for original license. + +Heavily modified for Django's purposes. +""" + +from django.dispatch.dispatcher import Signal, receiver # NOQA diff --git a/venv/lib/python3.7/site-packages/django/dispatch/license.txt b/venv/lib/python3.7/site-packages/django/dispatch/license.txt new file mode 100644 index 0000000..505090d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/dispatch/license.txt @@ -0,0 +1,36 @@ +django.dispatch was originally forked from PyDispatcher. + +PyDispatcher License: + + Copyright (c) 2001-2003, Patrick K. O'Brien and Contributors + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + + The name of Patrick K. O'Brien, or the name of any Contributor, + may not be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/venv/lib/python3.7/site-packages/django/forms/__init__.py b/venv/lib/python3.7/site-packages/django/forms/__init__.py new file mode 100644 index 0000000..1c31921 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/__init__.py @@ -0,0 +1,11 @@ +""" +Django validation and HTML form handling. +""" + +from django.core.exceptions import ValidationError # NOQA +from django.forms.boundfield import * # NOQA +from django.forms.fields import * # NOQA +from django.forms.forms import * # NOQA +from django.forms.formsets import * # NOQA +from django.forms.models import * # NOQA +from django.forms.widgets import * # NOQA diff --git a/venv/lib/python3.7/site-packages/django/forms/forms.py b/venv/lib/python3.7/site-packages/django/forms/forms.py new file mode 100644 index 0000000..51e6465 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/forms.py @@ -0,0 +1,506 @@ +""" +Form classes +""" + +import copy +from collections import OrderedDict + +from django.core.exceptions import NON_FIELD_ERRORS, ValidationError +# BoundField is imported for backwards compatibility in Django 1.9 +from django.forms.boundfield import BoundField # NOQA +from django.forms.fields import Field, FileField +# pretty_name is imported for backwards compatibility in Django 1.9 +from django.forms.utils import ErrorDict, ErrorList, pretty_name # NOQA +from django.forms.widgets import Media, MediaDefiningClass +from django.utils.functional import cached_property +from django.utils.html import conditional_escape, html_safe +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ + +from .renderers import get_default_renderer + +__all__ = ('BaseForm', 'Form') + + +class DeclarativeFieldsMetaclass(MediaDefiningClass): + """Collect Fields declared on the base classes.""" + def __new__(mcs, name, bases, attrs): + # Collect fields from current class. + current_fields = [] + for key, value in list(attrs.items()): + if isinstance(value, Field): + current_fields.append((key, value)) + attrs.pop(key) + attrs['declared_fields'] = OrderedDict(current_fields) + + new_class = super(DeclarativeFieldsMetaclass, mcs).__new__(mcs, name, bases, attrs) + + # Walk through the MRO. + declared_fields = OrderedDict() + for base in reversed(new_class.__mro__): + # Collect fields from base class. + if hasattr(base, 'declared_fields'): + declared_fields.update(base.declared_fields) + + # Field shadowing. + for attr, value in base.__dict__.items(): + if value is None and attr in declared_fields: + declared_fields.pop(attr) + + new_class.base_fields = declared_fields + new_class.declared_fields = declared_fields + + return new_class + + @classmethod + def __prepare__(metacls, name, bases, **kwds): + # Remember the order in which form fields are defined. + return OrderedDict() + + +@html_safe +class BaseForm: + """ + The main implementation of all the Form logic. Note that this class is + different than Form. See the comments by the Form class for more info. Any + improvements to the form API should be made to this class, not to the Form + class. + """ + default_renderer = None + field_order = None + prefix = None + use_required_attribute = True + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, + initial=None, error_class=ErrorList, label_suffix=None, + empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None): + self.is_bound = data is not None or files is not None + self.data = {} if data is None else data + self.files = {} if files is None else files + self.auto_id = auto_id + if prefix is not None: + self.prefix = prefix + self.initial = initial or {} + self.error_class = error_class + # Translators: This is the default suffix added to form field labels + self.label_suffix = label_suffix if label_suffix is not None else _(':') + self.empty_permitted = empty_permitted + self._errors = None # Stores the errors after clean() has been called. + + # The base_fields class attribute is the *class-wide* definition of + # fields. Because a particular *instance* of the class might want to + # alter self.fields, we create self.fields here by copying base_fields. + # Instances should always modify self.fields; they should not modify + # self.base_fields. + self.fields = copy.deepcopy(self.base_fields) + self._bound_fields_cache = {} + self.order_fields(self.field_order if field_order is None else field_order) + + if use_required_attribute is not None: + self.use_required_attribute = use_required_attribute + + if self.empty_permitted and self.use_required_attribute: + raise ValueError( + 'The empty_permitted and use_required_attribute arguments may ' + 'not both be True.' + ) + + # Initialize form renderer. Use a global default if not specified + # either as an argument or as self.default_renderer. + if renderer is None: + if self.default_renderer is None: + renderer = get_default_renderer() + else: + renderer = self.default_renderer + if isinstance(self.default_renderer, type): + renderer = renderer() + self.renderer = renderer + + def order_fields(self, field_order): + """ + Rearrange the fields according to field_order. + + field_order is a list of field names specifying the order. Append fields + not included in the list in the default order for backward compatibility + with subclasses not overriding field_order. If field_order is None, + keep all fields in the order defined in the class. Ignore unknown + fields in field_order to allow disabling fields in form subclasses + without redefining ordering. + """ + if field_order is None: + return + fields = OrderedDict() + for key in field_order: + try: + fields[key] = self.fields.pop(key) + except KeyError: # ignore unknown fields + pass + fields.update(self.fields) # add remaining fields in original order + self.fields = fields + + def __str__(self): + return self.as_table() + + def __repr__(self): + if self._errors is None: + is_valid = "Unknown" + else: + is_valid = self.is_bound and not self._errors + return '<%(cls)s bound=%(bound)s, valid=%(valid)s, fields=(%(fields)s)>' % { + 'cls': self.__class__.__name__, + 'bound': self.is_bound, + 'valid': is_valid, + 'fields': ';'.join(self.fields), + } + + def __iter__(self): + for name in self.fields: + yield self[name] + + def __getitem__(self, name): + """Return a BoundField with the given name.""" + try: + field = self.fields[name] + except KeyError: + raise KeyError( + "Key '%s' not found in '%s'. Choices are: %s." % ( + name, + self.__class__.__name__, + ', '.join(sorted(f for f in self.fields)), + ) + ) + if name not in self._bound_fields_cache: + self._bound_fields_cache[name] = field.get_bound_field(self, name) + return self._bound_fields_cache[name] + + @property + def errors(self): + """Return an ErrorDict for the data provided for the form.""" + if self._errors is None: + self.full_clean() + return self._errors + + def is_valid(self): + """Return True if the form has no errors, or False otherwise.""" + return self.is_bound and not self.errors + + def add_prefix(self, field_name): + """ + Return the field name with a prefix appended, if this Form has a + prefix set. + + Subclasses may wish to override. + """ + return '%s-%s' % (self.prefix, field_name) if self.prefix else field_name + + def add_initial_prefix(self, field_name): + """Add a 'initial' prefix for checking dynamic initial values.""" + return 'initial-%s' % self.add_prefix(field_name) + + def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row): + "Output HTML. Used by as_table(), as_ul(), as_p()." + top_errors = self.non_field_errors() # Errors that should be displayed above all fields. + output, hidden_fields = [], [] + + for name, field in self.fields.items(): + html_class_attr = '' + bf = self[name] + bf_errors = self.error_class(bf.errors) + if bf.is_hidden: + if bf_errors: + top_errors.extend( + [_('(Hidden field %(name)s) %(error)s') % {'name': name, 'error': str(e)} + for e in bf_errors]) + hidden_fields.append(str(bf)) + else: + # Create a 'class="..."' attribute if the row should have any + # CSS classes applied. + css_classes = bf.css_classes() + if css_classes: + html_class_attr = ' class="%s"' % css_classes + + if errors_on_separate_row and bf_errors: + output.append(error_row % str(bf_errors)) + + if bf.label: + label = conditional_escape(bf.label) + label = bf.label_tag(label) or '' + else: + label = '' + + if field.help_text: + help_text = help_text_html % field.help_text + else: + help_text = '' + + output.append(normal_row % { + 'errors': bf_errors, + 'label': label, + 'field': bf, + 'help_text': help_text, + 'html_class_attr': html_class_attr, + 'css_classes': css_classes, + 'field_name': bf.html_name, + }) + + if top_errors: + output.insert(0, error_row % top_errors) + + if hidden_fields: # Insert any hidden fields in the last row. + str_hidden = ''.join(hidden_fields) + if output: + last_row = output[-1] + # Chop off the trailing row_ender (e.g. '') and + # insert the hidden fields. + if not last_row.endswith(row_ender): + # This can happen in the as_p() case (and possibly others + # that users write): if there are only top errors, we may + # not be able to conscript the last row for our purposes, + # so insert a new, empty row. + last_row = (normal_row % { + 'errors': '', + 'label': '', + 'field': '', + 'help_text': '', + 'html_class_attr': html_class_attr, + 'css_classes': '', + 'field_name': '', + }) + output.append(last_row) + output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender + else: + # If there aren't any rows in the output, just append the + # hidden fields. + output.append(str_hidden) + return mark_safe('\n'.join(output)) + + def as_table(self): + "Return this form rendered as HTML s -- excluding the
      ." + return self._html_output( + normal_row='%(label)s%(errors)s%(field)s%(help_text)s', + error_row='%s', + row_ender='', + help_text_html='
      %s', + errors_on_separate_row=False, + ) + + def as_ul(self): + "Return this form rendered as HTML
    • s -- excluding the
        ." + return self._html_output( + normal_row='%(errors)s%(label)s %(field)s%(help_text)s
      • ', + error_row='
      • %s
      • ', + row_ender='', + help_text_html=' %s', + errors_on_separate_row=False, + ) + + def as_p(self): + "Return this form rendered as HTML

        s." + return self._html_output( + normal_row='%(label)s %(field)s%(help_text)s

        ', + error_row='%s', + row_ender='

        ', + help_text_html=' %s', + errors_on_separate_row=True, + ) + + def non_field_errors(self): + """ + Return an ErrorList of errors that aren't associated with a particular + field -- i.e., from Form.clean(). Return an empty ErrorList if there + are none. + """ + return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield')) + + def add_error(self, field, error): + """ + Update the content of `self._errors`. + + The `field` argument is the name of the field to which the errors + should be added. If it's None, treat the errors as NON_FIELD_ERRORS. + + The `error` argument can be a single error, a list of errors, or a + dictionary that maps field names to lists of errors. An "error" can be + either a simple string or an instance of ValidationError with its + message attribute set and a "list or dictionary" can be an actual + `list` or `dict` or an instance of ValidationError with its + `error_list` or `error_dict` attribute set. + + If `error` is a dictionary, the `field` argument *must* be None and + errors will be added to the fields that correspond to the keys of the + dictionary. + """ + if not isinstance(error, ValidationError): + # Normalize to ValidationError and let its constructor + # do the hard work of making sense of the input. + error = ValidationError(error) + + if hasattr(error, 'error_dict'): + if field is not None: + raise TypeError( + "The argument `field` must be `None` when the `error` " + "argument contains errors for multiple fields." + ) + else: + error = error.error_dict + else: + error = {field or NON_FIELD_ERRORS: error.error_list} + + for field, error_list in error.items(): + if field not in self.errors: + if field != NON_FIELD_ERRORS and field not in self.fields: + raise ValueError( + "'%s' has no field named '%s'." % (self.__class__.__name__, field)) + if field == NON_FIELD_ERRORS: + self._errors[field] = self.error_class(error_class='nonfield') + else: + self._errors[field] = self.error_class() + self._errors[field].extend(error_list) + if field in self.cleaned_data: + del self.cleaned_data[field] + + def has_error(self, field, code=None): + return field in self.errors and ( + code is None or + any(error.code == code for error in self.errors.as_data()[field]) + ) + + def full_clean(self): + """ + Clean all of self.data and populate self._errors and self.cleaned_data. + """ + self._errors = ErrorDict() + if not self.is_bound: # Stop further processing. + return + self.cleaned_data = {} + # If the form is permitted to be empty, and none of the form data has + # changed from the initial data, short circuit any validation. + if self.empty_permitted and not self.has_changed(): + return + + self._clean_fields() + self._clean_form() + self._post_clean() + + def _clean_fields(self): + for name, field in self.fields.items(): + # value_from_datadict() gets the data from the data dictionaries. + # Each widget type knows how to retrieve its own data, because some + # widgets split data over several HTML fields. + if field.disabled: + value = self.get_initial_for_field(field, name) + else: + value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name)) + try: + if isinstance(field, FileField): + initial = self.get_initial_for_field(field, name) + value = field.clean(value, initial) + else: + value = field.clean(value) + self.cleaned_data[name] = value + if hasattr(self, 'clean_%s' % name): + value = getattr(self, 'clean_%s' % name)() + self.cleaned_data[name] = value + except ValidationError as e: + self.add_error(name, e) + + def _clean_form(self): + try: + cleaned_data = self.clean() + except ValidationError as e: + self.add_error(None, e) + else: + if cleaned_data is not None: + self.cleaned_data = cleaned_data + + def _post_clean(self): + """ + An internal hook for performing additional cleaning after form cleaning + is complete. Used for model validation in model forms. + """ + pass + + def clean(self): + """ + Hook for doing any extra form-wide cleaning after Field.clean() has been + called on every field. Any ValidationError raised by this method will + not be associated with a particular field; it will have a special-case + association with the field named '__all__'. + """ + return self.cleaned_data + + def has_changed(self): + """Return True if data differs from initial.""" + return bool(self.changed_data) + + @cached_property + def changed_data(self): + data = [] + for name, field in self.fields.items(): + prefixed_name = self.add_prefix(name) + data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name) + if not field.show_hidden_initial: + # Use the BoundField's initial as this is the value passed to + # the widget. + initial_value = self[name].initial + else: + initial_prefixed_name = self.add_initial_prefix(name) + hidden_widget = field.hidden_widget() + try: + initial_value = field.to_python(hidden_widget.value_from_datadict( + self.data, self.files, initial_prefixed_name)) + except ValidationError: + # Always assume data has changed if validation fails. + data.append(name) + continue + if field.has_changed(initial_value, data_value): + data.append(name) + return data + + @property + def media(self): + """Return all media required to render the widgets on this form.""" + media = Media() + for field in self.fields.values(): + media = media + field.widget.media + return media + + def is_multipart(self): + """ + Return True if the form needs to be multipart-encoded, i.e. it has + FileInput, or False otherwise. + """ + return any(field.widget.needs_multipart_form for field in self.fields.values()) + + def hidden_fields(self): + """ + Return a list of all the BoundField objects that are hidden fields. + Useful for manual form layout in templates. + """ + return [field for field in self if field.is_hidden] + + def visible_fields(self): + """ + Return a list of BoundField objects that aren't hidden fields. + The opposite of the hidden_fields() method. + """ + return [field for field in self if not field.is_hidden] + + def get_initial_for_field(self, field, field_name): + """ + Return initial data for field on form. Use initial data from the form + or the field, in that order. Evaluate callable values. + """ + value = self.initial.get(field_name, field.initial) + if callable(value): + value = value() + return value + + +class Form(BaseForm, metaclass=DeclarativeFieldsMetaclass): + "A collection of Fields, plus their associated data." + # This is a separate class from BaseForm in order to abstract the way + # self.fields is specified. This class (Form) is the one that does the + # fancy metaclass stuff purely for the semantic sugar -- it allows one + # to define a form using declarative syntax. + # BaseForm itself has no way of designating self.fields. diff --git a/venv/lib/python3.7/site-packages/django/forms/formsets.py b/venv/lib/python3.7/site-packages/django/forms/formsets.py new file mode 100644 index 0000000..ed93fa8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/formsets.py @@ -0,0 +1,449 @@ +from django.core.exceptions import ValidationError +from django.forms import Form +from django.forms.fields import BooleanField, IntegerField +from django.forms.utils import ErrorList +from django.forms.widgets import HiddenInput +from django.utils.functional import cached_property +from django.utils.html import html_safe +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, ngettext + +__all__ = ('BaseFormSet', 'formset_factory', 'all_valid') + +# special field names +TOTAL_FORM_COUNT = 'TOTAL_FORMS' +INITIAL_FORM_COUNT = 'INITIAL_FORMS' +MIN_NUM_FORM_COUNT = 'MIN_NUM_FORMS' +MAX_NUM_FORM_COUNT = 'MAX_NUM_FORMS' +ORDERING_FIELD_NAME = 'ORDER' +DELETION_FIELD_NAME = 'DELETE' + +# default minimum number of forms in a formset +DEFAULT_MIN_NUM = 0 + +# default maximum number of forms in a formset, to prevent memory exhaustion +DEFAULT_MAX_NUM = 1000 + + +class ManagementForm(Form): + """ + Keep track of how many form instances are displayed on the page. If adding + new forms via JavaScript, you should increment the count field of this form + as well. + """ + def __init__(self, *args, **kwargs): + self.base_fields[TOTAL_FORM_COUNT] = IntegerField(widget=HiddenInput) + self.base_fields[INITIAL_FORM_COUNT] = IntegerField(widget=HiddenInput) + # MIN_NUM_FORM_COUNT and MAX_NUM_FORM_COUNT are output with the rest of + # the management form, but only for the convenience of client-side + # code. The POST value of them returned from the client is not checked. + self.base_fields[MIN_NUM_FORM_COUNT] = IntegerField(required=False, widget=HiddenInput) + self.base_fields[MAX_NUM_FORM_COUNT] = IntegerField(required=False, widget=HiddenInput) + super().__init__(*args, **kwargs) + + +@html_safe +class BaseFormSet: + """ + A collection of instances of the same Form class. + """ + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, + initial=None, error_class=ErrorList, form_kwargs=None): + self.is_bound = data is not None or files is not None + self.prefix = prefix or self.get_default_prefix() + self.auto_id = auto_id + self.data = data or {} + self.files = files or {} + self.initial = initial + self.form_kwargs = form_kwargs or {} + self.error_class = error_class + self._errors = None + self._non_form_errors = None + + def __str__(self): + return self.as_table() + + def __iter__(self): + """Yield the forms in the order they should be rendered.""" + return iter(self.forms) + + def __getitem__(self, index): + """Return the form at the given index, based on the rendering order.""" + return self.forms[index] + + def __len__(self): + return len(self.forms) + + def __bool__(self): + """ + Return True since all formsets have a management form which is not + included in the length. + """ + return True + + @cached_property + def management_form(self): + """Return the ManagementForm instance for this FormSet.""" + if self.is_bound: + form = ManagementForm(self.data, auto_id=self.auto_id, prefix=self.prefix) + if not form.is_valid(): + raise ValidationError( + _('ManagementForm data is missing or has been tampered with'), + code='missing_management_form', + ) + else: + form = ManagementForm(auto_id=self.auto_id, prefix=self.prefix, initial={ + TOTAL_FORM_COUNT: self.total_form_count(), + INITIAL_FORM_COUNT: self.initial_form_count(), + MIN_NUM_FORM_COUNT: self.min_num, + MAX_NUM_FORM_COUNT: self.max_num + }) + return form + + def total_form_count(self): + """Return the total number of forms in this FormSet.""" + if self.is_bound: + # return absolute_max if it is lower than the actual total form + # count in the data; this is DoS protection to prevent clients + # from forcing the server to instantiate arbitrary numbers of + # forms + return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max) + else: + initial_forms = self.initial_form_count() + total_forms = max(initial_forms, self.min_num) + self.extra + # Allow all existing related objects/inlines to be displayed, + # but don't allow extra beyond max_num. + if initial_forms > self.max_num >= 0: + total_forms = initial_forms + elif total_forms > self.max_num >= 0: + total_forms = self.max_num + return total_forms + + def initial_form_count(self): + """Return the number of forms that are required in this FormSet.""" + if self.is_bound: + return self.management_form.cleaned_data[INITIAL_FORM_COUNT] + else: + # Use the length of the initial data if it's there, 0 otherwise. + initial_forms = len(self.initial) if self.initial else 0 + return initial_forms + + @cached_property + def forms(self): + """Instantiate forms at first property access.""" + # DoS protection is included in total_form_count() + forms = [self._construct_form(i, **self.get_form_kwargs(i)) + for i in range(self.total_form_count())] + return forms + + def get_form_kwargs(self, index): + """ + Return additional keyword arguments for each individual formset form. + + index will be None if the form being constructed is a new empty + form. + """ + return self.form_kwargs.copy() + + def _construct_form(self, i, **kwargs): + """Instantiate and return the i-th form instance in a formset.""" + defaults = { + 'auto_id': self.auto_id, + 'prefix': self.add_prefix(i), + 'error_class': self.error_class, + # Don't render the HTML 'required' attribute as it may cause + # incorrect validation for extra, optional, and deleted + # forms in the formset. + 'use_required_attribute': False, + } + if self.is_bound: + defaults['data'] = self.data + defaults['files'] = self.files + if self.initial and 'initial' not in kwargs: + try: + defaults['initial'] = self.initial[i] + except IndexError: + pass + # Allow extra forms to be empty, unless they're part of + # the minimum forms. + if i >= self.initial_form_count() and i >= self.min_num: + defaults['empty_permitted'] = True + defaults.update(kwargs) + form = self.form(**defaults) + self.add_fields(form, i) + return form + + @property + def initial_forms(self): + """Return a list of all the initial forms in this formset.""" + return self.forms[:self.initial_form_count()] + + @property + def extra_forms(self): + """Return a list of all the extra forms in this formset.""" + return self.forms[self.initial_form_count():] + + @property + def empty_form(self): + form = self.form( + auto_id=self.auto_id, + prefix=self.add_prefix('__prefix__'), + empty_permitted=True, + use_required_attribute=False, + **self.get_form_kwargs(None) + ) + self.add_fields(form, None) + return form + + @property + def cleaned_data(self): + """ + Return a list of form.cleaned_data dicts for every form in self.forms. + """ + if not self.is_valid(): + raise AttributeError("'%s' object has no attribute 'cleaned_data'" % self.__class__.__name__) + return [form.cleaned_data for form in self.forms] + + @property + def deleted_forms(self): + """Return a list of forms that have been marked for deletion.""" + if not self.is_valid() or not self.can_delete: + return [] + # construct _deleted_form_indexes which is just a list of form indexes + # that have had their deletion widget set to True + if not hasattr(self, '_deleted_form_indexes'): + self._deleted_form_indexes = [] + for i in range(0, self.total_form_count()): + form = self.forms[i] + # if this is an extra form and hasn't changed, don't consider it + if i >= self.initial_form_count() and not form.has_changed(): + continue + if self._should_delete_form(form): + self._deleted_form_indexes.append(i) + return [self.forms[i] for i in self._deleted_form_indexes] + + @property + def ordered_forms(self): + """ + Return a list of form in the order specified by the incoming data. + Raise an AttributeError if ordering is not allowed. + """ + if not self.is_valid() or not self.can_order: + raise AttributeError("'%s' object has no attribute 'ordered_forms'" % self.__class__.__name__) + # Construct _ordering, which is a list of (form_index, order_field_value) + # tuples. After constructing this list, we'll sort it by order_field_value + # so we have a way to get to the form indexes in the order specified + # by the form data. + if not hasattr(self, '_ordering'): + self._ordering = [] + for i in range(0, self.total_form_count()): + form = self.forms[i] + # if this is an extra form and hasn't changed, don't consider it + if i >= self.initial_form_count() and not form.has_changed(): + continue + # don't add data marked for deletion to self.ordered_data + if self.can_delete and self._should_delete_form(form): + continue + self._ordering.append((i, form.cleaned_data[ORDERING_FIELD_NAME])) + # After we're done populating self._ordering, sort it. + # A sort function to order things numerically ascending, but + # None should be sorted below anything else. Allowing None as + # a comparison value makes it so we can leave ordering fields + # blank. + + def compare_ordering_key(k): + if k[1] is None: + return (1, 0) # +infinity, larger than any number + return (0, k[1]) + self._ordering.sort(key=compare_ordering_key) + # Return a list of form.cleaned_data dicts in the order specified by + # the form data. + return [self.forms[i[0]] for i in self._ordering] + + @classmethod + def get_default_prefix(cls): + return 'form' + + def non_form_errors(self): + """ + Return an ErrorList of errors that aren't associated with a particular + form -- i.e., from formset.clean(). Return an empty ErrorList if there + are none. + """ + if self._non_form_errors is None: + self.full_clean() + return self._non_form_errors + + @property + def errors(self): + """Return a list of form.errors for every form in self.forms.""" + if self._errors is None: + self.full_clean() + return self._errors + + def total_error_count(self): + """Return the number of errors across all forms in the formset.""" + return len(self.non_form_errors()) +\ + sum(len(form_errors) for form_errors in self.errors) + + def _should_delete_form(self, form): + """Return whether or not the form was marked for deletion.""" + return form.cleaned_data.get(DELETION_FIELD_NAME, False) + + def is_valid(self): + """Return True if every form in self.forms is valid.""" + if not self.is_bound: + return False + # We loop over every form.errors here rather than short circuiting on the + # first failure to make sure validation gets triggered for every form. + forms_valid = True + # This triggers a full clean. + self.errors + for i in range(0, self.total_form_count()): + form = self.forms[i] + if self.can_delete and self._should_delete_form(form): + # This form is going to be deleted so any of its errors + # shouldn't cause the entire formset to be invalid. + continue + forms_valid &= form.is_valid() + return forms_valid and not self.non_form_errors() + + def full_clean(self): + """ + Clean all of self.data and populate self._errors and + self._non_form_errors. + """ + self._errors = [] + self._non_form_errors = self.error_class() + empty_forms_count = 0 + + if not self.is_bound: # Stop further processing. + return + for i in range(0, self.total_form_count()): + form = self.forms[i] + # Empty forms are unchanged forms beyond those with initial data. + if not form.has_changed() and i >= self.initial_form_count(): + empty_forms_count += 1 + # Accessing errors calls full_clean() if necessary. + # _should_delete_form() requires cleaned_data. + form_errors = form.errors + if self.can_delete and self._should_delete_form(form): + continue + self._errors.append(form_errors) + try: + if (self.validate_max and + self.total_form_count() - len(self.deleted_forms) > self.max_num) or \ + self.management_form.cleaned_data[TOTAL_FORM_COUNT] > self.absolute_max: + raise ValidationError(ngettext( + "Please submit %d or fewer forms.", + "Please submit %d or fewer forms.", self.max_num) % self.max_num, + code='too_many_forms', + ) + if (self.validate_min and + self.total_form_count() - len(self.deleted_forms) - empty_forms_count < self.min_num): + raise ValidationError(ngettext( + "Please submit %d or more forms.", + "Please submit %d or more forms.", self.min_num) % self.min_num, + code='too_few_forms') + # Give self.clean() a chance to do cross-form validation. + self.clean() + except ValidationError as e: + self._non_form_errors = self.error_class(e.error_list) + + def clean(self): + """ + Hook for doing any extra formset-wide cleaning after Form.clean() has + been called on every form. Any ValidationError raised by this method + will not be associated with a particular form; it will be accessible + via formset.non_form_errors() + """ + pass + + def has_changed(self): + """Return True if data in any form differs from initial.""" + return any(form.has_changed() for form in self) + + def add_fields(self, form, index): + """A hook for adding extra fields on to each form instance.""" + if self.can_order: + # Only pre-fill the ordering field for initial forms. + if index is not None and index < self.initial_form_count(): + form.fields[ORDERING_FIELD_NAME] = IntegerField(label=_('Order'), initial=index + 1, required=False) + else: + form.fields[ORDERING_FIELD_NAME] = IntegerField(label=_('Order'), required=False) + if self.can_delete: + form.fields[DELETION_FIELD_NAME] = BooleanField(label=_('Delete'), required=False) + + def add_prefix(self, index): + return '%s-%s' % (self.prefix, index) + + def is_multipart(self): + """ + Return True if the formset needs to be multipart, i.e. it + has FileInput, or False otherwise. + """ + if self.forms: + return self.forms[0].is_multipart() + else: + return self.empty_form.is_multipart() + + @property + def media(self): + # All the forms on a FormSet are the same, so you only need to + # interrogate the first form for media. + if self.forms: + return self.forms[0].media + else: + return self.empty_form.media + + def as_table(self): + "Return this formset rendered as HTML s -- excluding the
        ." + # XXX: there is no semantic division between forms here, there + # probably should be. It might make sense to render each form as a + # table row with each field as a td. + forms = ' '.join(form.as_table() for form in self) + return mark_safe(str(self.management_form) + '\n' + forms) + + def as_p(self): + "Return this formset rendered as HTML

        s." + forms = ' '.join(form.as_p() for form in self) + return mark_safe(str(self.management_form) + '\n' + forms) + + def as_ul(self): + "Return this formset rendered as HTML

      • s." + forms = ' '.join(form.as_ul() for form in self) + return mark_safe(str(self.management_form) + '\n' + forms) + + +def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False, + can_delete=False, max_num=None, validate_max=False, + min_num=None, validate_min=False): + """Return a FormSet for the given form class.""" + if min_num is None: + min_num = DEFAULT_MIN_NUM + if max_num is None: + max_num = DEFAULT_MAX_NUM + # hard limit on forms instantiated, to prevent memory-exhaustion attacks + # limit is simply max_num + DEFAULT_MAX_NUM (which is 2*DEFAULT_MAX_NUM + # if max_num is None in the first place) + absolute_max = max_num + DEFAULT_MAX_NUM + attrs = { + 'form': form, + 'extra': extra, + 'can_order': can_order, + 'can_delete': can_delete, + 'min_num': min_num, + 'max_num': max_num, + 'absolute_max': absolute_max, + 'validate_min': validate_min, + 'validate_max': validate_max, + } + return type(form.__name__ + 'FormSet', (formset,), attrs) + + +def all_valid(formsets): + """Validate every formset and return True if all are valid.""" + valid = True + for formset in formsets: + valid &= formset.is_valid() + return valid diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_option.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_option.html new file mode 100644 index 0000000..bb9acba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_option.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input_option.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_select.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_select.html new file mode 100644 index 0000000..780899a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/checkbox_select.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/multiple_input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/file.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/file.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/file.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/hidden.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/hidden.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/hidden.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiple_input.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiple_input.html new file mode 100644 index 0000000..21cd9b6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiple_input.html @@ -0,0 +1,5 @@ +{% set id = widget.attrs.id %}{% for group, options, index in widget.optgroups %}{% if group %} +
      • {{ group }}{% endif %}{% for widget in options %} +
      • {% include widget.template_name %}
      • {% endfor %}{% if group %} + {% endif %}{% endfor %} + diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiwidget.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiwidget.html new file mode 100644 index 0000000..ae120e9 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/multiwidget.html @@ -0,0 +1 @@ +{% for widget in widget.subwidgets -%}{% include widget.template_name %}{%- endfor %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/select_option.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/select_option.html new file mode 100644 index 0000000..c6355f6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/select_option.html @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/splitdatetime.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/splitdatetime.html new file mode 100644 index 0000000..32fda82 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/splitdatetime.html @@ -0,0 +1 @@ +{% include 'django/forms/widgets/multiwidget.html' %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/text.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/text.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/text.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/url.html b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/url.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/jinja2/django/forms/widgets/url.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/renderers.py b/venv/lib/python3.7/site-packages/django/forms/renderers.py new file mode 100644 index 0000000..9fb695b --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/renderers.py @@ -0,0 +1,70 @@ +import functools +from pathlib import Path + +from django.conf import settings +from django.template.backends.django import DjangoTemplates +from django.template.loader import get_template +from django.utils.functional import cached_property +from django.utils.module_loading import import_string + +try: + from django.template.backends.jinja2 import Jinja2 +except ImportError: + def Jinja2(params): + raise ImportError("jinja2 isn't installed") + +ROOT = Path(__file__).parent + + +@functools.lru_cache() +def get_default_renderer(): + renderer_class = import_string(settings.FORM_RENDERER) + return renderer_class() + + +class BaseRenderer: + def get_template(self, template_name): + raise NotImplementedError('subclasses must implement get_template()') + + def render(self, template_name, context, request=None): + template = self.get_template(template_name) + return template.render(context, request=request).strip() + + +class EngineMixin: + def get_template(self, template_name): + return self.engine.get_template(template_name) + + @cached_property + def engine(self): + return self.backend({ + 'APP_DIRS': True, + 'DIRS': [str(ROOT / self.backend.app_dirname)], + 'NAME': 'djangoforms', + 'OPTIONS': {}, + }) + + +class DjangoTemplates(EngineMixin, BaseRenderer): + """ + Load Django templates from the built-in widget templates in + django/forms/templates and from apps' 'templates' directory. + """ + backend = DjangoTemplates + + +class Jinja2(EngineMixin, BaseRenderer): + """ + Load Jinja2 templates from the built-in widget templates in + django/forms/jinja2 and from apps' 'jinja2' directory. + """ + backend = Jinja2 + + +class TemplatesSetting(BaseRenderer): + """ + Load templates using template.loader.get_template() which is configured + based on settings.TEMPLATES. + """ + def get_template(self, template_name): + return get_template(template_name) diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/checkbox.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/checkbox.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/checkbox.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html new file mode 100644 index 0000000..9e76435 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/clearable_file_input.html @@ -0,0 +1,5 @@ +{% if widget.is_initial %}{{ widget.initial_text }}: {{ widget.value }}{% if not widget.required %} + +{% endif %}
        +{{ widget.input_text }}:{% endif %} + diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/input.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/input.html new file mode 100644 index 0000000..9010a92 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/input.html @@ -0,0 +1 @@ + diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html new file mode 100644 index 0000000..7e687a1 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/multiwidget.html @@ -0,0 +1 @@ +{% spaceless %}{% for widget in widget.subwidgets %}{% include widget.template_name %}{% endfor %}{% endspaceless %} diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/radio_option.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/radio_option.html new file mode 100644 index 0000000..bb9acba --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/radio_option.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input_option.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/textarea.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/textarea.html new file mode 100644 index 0000000..b86766c --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/textarea.html @@ -0,0 +1,2 @@ + diff --git a/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/url.html b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/url.html new file mode 100644 index 0000000..08b1e61 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/templates/django/forms/widgets/url.html @@ -0,0 +1 @@ +{% include "django/forms/widgets/input.html" %} diff --git a/venv/lib/python3.7/site-packages/django/forms/widgets.py b/venv/lib/python3.7/site-packages/django/forms/widgets.py new file mode 100644 index 0000000..e944091 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django/forms/widgets.py @@ -0,0 +1,1079 @@ +""" +HTML Widget classes +""" + +import copy +import datetime +import re +import warnings +from collections import defaultdict +from itertools import chain + +from django.conf import settings +from django.forms.utils import to_current_timezone +from django.templatetags.static import static +from django.utils import datetime_safe, formats +from django.utils.datastructures import OrderedSet +from django.utils.dates import MONTHS +from django.utils.formats import get_format +from django.utils.html import format_html, html_safe +from django.utils.safestring import mark_safe +from django.utils.topological_sort import ( + CyclicDependencyError, stable_topological_sort, +) +from django.utils.translation import gettext_lazy as _ + +from .renderers import get_default_renderer + +__all__ = ( + 'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'NumberInput', + 'EmailInput', 'URLInput', 'PasswordInput', 'HiddenInput', + 'MultipleHiddenInput', 'FileInput', 'ClearableFileInput', 'Textarea', + 'DateInput', 'DateTimeInput', 'TimeInput', 'CheckboxInput', 'Select', + 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect', + 'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'SelectDateWidget', +) + +MEDIA_TYPES = ('css', 'js') + + +class MediaOrderConflictWarning(RuntimeWarning): + pass + + +@html_safe +class Media: + def __init__(self, media=None, css=None, js=None): + if media is not None: + css = getattr(media, 'css', {}) + js = getattr(media, 'js', []) + else: + if css is None: + css = {} + if js is None: + js = [] + self._css_lists = [css] + self._js_lists = [js] + + def __repr__(self): + return 'Media(css=%r, js=%r)' % (self._css, self._js) + + def __str__(self): + return self.render() + + @property + def _css(self): + css = defaultdict(list) + for css_list in self._css_lists: + for medium, sublist in css_list.items(): + css[medium].append(sublist) + return {medium: self.merge(*lists) for medium, lists in css.items()} + + @property + def _js(self): + return self.merge(*self._js_lists) + + def render(self): + return mark_safe('\n'.join(chain.from_iterable(getattr(self, 'render_' + name)() for name in MEDIA_TYPES))) + + def render_js(self): + return [ + format_html( + '', + self.absolute_path(path) + ) for path in self._js + ] + + def render_css(self): + # To keep rendering order consistent, we can't just iterate over items(). + # We need to sort the keys, and iterate over the sorted list. + media = sorted(self._css) + return chain.from_iterable([ + format_html( + '', + self.absolute_path(path), medium + ) for path in self._css[medium] + ] for medium in media) + + def absolute_path(self, path): + """ + Given a relative or absolute path to a static asset, return an absolute + path. An absolute path will be returned unchanged while a relative path + will be passed to django.templatetags.static.static(). + """ + if path.startswith(('http://', 'https://', '/')): + return path + return static(path) + + def __getitem__(self, name): + """Return a Media object that only contains media of the given type.""" + if name in MEDIA_TYPES: + return Media(**{str(name): getattr(self, '_' + name)}) + raise KeyError('Unknown media type "%s"' % name) + + @staticmethod + def merge(*lists): + """ + Merge lists while trying to keep the relative order of the elements. + Warn if the lists have the same elements in a different relative order. + + For static assets it can be important to have them included in the DOM + in a certain order. In JavaScript you may not be able to reference a + global or in CSS you might want to override a style. + """ + dependency_graph = defaultdict(set) + all_items = OrderedSet() + for list_ in filter(None, lists): + head = list_[0] + # The first items depend on nothing but have to be part of the + # dependency graph to be included in the result. + dependency_graph.setdefault(head, set()) + for item in list_: + all_items.add(item) + # No self dependencies + if head != item: + dependency_graph[item].add(head) + head = item + try: + return stable_topological_sort(all_items, dependency_graph) + except CyclicDependencyError: + warnings.warn( + 'Detected duplicate Media files in an opposite order: {}'.format( + ', '.join(repr(l) for l in lists) + ), MediaOrderConflictWarning, + ) + return list(all_items) + + def __add__(self, other): + combined = Media() + combined._css_lists = self._css_lists + other._css_lists + combined._js_lists = self._js_lists + other._js_lists + return combined + + +def media_property(cls): + def _media(self): + # Get the media property of the superclass, if it exists + sup_cls = super(cls, self) + try: + base = sup_cls.media + except AttributeError: + base = Media() + + # Get the media definition for this class + definition = getattr(cls, 'Media', None) + if definition: + extend = getattr(definition, 'extend', True) + if extend: + if extend is True: + m = base + else: + m = Media() + for medium in extend: + m = m + base[medium] + return m + Media(definition) + return Media(definition) + return base + return property(_media) + + +class MediaDefiningClass(type): + """ + Metaclass for classes that can have media definitions. + """ + def __new__(mcs, name, bases, attrs): + new_class = super(MediaDefiningClass, mcs).__new__(mcs, name, bases, attrs) + + if 'media' not in attrs: + new_class.media = media_property(new_class) + + return new_class + + +class Widget(metaclass=MediaDefiningClass): + needs_multipart_form = False # Determines does this widget need multipart form + is_localized = False + is_required = False + supports_microseconds = True + + def __init__(self, attrs=None): + self.attrs = {} if attrs is None else attrs.copy() + + def __deepcopy__(self, memo): + obj = copy.copy(self) + obj.attrs = self.attrs.copy() + memo[id(self)] = obj + return obj + + @property + def is_hidden(self): + return self.input_type == 'hidden' if hasattr(self, 'input_type') else False + + def subwidgets(self, name, value, attrs=None): + context = self.get_context(name, value, attrs) + yield context['widget'] + + def format_value(self, value): + """ + Return a value as it should appear when rendered in a template. + """ + if value == '' or value is None: + return None + if self.is_localized: + return formats.localize_input(value) + return str(value) + + def get_context(self, name, value, attrs): + context = {} + context['widget'] = { + 'name': name, + 'is_hidden': self.is_hidden, + 'required': self.is_required, + 'value': self.format_value(value), + 'attrs': self.build_attrs(self.attrs, attrs), + 'template_name': self.template_name, + } + return context + + def render(self, name, value, attrs=None, renderer=None): + """Render the widget as an HTML string.""" + context = self.get_context(name, value, attrs) + return self._render(self.template_name, context, renderer) + + def _render(self, template_name, context, renderer=None): + if renderer is None: + renderer = get_default_renderer() + return mark_safe(renderer.render(template_name, context)) + + def build_attrs(self, base_attrs, extra_attrs=None): + """Build an attribute dictionary.""" + return {**base_attrs, **(extra_attrs or {})} + + def value_from_datadict(self, data, files, name): + """ + Given a dictionary of data and this widget's name, return the value + of this widget or None if it's not provided. + """ + return data.get(name) + + def value_omitted_from_data(self, data, files, name): + return name not in data + + def id_for_label(self, id_): + """ + Return the HTML ID attribute of this Widget for use by a