Changeset - b9e24c7beb48
[Not reviewed]
Merge default
0 40 0
Mads Kiilerich (mads) - 20 months ago 2024-07-20 22:00:23
mads@kiilerich.com
Merge from stable
40 files changed with 1257 insertions and 2950 deletions:
0 comments (0 inline, 0 general)
CONTRIBUTORS
Show inline comments
 
List of contributors to Kallithea project:
 

	
 
    Mads Kiilerich <mads@kiilerich.com> 2016-2023
 
    Mads Kiilerich <mads@kiilerich.com> 2016-2024
 
    Aristotelis Stageiritis <aristotelis79@gmail.com> 2024
 
    Poesty Li <poesty7450@gmail.com> 2024
 
    Manuel Jacob <me@manueljacob.de> 2019-2020 2022-2023
 
    Mathias De Mare <mathias.de_mare@nokia.com> 2023
 
    qy117121 <mixuan121@gmail.com> 2023
 
    Asterios Dimitriou <steve@pci.gr> 2016-2017 2020 2022
 
    Étienne Gilli <etienne@gilli.io> 2020-2022
 
    Jaime Marquínez Ferrándiz <weblate@jregistros.fastmail.net> 2022
 
    Louis Bertrand <louis.bertrand@durhamcollege.ca> 2022
 
    toras9000 <toras9000@gmail.com> 2022
 
    yzqzss <yzqzss@othing.xyz> 2022
 
    МАН69К <weblate@mah69k.net> 2022
 
    Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2021
 
    ssantos <ssantos@web.de> 2018-2021
 
    Private <adamantine.sword@gmail.com> 2019-2021
 
    Étienne Gilli <etienne@gilli.io> 2020-2021
 
    fresh <fresh190@protonmail.com> 2020-2021
 
    robertus <robertuss12@gmail.com> 2020-2021
 
    Eugenia Russell <eugenia.russell2019@gmail.com> 2021
 
    Michalis <michalisntovas@yahoo.gr> 2021
 
    vs <vsuhachev@yandex.ru> 2021
 
    Александр <akonn7@mail.ru> 2021
 
    Allan Nordhøy <epost@anotheragency.no> 2017-2020
 
    Anton Schur <tonich.sh@gmail.com> 2017 2020
 
    Artem <kovalevartem.ru@gmail.com> 2020
 
    David Ignjić <ignjic@gmail.com> 2020
 
    Dennis Fink <dennis.fink@c3l.lu> 2020
 
    J. Lavoie <j.lavoie@net-c.ca> 2020
 
    Ross Thomas <ross@lns-nevasoft.com> 2020
 
    Tim Ooms <tatankat@users.noreply.github.com> 2020
 
    Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
 
    Étienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
 
    Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
 
    Danni Randeris <danniranderis@gmail.com> 2019
 
    Edmund Wong <ewong@crazy-cat.org> 2019
 
    Elizabeth Sherrock <lizzyd710@gmail.com> 2019
 
    Hüseyin Tunç <huseyin.tunc@bulutfon.com> 2019
 
    leela <53352@protonmail.com> 2019
 
    Mateusz Mendel <mendelm9@gmail.com> 2019
 
    Nathan <bonnemainsnathan@gmail.com> 2019
 
    Oleksandr Shtalinberg <o.shtalinberg@gmail.com> 2019
 
    THANOS SIOURDAKIS <siourdakisthanos@gmail.com> 2019
 
    Wolfgang Scherer <wolfgang.scherer@gmx.de> 2019
 
    Христо Станев <hstanev@gmail.com> 2019
 
    Dominik Ruf <dominikruf@gmail.com> 2012 2014-2018
 
    Michal Čihař <michal@cihar.com> 2014-2015 2018
 
    Branko Majic <branko@majic.rs> 2015 2018
 
    Chris Rule <crule@aegistg.com> 2018
 
    Jesús Sánchez <jsanchezfdz95@gmail.com> 2018
 
    Patrick Vane <patrick_vane@lowentry.com> 2018
 
    Pheng Heong Tan <phtan90@gmail.com> 2018
 
    Максим Якимчук <xpinovo@gmail.com> 2018
 
    Марс Ямбар <mjambarmeta@gmail.com> 2018
 
    Mads Kiilerich <madski@unity3d.com> 2012-2017
 
    Unity Technologies 2012-2017
 
    Søren Løvborg <sorenl@unity3d.com> 2015-2017
 
    Sam Jaques <sam.jaques@me.com> 2015 2017
 
    Alessandro Molina <alessandro.molina@axant.it> 2017
 
    Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
 
    Eivind Tagseth <eivindt@gmail.com> 2017
 
    FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
 
    Holger Schramm <info@schramm.by> 2017
 
    Karl Goetz <karl@kgoetz.id.au> 2017
 
    Lars Kruse <devel@sumpfralle.de> 2017
Jenkinsfile
Show inline comments
 
def createvirtualenv = ''
 
def activatevirtualenv = ''
 

	
 
node {
 
    properties([[$class: 'BuildDiscarderProperty',
 
                  strategy: [$class: 'LogRotator',
 
                              artifactDaysToKeepStr: '',
 
                              artifactNumToKeepStr: '10',
 
                              daysToKeepStr: '',
 
                              numToKeepStr: '']]]);
 
    if (isUnix()) {
 
        createvirtualenv = 'rm -r $JENKINS_HOME/venv/$JOB_NAME || true && python3 -m venv $JENKINS_HOME/venv/$JOB_NAME'
 
        activatevirtualenv = '. $JENKINS_HOME/venv/$JOB_NAME/bin/activate'
 
    } else {
 
        createvirtualenv = 'rmdir /s /q %JENKINS_HOME%\\venv\\%JOB_NAME% || true && python3 -m venv %JENKINS_HOME%\\venv\\%JOB_NAME%'
 
        activatevirtualenv = 'call %JENKINS_HOME%\\venv\\%JOB_NAME%\\Scripts\\activate.bat'
 
    }
 

	
 
    stage('checkout') {
 
        checkout scm
 
        if (isUnix()) {
 
            sh 'hg --config extensions.purge= purge --all'
 
        } else {
 
            bat 'hg --config extensions.purge= purge --all'
 
        }
 
    }
 
    stage('virtual env') {
 
        def virtualenvscript = """$createvirtualenv
 
            $activatevirtualenv
 
            python -m pip install --upgrade pip
 
            pip install --upgrade setuptools
 
            python -m pip install --upgrade "pip<24.1"
 
            pip install --upgrade "setuptools<67"
 
            pip install --upgrade pylint
 
            pip install --upgrade pytest-cov
 
            """
 
        if (isUnix()) {
 
            virtualenvscript += """
 
                pip install --upgrade python-ldap
 
                pip install --upgrade python-pam
 
                """
 
            sh virtualenvscript
 
        } else {
 
            bat virtualenvscript
 
        }
 
    }
 
    stage('setup') {
 
        def virtualenvscript = """$activatevirtualenv
 
            pip install --upgrade -e . -r dev_requirements.txt
 
            python setup.py compile_catalog
 
            """
 
        if (isUnix()) {
 
            sh virtualenvscript
 
        } else {
 
            bat virtualenvscript
 
        }
 
        stash name: 'kallithea', useDefaultExcludes: false
 
    }
 
    stage('pylint') {
 
        sh script: """$activatevirtualenv
 
            pylint -j 0 --disable=C -f parseable kallithea > pylint.out
 
            """, returnStatus: true
 
        archiveArtifacts 'pylint.out'
 
        try {
 
            step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'PyLint', pattern: 'pylint.out']], unHealthy: ''])
 
        } catch (java.lang.IllegalArgumentException exc) {
 
            echo "You need to install the 'Warnings Plug-in' to display the pylint report."
 
            currentBuild.result = 'UNSTABLE'
 
            echo "Caught: ${exc}"
 
        }
 
    }
 
}
 

	
 
def pytests = [:]
 
pytests['sqlite'] = {
 
    node {
 
        ws {
 
            deleteDir()
 
            unstash name: 'kallithea'
 
            if (isUnix()) {
 
                sh script: """$activatevirtualenv
dev_requirements.txt
Show inline comments
 
pytest >= 4.6.6, < 6.3
 
pytest-sugar >= 0.9.2, < 0.10
 
pytest-benchmark >= 3.2.2, < 3.3
 
pytest-localserver >= 0.5.0, < 0.6
 
mock >= 3.0.0, < 4.1
 
pytest >= 4.6.6, < 8.3
 
pytest-sugar >= 0.9.2, < 1.1
 
pytest-benchmark >= 3.2.2, < 4.1
 
pytest-localserver >= 0.5.0, < 0.9
 
mock >= 3.0.0, < 5.2
 
Sphinx >= 1.8.0, < 5.2
 
WebTest >= 2.0.6, < 2.1
 
isort == 5.1.2
 
pyflakes == 2.2.0
 
WebTest >= 2.0.6, < 3.1
 
isort == 5.13.2
 
pyflakes == 3.2.0
docs/conf.py
Show inline comments
 
@@ -2,97 +2,97 @@
 
#
 
# Kallithea documentation build configuration file, created by
 
# sphinx-quickstart on Sun Oct 10 16:46:37 2010.
 
#
 
# This file is execfile()d with the current directory set to its containing dir.
 
#
 
# Note that not all possible configuration values are present in this
 
# autogenerated file.
 
#
 
# All configuration values have a default; values that are commented out
 
# serve to show the default.
 

	
 
import os
 
import sys
 

	
 
import kallithea
 

	
 

	
 
# If extensions (or modules to document with autodoc) are in another directory,
 
# add these directories to sys.path here. If the directory is relative to the
 
# documentation root, use os.path.abspath to make it absolute, like shown here.
 
sys.path.insert(0, os.path.abspath('..'))
 

	
 
# -- General configuration -----------------------------------------------------
 

	
 
# If your documentation needs a minimal Sphinx version, state it here.
 
#needs_sphinx = '1.0'
 

	
 
# Add any Sphinx extension module names here, as strings. They can be extensions
 
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
 
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest',
 
              'sphinx.ext.intersphinx', 'sphinx.ext.todo',
 
              'sphinx.ext.viewcode']
 

	
 
# Add any paths that contain templates here, relative to this directory.
 
templates_path = ['_templates']
 

	
 
# The suffix of source filenames.
 
source_suffix = '.rst'
 

	
 
# The encoding of source files.
 
#source_encoding = 'utf-8-sig'
 

	
 
# The master toctree document.
 
master_doc = 'index'
 

	
 
# General information about the project.
 
project = 'Kallithea'
 
copyright = '2010-2023 by various authors, licensed as GPLv3.'
 
copyright = '2010-2024 by various authors, licensed as GPLv3.'
 

	
 
# The version info for the project you're documenting, acts as replacement for
 
# |version| and |release|, also used in various other places throughout the
 
# built documents.
 
#
 
# The short X.Y version.
 
root = os.path.dirname(os.path.dirname(__file__))
 
sys.path.append(root)
 
version = kallithea.__version__
 
# The full version, including alpha/beta/rc tags.
 
release = kallithea.__version__
 

	
 
# The language for content autogenerated by Sphinx. Refer to documentation
 
# for a list of supported languages.
 
#language = None
 

	
 
# There are two options for replacing |today|: either, you set today to some
 
# non-false value, then it is used:
 
#today = ''
 
# Else, today_fmt is used as the format for a strftime call.
 
#today_fmt = '%B %d, %Y'
 

	
 
# List of patterns, relative to source directory, that match files and
 
# directories to ignore when looking for source files.
 
exclude_patterns = ['_build']
 

	
 
# The reST default role (used for this markup: `text`) to use for all documents.
 
#default_role = None
 

	
 
# If true, '()' will be appended to :func: etc. cross-reference text.
 
#add_function_parentheses = True
 

	
 
# If true, the current module name will be prepended to all description
 
# unit titles (such as .. function::).
 
#add_module_names = True
 

	
 
# If true, sectionauthor and moduleauthor directives will be shown in the
 
# output. They are ignored by default.
 
#show_authors = False
 

	
 
# The name of the Pygments (syntax highlighting) style to use.
 
pygments_style = 'sphinx'
 
highlight_language = 'none'
 

	
 
# A list of ignored prefixes for module index sorting.
 
#modindex_common_prefix = []
 

	
 

	
docs/contributing.rst
Show inline comments
 
.. _contributing:
 

	
 
=========================
 
Contributing to Kallithea
 
=========================
 

	
 
Kallithea is developed and maintained by its users. Please join us and scratch
 
your own itch.
 

	
 

	
 
Infrastructure
 
--------------
 

	
 
The main repository is hosted on Our Own Kallithea (aka OOK) at
 
https://kallithea-scm.org/repos/kallithea/, our self-hosted instance
 
of Kallithea.
 

	
 
Please use the `mailing list`_ to send patches or report issues.
 

	
 
We use Weblate_ to translate the user interface messages into languages other
 
than English. Join our project on `Hosted Weblate`_ to help us.
 
To register, you can use your Bitbucket or GitHub account. See :ref:`translations`
 
for more details.
 

	
 

	
 
Getting started
 
---------------
 

	
 
To get started with Kallithea development run the following commands in your
 
bash shell::
 

	
 
        hg clone https://kallithea-scm.org/repos/kallithea
 
        cd kallithea
 
        python3 -m venv venv
 
        . venv/bin/activate
 
        pip install --upgrade pip setuptools
 
        pip install --upgrade "pip<24.1" "setuptools<67"
 
        pip install --upgrade -e . -r dev_requirements.txt python-ldap python-pam
 
        kallithea-cli config-create my.ini
 
        kallithea-cli db-create -c my.ini --user=user --email=user@example.com --password=password --repos=/tmp
 
        kallithea-cli front-end-build
 
        gearbox serve -c my.ini --reload &
 
        firefox http://127.0.0.1:5000/
 

	
 

	
 
Contribution flow
 
-----------------
 

	
 
Starting from an existing Kallithea clone, make sure it is up to date with the
 
latest upstream changes::
 

	
 
        hg pull
 
        hg update
 

	
 
Review the :ref:`contributing-guidelines` and :ref:`coding-guidelines`.
 

	
 
If you are new to Mercurial, refer to Mercurial `Quick Start`_ and `Beginners
 
Guide`_ on the Mercurial wiki.
 

	
 
Now, make some changes and test them (see :ref:`contributing-tests`). Don't
 
forget to add new tests to cover new functionality or bug fixes.
 

	
 
For documentation changes, run ``make html`` from the ``docs`` directory to
 
generate the HTML result, then review them in your browser.
 

	
 
Before submitting any changes, run the cleanup script::
 

	
 
        ./scripts/run-all-cleanup
 

	
 
When you are completely ready, you can send your changes to the community for
 
review and inclusion, via the mailing list (via ``hg email``).
 

	
 
.. _contributing-tests:
 

	
 

	
 
Internal dependencies
 
---------------------
 

	
 
We try to keep the code base clean and modular and avoid circular dependencies.
 
Code should only invoke code in layers below itself.
 

	
 
Imports should import whole modules ``from`` their parent module, perhaps
 
``as`` a shortened name. Avoid imports ``from`` modules.
 

	
 
To avoid cycles and partially initialized modules, ``__init__.py`` should *not*
docs/installation.rst
Show inline comments
 
@@ -10,135 +10,135 @@ The following describes three different 
 
  up-to-date and track any local customizations is to run directly from
 
  source in a Kallithea repository clone, preferably inside a virtualenv
 
  virtual Python environment.
 

	
 
- :ref:`installation-virtualenv`: If you prefer to only use released versions
 
  of Kallithea, the recommended method is to install Kallithea in a virtual
 
  Python environment using `virtualenv`. The advantages of this method over
 
  direct installation is that Kallithea and its dependencies are completely
 
  contained inside the virtualenv (which also means you can have multiple
 
  installations side by side or remove it entirely by just removing the
 
  virtualenv directory) and does not require root privileges.
 

	
 
- Kallithea can also be installed with plain pip - globally or with ``--user``
 
  or similar. The package will be installed in the same location as all other
 
  Python packages you have ever installed. As a result, removing it is not as
 
  straightforward as with a virtualenv, as you'd have to remove its
 
  dependencies manually and make sure that they are not needed by other
 
  packages. We recommend using virtualenv.
 

	
 
Regardless of the installation method you may need to make sure you have
 
appropriate development packages installed, as installation of some of the
 
Kallithea dependencies requires a working C compiler and libffi library
 
headers. Depending on your configuration, you may also need to install
 
Git and development packages for the database of your choice.
 

	
 
For Debian and Ubuntu, the following command will ensure that a reasonable
 
set of dependencies is installed::
 

	
 
    sudo apt-get install build-essential git libffi-dev python3-dev
 

	
 
For Fedora and RHEL-derivatives, the following command will ensure that a
 
reasonable set of dependencies is installed::
 

	
 
    sudo yum install gcc git libffi-devel python3-devel
 

	
 
.. _installation-source:
 

	
 

	
 
Installation from repository source
 
-----------------------------------
 

	
 
To install Kallithea in a virtualenv using the stable branch of the development
 
repository, use the following commands in your bash shell::
 

	
 
        hg clone https://kallithea-scm.org/repos/kallithea -u stable
 
        cd kallithea
 
        python3 -m venv venv
 
        . venv/bin/activate
 
        pip install --upgrade pip setuptools
 
        pip install --upgrade "pip<24.1" "setuptools<67"
 
        pip install --upgrade -e .
 
        python3 setup.py compile_catalog   # for translation of the UI
 

	
 
.. note::
 
   This will install all Python dependencies into the virtualenv. Kallithea
 
   itself will however only be installed as a pointer to the source location.
 
   The source clone must thus be kept in the same location, and it shouldn't be
 
   updated to other revisions unless you want to upgrade. Edits in the source
 
   tree will have immediate impact (possibly after a restart of the service).
 

	
 
You can now proceed to :ref:`prepare-front-end-files`.
 

	
 
.. _installation-virtualenv:
 

	
 

	
 
Installing a released version in a virtualenv
 
---------------------------------------------
 

	
 
It is highly recommended to use a separate virtualenv for installing Kallithea.
 
This way, all libraries required by Kallithea will be installed separately from your
 
main Python installation and other applications and things will be less
 
problematic when upgrading the system or Kallithea.
 
An additional benefit of virtualenv is that it doesn't require root privileges.
 

	
 
- Don't install as root - install as a dedicated user like ``kallithea``.
 
  If necessary, create the top directory for the virtualenv (like
 
  ``/srv/kallithea/venv``) as root and assign ownership to the user.
 

	
 
  Make a parent folder for the virtualenv (and perhaps also Kallithea
 
  configuration and data files) such as ``/srv/kallithea``. Create the
 
  directory as root if necessary and grant ownership to the ``kallithea`` user.
 

	
 
- Create a new virtual environment, for example in ``/srv/kallithea/venv``,
 
  specifying the right Python binary::
 

	
 
    python3 -m venv /srv/kallithea/venv
 

	
 
- Activate the virtualenv in your current shell session and make sure the
 
  basic requirements are up-to-date by running the following commands in your
 
  bash shell::
 

	
 
    . /srv/kallithea/venv/bin/activate
 
    pip install --upgrade pip setuptools
 
    pip install --upgrade "pip<24.1" "setuptools<67"
 

	
 
.. note:: You can't use UNIX ``sudo`` to source the ``activate`` script; it
 
   will "activate" a shell that terminates immediately.
 

	
 
- Install Kallithea in the activated virtualenv::
 

	
 
    pip install --upgrade kallithea
 

	
 
.. note:: Some dependencies are optional. If you need them, install them in
 
   the virtualenv too::
 

	
 
     pip install --upgrade kallithea python-ldap python-pam psycopg2
 

	
 
   This might require installation of development packages using your
 
   distribution's package manager.
 

	
 
   Alternatively, download a .tar.gz from http://pypi.python.org/pypi/Kallithea,
 
   extract it and install from source by running::
 

	
 
     pip install --upgrade .
 

	
 
- This will install Kallithea together with all other required
 
  Python libraries into the activated virtualenv.
 

	
 
You can now proceed to :ref:`prepare-front-end-files`.
 

	
 
.. _prepare-front-end-files:
 

	
 

	
 
Prepare front-end files
 
-----------------------
 

	
 
Finally, the front-end files with CSS and JavaScript must be prepared. This
 
depends on having some commands available in the shell search path: ``npm``
 
version 6 or later, and ``node.js`` (version 12 or later) available as
 
``node``. The installation method for these dependencies varies between
 
operating systems and distributions.
 

	
 
Prepare the front-end by running::
 

	
 
    kallithea-cli front-end-build
 

	
 
You can now proceed to :ref:`setup`.
docs/installation_win.rst
Show inline comments
 
@@ -59,97 +59,97 @@ http://sourceforge.net/projects/pywin32/
 
  (x64)
 
  http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py3.8.exe/download
 
  (Win32)
 

	
 
Step 5 -- Kallithea folder structure
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Create a Kallithea folder structure.
 

	
 
This is only an example to install Kallithea. Of course, you can
 
change it. However, this guide will follow the proposed structure, so
 
please later adapt the paths if you change them. Folders without
 
spaces are recommended.
 

	
 
Create the following folder structure::
 

	
 
  C:\Kallithea
 
  C:\Kallithea\Bin
 
  C:\Kallithea\Env
 
  C:\Kallithea\Repos
 

	
 
Step 6 -- Install virtualenv
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
.. note::
 
   A python virtual environment will allow for isolation between the Python packages of your system and those used for Kallithea.
 
   It is strongly recommended to use it to ensure that Kallithea does not change a dependency that other software uses or vice versa.
 

	
 
To create a virtual environment, run::
 

	
 
  python3 -m venv C:\Kallithea\Env
 

	
 
Step 7 -- Install Kallithea
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
In order to install Kallithea, you need to be able to run "pip install kallithea". It will use pip to install the Kallithea Python package and its dependencies.
 
Some Python packages use managed code and need to be compiled.
 
This can be done on Linux without any special steps. On Windows, you will need to install Microsoft Visual C++ compiler for Python 3.8.
 

	
 
Download and install "Microsoft Visual C++ Compiler for Python 3.8" from http://aka.ms/vcpython27
 

	
 
.. note::
 
  You can also install the dependencies using already compiled Windows binaries packages. A good source of compiled Python packages is http://www.lfd.uci.edu/~gohlke/pythonlibs/. However, not all of the necessary packages for Kallithea are on this site and some are hard to find, so we will stick with using the compiler.
 

	
 
In a command prompt type (adapting paths if necessary)::
 

	
 
  cd C:\Kallithea\Env\Scripts
 
  activate
 
  pip install --upgrade pip setuptools
 
  pip install --upgrade "pip<24.1" "setuptools<67"
 

	
 
The prompt will change into "(Env) C:\\Kallithea\\Env\\Scripts" or similar
 
(depending of your folder structure). Then type::
 

	
 
  pip install kallithea
 

	
 
.. note:: This will take some time. Please wait patiently until it is fully
 
          complete. Some warnings will appear. Don't worry, they are
 
          normal.
 

	
 
Step 8 -- Install Git (optional)
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Mercurial being a python package, was installed automatically when doing ``pip install kallithea``.
 

	
 
You need to install Git manually if you want Kallithea to be able to host Git repositories.
 
See http://git-scm.com/book/en/v2/Getting-Started-Installing-Git#Installing-on-Windows for instructions.
 
The location of the Git binaries (like ``c:\path\to\git\bin``) must be
 
added to the ``PATH`` environment variable so ``git.exe`` and other tools like
 
``gzip.exe`` are available.
 

	
 
Step 9 -- Configuring Kallithea
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Steps taken from `<setup.html>`_
 

	
 
You have to use the same command prompt as in Step 7, so if you closed
 
it, reopen it following the same commands (including the "activate"
 
one). When ready, type::
 

	
 
  cd C:\Kallithea\Bin
 
  kallithea-cli config-create my.ini
 

	
 
Then you must edit my.ini to fit your needs (IP address, IP
 
port, mail settings, database, etc.). `NotePad++`__ or a similar text
 
editor is recommended to properly handle the newline character
 
differences between Unix and Windows.
 

	
 
__ http://notepad-plus-plus.org/
 

	
 
For the sake of simplicity, run it with the default settings. After your edits (if any) in the previous command prompt, type::
 

	
 
  kallithea-cli db-create -c my.ini
 

	
 
.. warning:: This time a *new* database will be installed. You must
 
             follow a different process to later :ref:`upgrade <upgrade>`
 
             to a newer Kallithea version.
 

	
docs/installation_win_old.rst
Show inline comments
 
@@ -125,97 +125,97 @@ Create a Kallithea folder structure
 

	
 
This is only a example to install Kallithea, you can of course change
 
it. However, this guide will follow the proposed structure, so please
 
later adapt the paths if you change them. My recommendation is to use
 
folders with NO SPACES. But you can try if you are brave...
 

	
 
Create the following folder structure::
 

	
 
  C:\Kallithea
 
  C:\Kallithea\Bin
 
  C:\Kallithea\Env
 
  C:\Kallithea\Repos
 

	
 
Step 6 -- Install virtualenv
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Create a virtual Python environment in C:\\Kallithea\\Env (or similar). To
 
do so, open a CMD (Python Path should be included in Step3), and write::
 

	
 
  python3 -m venv C:\Kallithea\Env
 

	
 
Step 7 -- Install Kallithea
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Finally, install Kallithea
 

	
 
Close previously opened command prompt/s, and open a Visual Studio 2008
 
Command Prompt (**IMPORTANT!!**). To do so, go to Start Menu, and then open
 
"Microsoft Visual C++ 2008 Express Edition" -> "Visual Studio Tools" ->
 
"Visual Studio 2008 Command Prompt"
 

	
 
.. note::
 

	
 
   64-bit: For 64-bit you need to modify the shortcut that is used to start the
 
   Visual Studio 2008 Command Prompt. Use right-mouse click to open properties.
 

	
 
Change commandline from::
 

	
 
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
 

	
 
to::
 

	
 
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" amd64
 

	
 
In that CMD (loaded with VS2008 PATHs) type::
 

	
 
  cd C:\Kallithea\Env\Scripts (or similar)
 
  activate
 
  pip install --upgrade pip setuptools
 
  pip install --upgrade "pip<24.1" "setuptools<67"
 

	
 
The prompt will change into "(Env) C:\\Kallithea\\Env\\Scripts" or similar
 
(depending of your folder structure). Then type::
 

	
 
 pip install kallithea
 

	
 
(long step, please wait until fully complete)
 

	
 
Some warnings will appear, don't worry as they are normal.
 

	
 
Step 8 -- Configuring Kallithea
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
steps taken from http://packages.python.org/Kallithea/setup.html
 

	
 
You have to use the same Visual Studio 2008 command prompt as Step7, so
 
if you closed it reopen it following the same commands (including the
 
"activate" one). When ready, just type::
 

	
 
  cd C:\Kallithea\Bin
 
  kallithea-cli config-create my.ini
 

	
 
Then, you must edit my.ini to fit your needs (network address and
 
port, mail settings, database, whatever). I recommend using NotePad++
 
(free) or similar text editor, as it handles well the EndOfLine
 
character differences between Unix and Windows
 
(http://notepad-plus-plus.org/)
 

	
 
For the sake of simplicity lets run it with the default settings. After
 
your edits (if any), in the previous Command Prompt, type::
 

	
 
  kallithea-cli db-create -c my.ini
 

	
 
.. warning:: This time a *new* database will be installed. You must
 
             follow a different process to later :ref:`upgrade <upgrade>`
 
             to a newer Kallithea version.
 

	
 
The script will ask you for confirmation about creating a NEW database,
 
answer yes (y)
 
The script will ask you for repository path, answer C:\\Kallithea\\Repos
 
(or similar)
 
The script will ask you for admin username and password, answer "admin"
 
+ "123456" (or whatever you want)
 
The script will ask you for admin mail, answer "admin@xxxx.com" (or
 
whatever you want)
 

	
 
If you make some mistake and the script does not end, don't worry, start
 
it again.
kallithea/config/app_cfg.py
Show inline comments
 
@@ -33,96 +33,100 @@ from tg import FullStackApplicationConfi
 
import kallithea.lib.locales
 
import kallithea.model.base
 
import kallithea.model.meta
 
from kallithea.lib import celery_app
 
from kallithea.lib.utils import load_extensions, set_app_settings, set_indexer_config, set_vcs_config
 
from kallithea.lib.utils2 import asbool, check_git_version
 
from kallithea.model import db
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
base_config = FullStackApplicationConfigurator()
 

	
 
base_config.update_blueprint({
 
    'package': kallithea,
 

	
 
    # Rendering Engines Configuration
 
    'renderers': [
 
        'json',
 
        'mako',
 
    ],
 
    'default_renderer': 'mako',
 
    'use_dotted_templatenames': False,
 

	
 
    # Configure Sessions, store data as JSON to avoid pickle security issues
 
    'session.enabled': True,
 
    'session.data_serializer': 'json',
 

	
 
    # Configure the base SQLALchemy Setup
 
    'use_sqlalchemy': True,
 
    'model': kallithea.model.base,
 
    'DBSession': kallithea.model.meta.Session,
 

	
 
    # Configure App without an authentication backend.
 
    'auth_backend': None,
 

	
 
    # Use custom error page for these errors. By default, Turbogears2 does not add
 
    # 400 in this list.
 
    # Explicitly listing all is considered more robust than appending to defaults,
 
    # in light of possible future framework changes.
 
    'errorpage.status_codes': [400, 401, 403, 404],
 

	
 
    # Disable transaction manager -- currently Kallithea takes care of transactions itself
 
    'tm.enabled': False,
 

	
 
    # Set the default i18n source language so TG doesn't search beyond 'en' in Accept-Language.
 
    'i18n.lang': 'en',
 

	
 
    # For TurboGears 2.4.3, define the native language for translations to
 
    # prevent fall-through to languages requested with lower priority.
 
    'i18n.native': ['en', 'en_US', 'en_GB'],
 
})
 

	
 
# DebugBar, a debug toolbar for TurboGears2.
 
# (https://github.com/TurboGears/tgext.debugbar)
 
# To enable it, install 'tgext.debugbar' and 'kajiki', and run Kallithea with
 
# 'debug = true' (not in production!)
 
# See the Kallithea documentation for more information.
 
try:
 
    import kajiki  # only to check its existence
 
    from tgext.debugbar import enable_debugbar
 
    assert kajiki
 
except ImportError:
 
    pass
 
else:
 
    base_config.get_blueprint_value('renderers').append('kajiki')
 
    enable_debugbar(base_config)
 

	
 

	
 
def setup_configuration(app):
 
    config = app.config
 

	
 
    if not kallithea.lib.locales.current_locale_is_valid():
 
        log.error("Terminating ...")
 
        sys.exit(1)
 

	
 
    # Mercurial sets encoding at module import time, so we have to monkey patch it
 
    hgencoding = config.get('hgencoding')
 
    if hgencoding:
 
        mercurial.encoding.encoding = hgencoding
 

	
 
    if config.get('ignore_alembic_revision', False):
 
        log.warning('database alembic revision checking is disabled')
 
    else:
 
        dbconf = config['sqlalchemy.url']
 
        alembic_cfg = alembic.config.Config()
 
        alembic_cfg.set_main_option('script_location', 'kallithea:alembic')
 
        alembic_cfg.set_main_option('sqlalchemy.url', dbconf)
 
        script_dir = ScriptDirectory.from_config(alembic_cfg)
 
        available_heads = sorted(script_dir.get_heads())
 

	
 
        engine = create_engine(dbconf)
 
        with engine.connect() as conn:
 
            context = MigrationContext.configure(conn)
 
            current_heads = sorted(str(s) for s in context.get_current_heads())
 
        if current_heads != available_heads:
 
            log.error('Failed to run Kallithea:\n\n'
 
                      'The database version does not match the Kallithea version.\n'
 
                      'Please read the documentation on how to upgrade or downgrade the database.\n'
kallithea/controllers/admin/repo_groups.py
Show inline comments
 
@@ -45,103 +45,96 @@ from kallithea.model import db, meta
 
from kallithea.model.forms import RepoGroupForm, RepoGroupPermsForm
 
from kallithea.model.repo import RepoModel
 
from kallithea.model.repo_group import RepoGroupModel
 
from kallithea.model.scm import AvailableRepoGroupChoices, RepoGroupList
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
class RepoGroupsController(base.BaseController):
 

	
 
    @LoginRequired(allow_default_user=True)
 
    def _before(self, *args, **kwargs):
 
        super(RepoGroupsController, self)._before(*args, **kwargs)
 

	
 
    def __load_defaults(self, extras=(), exclude=()):
 
        """extras is used for keeping current parent ignoring permissions
 
        exclude is used for not moving group to itself TODO: also exclude descendants
 
        Note: only admin can create top level groups
 
        """
 
        repo_groups = AvailableRepoGroupChoices('admin', extras)
 
        exclude_group_ids = set(rg.group_id for rg in exclude)
 
        c.repo_groups = [rg for rg in repo_groups
 
                         if rg[0] not in exclude_group_ids]
 

	
 
    def __load_data(self, group_id):
 
        """
 
        Load defaults settings for edit, and update
 

	
 
        :param group_id:
 
        """
 
        repo_group = db.RepoGroup.get_or_404(group_id)
 
        data = repo_group.get_dict()
 
        data['group_name'] = repo_group.name
 
        data['owner'] = repo_group.owner.username
 

	
 
        # fill repository group users
 
        for p in repo_group.repo_group_to_perm:
 
            data.update({'u_perm_%s' % p.user.username:
 
                             p.permission.permission_name})
 

	
 
        # fill repository group groups
 
        for p in repo_group.users_group_to_perm:
 
            data.update({'g_perm_%s' % p.users_group.users_group_name:
 
                             p.permission.permission_name})
 

	
 
        return data
 

	
 
    def _revoke_perms_on_yourself(self, form_result):
 
        _up = [u for u in form_result['perms_updates'] if request.authuser.username == u[0]]
 
        _new = [u for u in form_result['perms_new'] if request.authuser.username == u[0]]
 
        if _new and _new[0][1] != 'group.admin' or _up and _up[0][1] != 'group.admin':
 
            return True
 
        return False
 

	
 
    def index(self, format='html'):
 
        _list = db.RepoGroup.query(sorted=True).all()
 
        group_iter = RepoGroupList(_list, perm_level='admin')
 
        repo_groups_data = []
 
        _tmpl_lookup = app_globals.mako_lookup
 
        template = _tmpl_lookup.get_template('data_table/_dt_elements.html')
 

	
 
        def repo_group_name(repo_group_name, children_groups):
 
            return template.get_def("repo_group_name") \
 
                .render_unicode(repo_group_name, children_groups, _=_, webutils=webutils, c=c)
 

	
 
        def repo_group_actions(repo_group_id, repo_group_name, gr_count):
 
            return template.get_def("repo_group_actions") \
 
                .render_unicode(repo_group_id, repo_group_name, gr_count, _=_, webutils=webutils, c=c,
 
                        ungettext=ungettext)
 

	
 
        for repo_gr in group_iter:
 
            children_groups = [g.name for g in repo_gr.parents] + [repo_gr.name]
 
            repo_count = repo_gr.repositories.count()
 
            repo_groups_data.append({
 
                "raw_name": webutils.escape(repo_gr.group_name),
 
                "group_name": repo_group_name(repo_gr.group_name, children_groups),
 
                "desc": webutils.escape(repo_gr.group_description),
 
                "repos": repo_count,
 
                "owner": repo_gr.owner.username,
 
                "action": repo_group_actions(repo_gr.group_id, repo_gr.group_name,
 
                                             repo_count)
 
            })
 

	
 
        c.data = {
 
            "sort": None,
 
            "dir": "asc",
 
            "records": repo_groups_data
 
        }
 

	
 
        return base.render('admin/repo_groups/repo_groups.html')
 

	
 
    def create(self):
 
        self.__load_defaults()
 

	
 
        # permissions for can create group based on parent_id are checked
 
        # here in the Form
 
        repo_group_form = RepoGroupForm(repo_groups=c.repo_groups)
 
        form_result = None
 
        try:
 
            form_result = repo_group_form.to_python(dict(request.POST))
 
            gr = RepoGroupModel().create(
 
                group_name=form_result['group_name'],
 
@@ -304,100 +297,90 @@ class RepoGroupsController(base.BaseCont
 
    @HasRepoGroupPermissionLevelDecorator('admin')
 
    def edit(self, group_name):
 
        c.active = 'settings'
 

	
 
        c.repo_group = db.RepoGroup.guess_instance(group_name)
 
        self.__load_defaults(extras=[c.repo_group.parent_group],
 
                             exclude=[c.repo_group])
 
        defaults = self.__load_data(c.repo_group.group_id)
 

	
 
        return htmlfill.render(
 
            base.render('admin/repo_groups/repo_group_edit.html'),
 
            defaults=defaults,
 
            encoding="UTF-8",
 
            force_defaults=False
 
        )
 

	
 
    @HasRepoGroupPermissionLevelDecorator('admin')
 
    def edit_repo_group_advanced(self, group_name):
 
        c.active = 'advanced'
 
        c.repo_group = db.RepoGroup.guess_instance(group_name)
 

	
 
        return base.render('admin/repo_groups/repo_group_edit.html')
 

	
 
    @HasRepoGroupPermissionLevelDecorator('admin')
 
    def edit_repo_group_perms(self, group_name):
 
        c.active = 'perms'
 
        c.repo_group = db.RepoGroup.guess_instance(group_name)
 
        self.__load_defaults()
 
        defaults = self.__load_data(c.repo_group.group_id)
 

	
 
        return htmlfill.render(
 
            base.render('admin/repo_groups/repo_group_edit.html'),
 
            defaults=defaults,
 
            encoding="UTF-8",
 
            force_defaults=False
 
        )
 

	
 
    @HasRepoGroupPermissionLevelDecorator('admin')
 
    def update_perms(self, group_name):
 
        """
 
        Update permissions for given repository group
 

	
 
        :param group_name:
 
        """
 

	
 
        c.repo_group = db.RepoGroup.guess_instance(group_name)
 
        valid_recursive_choices = ['none', 'repos', 'groups', 'all']
 
        form_result = RepoGroupPermsForm(valid_recursive_choices)().to_python(request.POST)
 
        if not request.authuser.is_admin:
 
            if self._revoke_perms_on_yourself(form_result):
 
                msg = _('Cannot revoke permission for yourself as admin')
 
                webutils.flash(msg, category='warning')
 
                raise HTTPFound(location=url('edit_repo_group_perms', group_name=group_name))
 
        recursive = form_result['recursive']
 
        # iterate over all members(if in recursive mode) of this groups and
 
        # set the permissions !
 
        # this can be potentially heavy operation
 
        RepoGroupModel()._update_permissions(c.repo_group,
 
                                             form_result['perms_new'],
 
                                             form_result['perms_updates'],
 
                                             recursive)
 
        # TODO: implement this
 
        #action_logger(request.authuser, 'admin_changed_repo_permissions',
 
        #              repo_name, request.ip_addr)
 
        meta.Session().commit()
 
        webutils.flash(_('Repository group permissions updated'), category='success')
 
        raise HTTPFound(location=url('edit_repo_group_perms', group_name=group_name))
 

	
 
    @HasRepoGroupPermissionLevelDecorator('admin')
 
    def delete_perms(self, group_name):
 
        try:
 
            obj_type = request.POST.get('obj_type')
 
            obj_id = None
 
            if obj_type == 'user':
 
                obj_id = safe_int(request.POST.get('user_id'))
 
            elif obj_type == 'user_group':
 
                obj_id = safe_int(request.POST.get('user_group_id'))
 

	
 
            if not request.authuser.is_admin:
 
                if obj_type == 'user' and request.authuser.user_id == obj_id:
 
                    msg = _('Cannot revoke permission for yourself as admin')
 
                    webutils.flash(msg, category='warning')
 
                    raise Exception('revoke admin permission on self')
 
            recursive = request.POST.get('recursive', 'none')
 
            if obj_type == 'user':
 
                RepoGroupModel().delete_permission(repo_group=group_name,
 
                                                   obj=obj_id, obj_type='user',
 
                                                   recursive=recursive)
 
            elif obj_type == 'user_group':
 
                RepoGroupModel().delete_permission(repo_group=group_name,
 
                                                   obj=obj_id,
 
                                                   obj_type='user_group',
 
                                                   recursive=recursive)
 

	
 
            meta.Session().commit()
 
        except Exception:
 
            log.error(traceback.format_exc())
 
            webutils.flash(_('An error occurred during revoking of permission'),
 
                    category='error')
 
            raise HTTPInternalServerError()
kallithea/front-end/package-lock.json
Show inline comments
 
{
 
  "name": "kallithea",
 
  "lockfileVersion": 2,
 
  "lockfileVersion": 3,
 
  "requires": true,
 
  "packages": {
 
    "": {
 
      "name": "kallithea",
 
      "dependencies": {
 
        "at.js": "1.5.4",
 
        "bootstrap": "3.3.7",
 
        "codemirror": "5.49.0",
 
        "datatables.net": "1.10.20",
 
        "datatables.net-bs": "1.10.20",
 
        "jquery": "3.4.1",
 
        "jquery.caret": "0.3.1",
 
        "jquery.flot": "0.8.3",
 
        "select2": "3.5.1",
 
        "at.js": "1.5",
 
        "bootstrap": "3",
 
        "codemirror": "5",
 
        "datatables.net": "1",
 
        "datatables.net-bs": "1",
 
        "jquery": "3",
 
        "jquery.caret": "0.3",
 
        "jquery.flot": "0.8",
 
        "select2": "3",
 
        "select2-bootstrap-css": "1.4.6"
 
      },
 
      "devDependencies": {
 
        "eslint": "6.8.0",
 
        "eslint-plugin-html": "6.0.0",
 
        "less": "3.10.3",
 
        "less-plugin-clean-css": "1.5.1",
 
        "license-checker": "25.0.1"
 
        "eslint": "6",
 
        "eslint-plugin-html": "6",
 
        "less": "3",
 
        "less-plugin-clean-css": "1.5",
 
        "license-checker": "25"
 
      }
 
    },
 
    "node_modules/@babel/code-frame": {
 
      "version": "7.8.3",
 
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
 
      "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
 
      "version": "7.24.7",
 
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
 
      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
 
      "dev": true,
 
      "dependencies": {
 
        "@babel/highlight": "^7.8.3"
 
        "@babel/highlight": "^7.24.7",
 
        "picocolors": "^1.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6.9.0"
 
      }
 
    },
 
    "node_modules/@babel/helper-validator-identifier": {
 
      "version": "7.24.7",
 
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
 
      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6.9.0"
 
      }
 
    },
 
    "node_modules/@babel/highlight": {
 
      "version": "7.8.3",
 
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
 
      "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
 
      "version": "7.24.7",
 
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
 
      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
 
      "dev": true,
 
      "dependencies": {
 
        "chalk": "^2.0.0",
 
        "esutils": "^2.0.2",
 
        "js-tokens": "^4.0.0"
 
        "@babel/helper-validator-identifier": "^7.24.7",
 
        "chalk": "^2.4.2",
 
        "js-tokens": "^4.0.0",
 
        "picocolors": "^1.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6.9.0"
 
      }
 
    },
 
    "node_modules/abbrev": {
 
      "version": "1.1.1",
 
      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
 
      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
 
      "dev": true
 
    },
 
    "node_modules/acorn": {
 
      "version": "7.1.0",
 
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
 
      "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
 
      "version": "7.4.1",
 
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
 
      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
 
      "dev": true,
 
      "bin": {
 
        "acorn": "bin/acorn"
 
      },
 
      "engines": {
 
        "node": ">=0.4.0"
 
      }
 
    },
 
    "node_modules/acorn-jsx": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
 
      "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
 
      "version": "5.3.2",
 
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
 
      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
 
      "dev": true,
 
      "peerDependencies": {
 
        "acorn": "^6.0.0 || ^7.0.0"
 
        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
 
      }
 
    },
 
    "node_modules/ajv": {
 
      "version": "6.10.2",
 
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
 
      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
 
      "version": "6.12.6",
 
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
 
      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
 
      "dev": true,
 
      "dependencies": {
 
        "fast-deep-equal": "^2.0.1",
 
        "fast-deep-equal": "^3.1.1",
 
        "fast-json-stable-stringify": "^2.0.0",
 
        "json-schema-traverse": "^0.4.1",
 
        "uri-js": "^4.2.2"
 
      },
 
      "funding": {
 
        "type": "github",
 
        "url": "https://github.com/sponsors/epoberezkin"
 
      }
 
    },
 
    "node_modules/amdefine": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
 
      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
 
      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.4.2"
 
      }
 
    },
 
    "node_modules/ansi-escapes": {
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
 
      "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
 
      "version": "4.3.2",
 
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
 
      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "type-fest": "^0.8.1"
 
        "type-fest": "^0.21.3"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/ansi-escapes/node_modules/type-fest": {
 
      "version": "0.21.3",
 
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
 
      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=10"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/ansi-regex": {
 
      "version": "5.0.0",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
 
      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
 
      "version": "4.1.1",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
 
      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/ansi-styles": {
 
      "version": "3.2.1",
 
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 
      "dev": true,
 
      "dependencies": {
 
        "color-convert": "^1.9.0"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/argparse": {
 
      "version": "1.0.10",
 
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 
      "dev": true,
 
      "dependencies": {
 
        "sprintf-js": "~1.0.2"
 
      }
 
    },
 
    "node_modules/array-find-index": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
 
      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
 
      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/asap": {
 
      "version": "2.0.6",
 
      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
 
      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
 
      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
 
      "dev": true
 
    },
 
    "node_modules/asn1": {
 
      "version": "0.2.4",
 
      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
 
      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "safer-buffer": "~2.1.0"
 
      }
 
    },
 
    "node_modules/assert-plus": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
 
      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">=0.8"
 
      }
 
    },
 
    "node_modules/astral-regex": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
 
      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/asynckit": {
 
      "version": "0.4.0",
 
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/at.js": {
 
      "version": "1.5.4",
 
      "resolved": "https://registry.npmjs.org/at.js/-/at.js-1.5.4.tgz",
 
      "integrity": "sha512-G8mgUb/PqShPoH8AyjuxsTGvIr1o716BtQUKDM44C8qN2W615y7KGJ68MlTGamd0J0D/m28emUkzagaHTdrGZw==",
 
      "engines": {
 
        "node": ">= 0.6.0"
 
      },
 
      "peerDependencies": {
 
        "jquery": ">=1.7.0 <4.0.0"
 
      }
 
    },
 
    "node_modules/aws-sign2": {
 
      "version": "0.7.0",
 
      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
 
      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/aws4": {
 
      "version": "1.8.0",
 
      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
 
      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/balanced-match": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
 
      "dev": true
 
    },
 
    "node_modules/bcrypt-pbkdf": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
 
      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "tweetnacl": "^0.14.3"
 
      }
 
    },
 
    "node_modules/bootstrap": {
 
      "version": "3.3.7",
 
      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz",
 
      "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=",
 
      "version": "3.4.1",
 
      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
 
      "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
 
      "engines": {
 
        "node": ">=0.10.1"
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/brace-expansion": {
 
      "version": "1.1.11",
 
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 
      "dev": true,
 
      "dependencies": {
 
        "balanced-match": "^1.0.0",
 
        "concat-map": "0.0.1"
 
      }
 
    },
 
    "node_modules/callsites": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/caseless": {
 
      "version": "0.12.0",
 
      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
 
      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/chalk": {
 
      "version": "2.4.2",
 
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-styles": "^3.2.1",
 
        "escape-string-regexp": "^1.0.5",
 
        "supports-color": "^5.3.0"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/chardet": {
 
      "version": "0.7.0",
 
      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
 
      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
 
      "dev": true
 
    },
 
    "node_modules/clean-css": {
 
      "version": "3.4.28",
 
      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
 
      "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
 
      "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==",
 
      "dev": true,
 
      "dependencies": {
 
        "commander": "2.8.x",
 
        "source-map": "0.4.x"
 
      },
 
      "bin": {
 
        "cleancss": "bin/cleancss"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/clean-css/node_modules/source-map": {
 
      "version": "0.4.4",
 
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
 
      "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
 
      "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
 
      "dev": true,
 
      "dependencies": {
 
        "amdefine": ">=0.0.4"
 
      },
 
      "engines": {
 
        "node": ">=0.8.0"
 
      }
 
    },
 
    "node_modules/cli-cursor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
 
      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
 
      "dev": true,
 
      "dependencies": {
 
        "restore-cursor": "^3.1.0"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/cli-width": {
 
      "version": "2.2.0",
 
      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
 
      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
 
      "dev": true
 
    },
 
    "node_modules/clone": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
 
      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
 
      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.8"
 
        "node": ">= 10"
 
      }
 
    },
 
    "node_modules/codemirror": {
 
      "version": "5.49.0",
 
      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.49.0.tgz",
 
      "integrity": "sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA=="
 
      "version": "5.65.17",
 
      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.17.tgz",
 
      "integrity": "sha512-1zOsUx3lzAOu/gnMAZkQ9kpIHcPYOc9y1Fbm2UVk5UBPkdq380nhkelG0qUwm1f7wPvTbndu9ZYlug35EwAZRQ=="
 
    },
 
    "node_modules/color-convert": {
 
      "version": "1.9.3",
 
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
 
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
 
      "dev": true,
 
      "dependencies": {
 
        "color-name": "1.1.3"
 
      }
 
    },
 
    "node_modules/color-name": {
 
      "version": "1.1.3",
 
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
 
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
 
      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
 
      "dev": true
 
    },
 
    "node_modules/combined-stream": {
 
      "version": "1.0.8",
 
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "delayed-stream": "~1.0.0"
 
      },
 
      "engines": {
 
        "node": ">= 0.8"
 
      }
 
    },
 
    "node_modules/commander": {
 
      "version": "2.8.1",
 
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
 
      "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
 
      "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "graceful-readlink": ">= 1.0.0"
 
      },
 
      "engines": {
 
        "node": ">= 0.6.x"
 
      }
 
    },
 
    "node_modules/concat-map": {
 
      "version": "0.0.1",
 
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 
      "dev": true
 
    },
 
    "node_modules/core-util-is": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
 
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
 
    "node_modules/copy-anything": {
 
      "version": "2.0.6",
 
      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
 
      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
 
      "dev": true,
 
      "optional": true
 
      "dependencies": {
 
        "is-what": "^3.14.1"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/mesqueeb"
 
      }
 
    },
 
    "node_modules/cross-spawn": {
 
      "version": "6.0.5",
 
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
 
      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "nice-try": "^1.0.4",
 
        "path-key": "^2.0.1",
 
        "semver": "^5.5.0",
 
        "shebang-command": "^1.2.0",
 
        "which": "^1.2.9"
 
      },
 
      "engines": {
 
        "node": ">=4.8"
 
      }
 
    },
 
    "node_modules/dashdash": {
 
      "version": "1.14.1",
 
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
 
      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
 
    "node_modules/cross-spawn/node_modules/semver": {
 
      "version": "5.7.2",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 
      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "assert-plus": "^1.0.0"
 
      },
 
      "engines": {
 
        "node": ">=0.10"
 
      "bin": {
 
        "semver": "bin/semver"
 
      }
 
    },
 
    "node_modules/datatables.net": {
 
      "version": "1.10.20",
 
      "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz",
 
      "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==",
 
      "version": "1.13.11",
 
      "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.13.11.tgz",
 
      "integrity": "sha512-AE6RkMXziRaqzPcu/pl3SJXeRa6fmXQG/fVjuRESujvkzqDCYEeKTTpPMuVJSGYJpPi32WGSphVNNY1G4nSN/g==",
 
      "dependencies": {
 
        "jquery": ">=1.7"
 
        "jquery": "1.8 - 4"
 
      }
 
    },
 
    "node_modules/datatables.net-bs": {
 
      "version": "1.10.20",
 
      "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.10.20.tgz",
 
      "integrity": "sha512-NsMoOOYZ6NlteOpzhltw21lXsNdhjIMbIOxnqmcrb62ntl8eL9pYzk2AeiDXBlIKY4e550ZrExCq3CYKQ9myEg==",
 
      "version": "1.13.11",
 
      "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.13.11.tgz",
 
      "integrity": "sha512-oZeXzC2Z+pZc9Wpil6XuuwMPMfllSd+hWEauhKr8q7bTM5fGuBKzAVzSr7Tuo1OzMBZ6NkAb+HSBGCGUn5Qbhg==",
 
      "dependencies": {
 
        "datatables.net": "1.10.20",
 
        "jquery": ">=1.7"
 
        "datatables.net": "1.13.11",
 
        "jquery": "1.8 - 4"
 
      }
 
    },
 
    "node_modules/debug": {
 
      "version": "3.2.6",
 
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
 
      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
 
      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
 
      "version": "4.3.5",
 
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
 
      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
 
      "dev": true,
 
      "dependencies": {
 
        "ms": "^2.1.1"
 
        "ms": "2.1.2"
 
      },
 
      "engines": {
 
        "node": ">=6.0"
 
      },
 
      "peerDependenciesMeta": {
 
        "supports-color": {
 
          "optional": true
 
        }
 
      }
 
    },
 
    "node_modules/debuglog": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
 
      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
 
      "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==",
 
      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
 
      "dev": true,
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/deep-is": {
 
      "version": "0.1.3",
 
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
 
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
 
      "version": "0.1.4",
 
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
 
      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
 
      "dev": true
 
    },
 
    "node_modules/delayed-stream": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 
      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">=0.4.0"
 
      }
 
    },
 
    "node_modules/dezalgo": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
 
      "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
 
      "version": "1.0.4",
 
      "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
 
      "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
 
      "dev": true,
 
      "dependencies": {
 
        "asap": "^2.0.0",
 
        "wrappy": "1"
 
      }
 
    },
 
    "node_modules/doctrine": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
 
      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
 
      "dev": true,
 
      "dependencies": {
 
        "esutils": "^2.0.2"
 
      },
 
      "engines": {
 
        "node": ">=6.0.0"
 
      }
 
    },
 
    "node_modules/dom-serializer": {
 
      "version": "0.2.2",
 
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
 
      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
 
      "version": "1.4.1",
 
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
 
      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
 
      "dev": true,
 
      "dependencies": {
 
        "domelementtype": "^2.0.1",
 
        "domhandler": "^4.2.0",
 
        "entities": "^2.0.0"
 
      },
 
      "funding": {
 
        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
 
      }
 
    },
 
    "node_modules/dom-serializer/node_modules/domelementtype": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
 
      "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
 
      "dev": true
 
    },
 
    "node_modules/dom-serializer/node_modules/entities": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
 
      "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
 
      "dev": true
 
      "version": "2.2.0",
 
      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
 
      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
 
      "dev": true,
 
      "funding": {
 
        "url": "https://github.com/fb55/entities?sponsor=1"
 
      }
 
    },
 
    "node_modules/domelementtype": {
 
      "version": "1.3.1",
 
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
 
      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
 
      "dev": true
 
      "version": "2.3.0",
 
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
 
      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
 
      "dev": true,
 
      "funding": [
 
        {
 
          "type": "github",
 
          "url": "https://github.com/sponsors/fb55"
 
        }
 
      ]
 
    },
 
    "node_modules/domhandler": {
 
      "version": "2.4.2",
 
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
 
      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
 
      "version": "4.3.1",
 
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
 
      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "domelementtype": "1"
 
        "domelementtype": "^2.2.0"
 
      },
 
      "engines": {
 
        "node": ">= 4"
 
      },
 
      "funding": {
 
        "url": "https://github.com/fb55/domhandler?sponsor=1"
 
      }
 
    },
 
    "node_modules/domutils": {
 
      "version": "1.7.0",
 
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
 
      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
 
      "version": "2.8.0",
 
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
 
      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
 
      "dev": true,
 
      "dependencies": {
 
        "dom-serializer": "0",
 
        "domelementtype": "1"
 
      }
 
    },
 
    "node_modules/ecc-jsbn": {
 
      "version": "0.1.2",
 
      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
 
      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "jsbn": "~0.1.0",
 
        "safer-buffer": "^2.1.0"
 
        "dom-serializer": "^1.0.1",
 
        "domelementtype": "^2.2.0",
 
        "domhandler": "^4.2.0"
 
      },
 
      "funding": {
 
        "url": "https://github.com/fb55/domutils?sponsor=1"
 
      }
 
    },
 
    "node_modules/emoji-regex": {
 
      "version": "8.0.0",
 
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
      "dev": true
 
    },
 
    "node_modules/entities": {
 
      "version": "1.1.2",
 
      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
 
      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
 
      "dev": true
 
      "version": "3.0.1",
 
      "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
 
      "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.12"
 
      },
 
      "funding": {
 
        "url": "https://github.com/fb55/entities?sponsor=1"
 
      }
 
    },
 
    "node_modules/errno": {
 
      "version": "0.1.7",
 
      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
 
      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
 
      "version": "0.1.8",
 
      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
 
      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "prr": "~1.0.1"
 
      },
 
      "bin": {
 
        "errno": "cli.js"
 
      }
 
    },
 
    "node_modules/escape-string-regexp": {
 
      "version": "1.0.5",
 
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
 
      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.8.0"
 
      }
 
    },
 
    "node_modules/eslint": {
 
      "version": "6.8.0",
 
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
 
      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
 
      "dev": true,
 
      "dependencies": {
 
        "@babel/code-frame": "^7.0.0",
 
        "ajv": "^6.10.0",
 
        "chalk": "^2.1.0",
 
        "cross-spawn": "^6.0.5",
 
        "debug": "^4.0.1",
 
        "doctrine": "^3.0.0",
 
        "eslint-scope": "^5.0.0",
 
        "eslint-utils": "^1.4.3",
 
        "eslint-visitor-keys": "^1.1.0",
 
        "espree": "^6.1.2",
 
        "esquery": "^1.0.1",
 
        "esutils": "^2.0.2",
 
        "file-entry-cache": "^5.0.1",
 
        "functional-red-black-tree": "^1.0.1",
 
        "glob-parent": "^5.0.0",
 
        "globals": "^12.1.0",
 
        "ignore": "^4.0.6",
 
        "import-fresh": "^3.0.0",
 
        "imurmurhash": "^0.1.4",
 
        "inquirer": "^7.0.0",
 
        "is-glob": "^4.0.0",
 
        "js-yaml": "^3.13.1",
 
        "json-stable-stringify-without-jsonify": "^1.0.1",
 
        "levn": "^0.3.0",
 
        "lodash": "^4.17.14",
 
        "minimatch": "^3.0.4",
 
        "mkdirp": "^0.5.1",
 
        "natural-compare": "^1.4.0",
 
        "optionator": "^0.8.3",
 
        "progress": "^2.0.0",
 
        "regexpp": "^2.0.1",
 
        "semver": "^6.1.2",
 
        "strip-ansi": "^5.2.0",
 
        "strip-json-comments": "^3.0.1",
 
        "table": "^5.2.3",
 
        "text-table": "^0.2.0",
 
        "v8-compile-cache": "^2.0.3"
 
      },
 
      "bin": {
 
        "eslint": "bin/eslint.js"
 
      },
 
      "engines": {
 
        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
 
      },
 
      "funding": {
 
        "url": "https://opencollective.com/eslint"
 
      }
 
    },
 
    "node_modules/eslint-plugin-html": {
 
      "version": "6.0.0",
 
      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.0.0.tgz",
 
      "integrity": "sha512-PQcGippOHS+HTbQCStmH5MY1BF2MaU8qW/+Mvo/8xTa/ioeMXdSP+IiaBw2+nh0KEMfYQKuTz1Zo+vHynjwhbg==",
 
      "version": "6.2.0",
 
      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz",
 
      "integrity": "sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==",
 
      "dev": true,
 
      "dependencies": {
 
        "htmlparser2": "^3.10.1"
 
        "htmlparser2": "^7.1.2"
 
      }
 
    },
 
    "node_modules/eslint-scope": {
 
      "version": "5.0.0",
 
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
 
      "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
 
      "version": "5.1.1",
 
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
 
      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
 
      "dev": true,
 
      "dependencies": {
 
        "esrecurse": "^4.1.0",
 
        "esrecurse": "^4.3.0",
 
        "estraverse": "^4.1.1"
 
      },
 
      "engines": {
 
        "node": ">=8.0.0"
 
      }
 
    },
 
    "node_modules/eslint-utils": {
 
      "version": "1.4.3",
 
      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
 
      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
 
      "dev": true,
 
      "dependencies": {
 
        "eslint-visitor-keys": "^1.1.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/eslint-visitor-keys": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
 
      "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
 
      "version": "1.3.0",
 
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
 
      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/eslint/node_modules/debug": {
 
      "version": "4.1.1",
 
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
 
      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
 
      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
 
    "node_modules/espree": {
 
      "version": "6.2.1",
 
      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
 
      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
 
      "dev": true,
 
      "dependencies": {
 
        "ms": "^2.1.1"
 
      }
 
    },
 
    "node_modules/eslint/node_modules/semver": {
 
      "version": "6.3.0",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
 
      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
 
      "dev": true,
 
      "bin": {
 
        "semver": "bin/semver.js"
 
      }
 
    },
 
    "node_modules/espree": {
 
      "version": "6.1.2",
 
      "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
 
      "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
 
      "dev": true,
 
      "dependencies": {
 
        "acorn": "^7.1.0",
 
        "acorn-jsx": "^5.1.0",
 
        "acorn": "^7.1.1",
 
        "acorn-jsx": "^5.2.0",
 
        "eslint-visitor-keys": "^1.1.0"
 
      },
 
      "engines": {
 
        "node": ">=6.0.0"
 
      }
 
    },
 
    "node_modules/esprima": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
 
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
 
      "dev": true,
 
      "bin": {
 
        "esparse": "bin/esparse.js",
 
        "esvalidate": "bin/esvalidate.js"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/esquery": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz",
 
      "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==",
 
      "version": "1.6.0",
 
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
 
      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
 
      "dev": true,
 
      "dependencies": {
 
        "estraverse": "^4.0.0"
 
        "estraverse": "^5.1.0"
 
      },
 
      "engines": {
 
        "node": ">=0.6"
 
        "node": ">=0.10"
 
      }
 
    },
 
    "node_modules/esquery/node_modules/estraverse": {
 
      "version": "5.3.0",
 
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
 
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4.0"
 
      }
 
    },
 
    "node_modules/esrecurse": {
 
      "version": "4.2.1",
 
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
 
      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
 
      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
 
      "dev": true,
 
      "dependencies": {
 
        "estraverse": "^4.1.0"
 
        "estraverse": "^5.2.0"
 
      },
 
      "engines": {
 
        "node": ">=4.0"
 
      }
 
    },
 
    "node_modules/esrecurse/node_modules/estraverse": {
 
      "version": "5.3.0",
 
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
 
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4.0"
 
      }
 
    },
 
    "node_modules/estraverse": {
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
 
      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4.0"
 
      }
 
    },
 
    "node_modules/esutils": {
 
      "version": "2.0.3",
 
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
 
      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/extend": {
 
      "version": "3.0.2",
 
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
 
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/external-editor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
 
      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
 
      "dev": true,
 
      "dependencies": {
 
        "chardet": "^0.7.0",
 
        "iconv-lite": "^0.4.24",
 
        "tmp": "^0.0.33"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/extsprintf": {
 
      "version": "1.3.0",
 
      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
 
      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
 
      "dev": true,
 
      "engines": [
 
        "node >=0.6.0"
 
      ],
 
      "optional": true
 
    },
 
    "node_modules/fast-deep-equal": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
 
      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
 
      "version": "3.1.3",
 
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 
      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
 
      "dev": true
 
    },
 
    "node_modules/fast-json-stable-stringify": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
 
      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
 
      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
 
      "dev": true
 
    },
 
    "node_modules/fast-levenshtein": {
 
      "version": "2.0.6",
 
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
 
      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
 
      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
 
      "dev": true
 
    },
 
    "node_modules/figures": {
 
      "version": "3.2.0",
 
      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
 
      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
 
      "dev": true,
 
      "dependencies": {
 
        "escape-string-regexp": "^1.0.5"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/file-entry-cache": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
 
      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
 
      "dev": true,
 
      "dependencies": {
 
        "flat-cache": "^2.0.1"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/flat-cache": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
 
      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
 
      "dev": true,
 
      "dependencies": {
 
        "flatted": "^2.0.0",
 
        "rimraf": "2.6.3",
 
        "write": "1.0.3"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/flatted": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
 
      "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
 
      "version": "2.0.2",
 
      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
 
      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
 
      "dev": true
 
    },
 
    "node_modules/forever-agent": {
 
      "version": "0.6.1",
 
      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
 
      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/form-data": {
 
      "version": "2.3.3",
 
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
 
      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "asynckit": "^0.4.0",
 
        "combined-stream": "^1.0.6",
 
        "mime-types": "^2.1.12"
 
      },
 
      "engines": {
 
        "node": ">= 0.12"
 
      }
 
    },
 
    "node_modules/fs.realpath": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
 
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
 
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
 
      "dev": true
 
    },
 
    "node_modules/function-bind": {
 
      "version": "1.1.2",
 
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
 
      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
 
      "dev": true,
 
      "funding": {
 
        "url": "https://github.com/sponsors/ljharb"
 
      }
 
    },
 
    "node_modules/functional-red-black-tree": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
 
      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
 
      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
 
      "dev": true
 
    },
 
    "node_modules/getpass": {
 
      "version": "0.1.7",
 
      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
 
      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "assert-plus": "^1.0.0"
 
      }
 
    },
 
    "node_modules/glob": {
 
      "version": "7.1.6",
 
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
 
      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
 
      "version": "7.2.3",
 
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
 
      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
 
      "deprecated": "Glob versions prior to v9 are no longer supported",
 
      "dev": true,
 
      "dependencies": {
 
        "fs.realpath": "^1.0.0",
 
        "inflight": "^1.0.4",
 
        "inherits": "2",
 
        "minimatch": "^3.0.4",
 
        "minimatch": "^3.1.1",
 
        "once": "^1.3.0",
 
        "path-is-absolute": "^1.0.0"
 
      },
 
      "engines": {
 
        "node": "*"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/isaacs"
 
      }
 
    },
 
    "node_modules/glob-parent": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
 
      "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
 
      "version": "5.1.2",
 
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 
      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 
      "dev": true,
 
      "dependencies": {
 
        "is-glob": "^4.0.1"
 
      },
 
      "engines": {
 
        "node": ">= 6"
 
      }
 
    },
 
    "node_modules/globals": {
 
      "version": "12.3.0",
 
      "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
 
      "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
 
      "version": "12.4.0",
 
      "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
 
      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
 
      "dev": true,
 
      "dependencies": {
 
        "type-fest": "^0.8.1"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/graceful-fs": {
 
      "version": "4.2.3",
 
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
 
      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
 
      "version": "4.2.11",
 
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
 
      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
 
      "dev": true
 
    },
 
    "node_modules/graceful-readlink": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
 
      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
 
      "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==",
 
      "dev": true
 
    },
 
    "node_modules/har-schema": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
 
      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/har-validator": {
 
      "version": "5.1.3",
 
      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
 
      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
 
      "deprecated": "this library is no longer supported",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "ajv": "^6.5.5",
 
        "har-schema": "^2.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/has-flag": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
 
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
 
      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/hasown": {
 
      "version": "2.0.2",
 
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 
      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "function-bind": "^1.1.2"
 
      },
 
      "engines": {
 
        "node": ">= 0.4"
 
      }
 
    },
 
    "node_modules/hosted-git-info": {
 
      "version": "2.8.5",
 
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
 
      "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
 
      "version": "2.8.9",
 
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
 
      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 
      "dev": true
 
    },
 
    "node_modules/htmlparser2": {
 
      "version": "3.10.1",
 
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
 
      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
 
      "version": "7.2.0",
 
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
 
      "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
 
      "dev": true,
 
      "funding": [
 
        "https://github.com/fb55/htmlparser2?sponsor=1",
 
        {
 
          "type": "github",
 
          "url": "https://github.com/sponsors/fb55"
 
        }
 
      ],
 
      "dependencies": {
 
        "domelementtype": "^1.3.1",
 
        "domhandler": "^2.3.0",
 
        "domutils": "^1.5.1",
 
        "entities": "^1.1.1",
 
        "inherits": "^2.0.1",
 
        "readable-stream": "^3.1.1"
 
      }
 
    },
 
    "node_modules/http-signature": {
 
      "version": "1.2.0",
 
      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
 
      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "assert-plus": "^1.0.0",
 
        "jsprim": "^1.2.2",
 
        "sshpk": "^1.7.0"
 
      },
 
      "engines": {
 
        "node": ">=0.8",
 
        "npm": ">=1.3.7"
 
        "domelementtype": "^2.0.1",
 
        "domhandler": "^4.2.2",
 
        "domutils": "^2.8.0",
 
        "entities": "^3.0.1"
 
      }
 
    },
 
    "node_modules/iconv-lite": {
 
      "version": "0.4.24",
 
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 
      "dev": true,
 
      "dependencies": {
 
        "safer-buffer": ">= 2.1.2 < 3"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/ignore": {
 
      "version": "4.0.6",
 
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
 
      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">= 4"
 
      }
 
    },
 
    "node_modules/image-size": {
 
      "version": "0.5.5",
 
      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
 
      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
 
      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
 
      "dev": true,
 
      "optional": true,
 
      "bin": {
 
        "image-size": "bin/image-size.js"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/import-fresh": {
 
      "version": "3.2.1",
 
      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
 
      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
 
      "version": "3.3.0",
 
      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
 
      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
 
      "dev": true,
 
      "dependencies": {
 
        "parent-module": "^1.0.0",
 
        "resolve-from": "^4.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/imurmurhash": {
 
      "version": "0.1.4",
 
      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
 
      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
 
      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.8.19"
 
      }
 
    },
 
    "node_modules/inflight": {
 
      "version": "1.0.6",
 
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
 
      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
 
      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
 
      "dev": true,
 
      "dependencies": {
 
        "once": "^1.3.0",
 
        "wrappy": "1"
 
      }
 
    },
 
    "node_modules/inherits": {
 
      "version": "2.0.4",
 
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
 
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
 
      "dev": true
 
    },
 
    "node_modules/inquirer": {
 
      "version": "7.0.4",
 
      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
 
      "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
 
      "version": "7.3.3",
 
      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
 
      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-escapes": "^4.2.1",
 
        "chalk": "^2.4.2",
 
        "chalk": "^4.1.0",
 
        "cli-cursor": "^3.1.0",
 
        "cli-width": "^2.0.0",
 
        "cli-width": "^3.0.0",
 
        "external-editor": "^3.0.3",
 
        "figures": "^3.0.0",
 
        "lodash": "^4.17.15",
 
        "lodash": "^4.17.19",
 
        "mute-stream": "0.0.8",
 
        "run-async": "^2.2.0",
 
        "rxjs": "^6.5.3",
 
        "run-async": "^2.4.0",
 
        "rxjs": "^6.6.0",
 
        "string-width": "^4.1.0",
 
        "strip-ansi": "^5.1.0",
 
        "strip-ansi": "^6.0.0",
 
        "through": "^2.3.6"
 
      },
 
      "engines": {
 
        "node": ">=6.0.0"
 
        "node": ">=8.0.0"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/ansi-regex": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/ansi-styles": {
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 
      "dev": true,
 
      "dependencies": {
 
        "color-convert": "^2.0.1"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      },
 
      "funding": {
 
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/chalk": {
 
      "version": "4.1.2",
 
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
 
      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-styles": "^4.1.0",
 
        "supports-color": "^7.1.0"
 
      },
 
      "engines": {
 
        "node": ">=10"
 
      },
 
      "funding": {
 
        "url": "https://github.com/chalk/chalk?sponsor=1"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/color-convert": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "color-name": "~1.1.4"
 
      },
 
      "engines": {
 
        "node": ">=7.0.0"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/color-name": {
 
      "version": "1.1.4",
 
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
 
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 
      "dev": true
 
    },
 
    "node_modules/inquirer/node_modules/has-flag": {
 
      "version": "4.0.0",
 
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/strip-ansi": {
 
      "version": "6.0.1",
 
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 
      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-regex": "^5.0.1"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/inquirer/node_modules/supports-color": {
 
      "version": "7.2.0",
 
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
 
      "dev": true,
 
      "dependencies": {
 
        "has-flag": "^4.0.0"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/is-core-module": {
 
      "version": "2.15.0",
 
      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
 
      "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
 
      "dev": true,
 
      "dependencies": {
 
        "hasown": "^2.0.2"
 
      },
 
      "engines": {
 
        "node": ">= 0.4"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/ljharb"
 
      }
 
    },
 
    "node_modules/is-extglob": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 
      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
 
      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/is-fullwidth-code-point": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/is-glob": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
 
      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
 
      "version": "4.0.3",
 
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 
      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
 
      "dev": true,
 
      "dependencies": {
 
        "is-extglob": "^2.1.1"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/is-promise": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
 
      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
 
    "node_modules/is-what": {
 
      "version": "3.14.1",
 
      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
 
      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
 
      "dev": true
 
    },
 
    "node_modules/is-typedarray": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
 
      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/isexe": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 
      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
 
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 
      "dev": true
 
    },
 
    "node_modules/isstream": {
 
      "version": "0.1.2",
 
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
 
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/jquery": {
 
      "version": "3.4.1",
 
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
 
      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
 
      "version": "3.7.1",
 
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
 
      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
 
    },
 
    "node_modules/jquery.caret": {
 
      "version": "0.3.1",
 
      "resolved": "https://registry.npmjs.org/jquery.caret/-/jquery.caret-0.3.1.tgz",
 
      "integrity": "sha1-nAkzGPrzJ+/zIugmyp8yQTaLx7g="
 
      "integrity": "sha512-nS2mjMZzP4e4tIOgeTLSs+jFhUsUVZUPgkUMpi4DlJq9SgKEg6w2jf7q8joMJp6v+voJHXrH8rzAnbyxWHwAeA=="
 
    },
 
    "node_modules/jquery.flot": {
 
      "version": "0.8.3",
 
      "resolved": "https://registry.npmjs.org/jquery.flot/-/jquery.flot-0.8.3.tgz",
 
      "integrity": "sha512-/tEE8J5NjwvStHDaCHkvTJpD7wDS4hE1OEL8xEmhgQfUe0gLUem923PIceNez1mz4yBNx6Hjv7pJcowLNd+nbg=="
 
    },
 
    "node_modules/js-tokens": {
 
      "version": "4.0.0",
 
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 
      "dev": true
 
    },
 
    "node_modules/js-yaml": {
 
      "version": "3.13.1",
 
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
 
      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
 
      "version": "3.14.1",
 
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
 
      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
 
      "dev": true,
 
      "dependencies": {
 
        "argparse": "^1.0.7",
 
        "esprima": "^4.0.0"
 
      },
 
      "bin": {
 
        "js-yaml": "bin/js-yaml.js"
 
      }
 
    },
 
    "node_modules/jsbn": {
 
      "version": "0.1.1",
 
      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
 
      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/json-parse-better-errors": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
 
      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
 
    "node_modules/json-parse-even-better-errors": {
 
      "version": "2.3.1",
 
      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
 
      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
 
      "dev": true
 
    },
 
    "node_modules/json-schema": {
 
      "version": "0.2.3",
 
      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
 
      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/json-schema-traverse": {
 
      "version": "0.4.1",
 
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 
      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
 
      "dev": true
 
    },
 
    "node_modules/json-stable-stringify-without-jsonify": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
 
      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
 
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
 
      "dev": true
 
    },
 
    "node_modules/json-stringify-safe": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
 
      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/jsprim": {
 
      "version": "1.4.1",
 
      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
 
      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
 
      "dev": true,
 
      "engines": [
 
        "node >=0.6.0"
 
      ],
 
      "optional": true,
 
      "dependencies": {
 
        "assert-plus": "1.0.0",
 
        "extsprintf": "1.3.0",
 
        "json-schema": "0.2.3",
 
        "verror": "1.10.0"
 
      }
 
    },
 
    "node_modules/less": {
 
      "version": "3.10.3",
 
      "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz",
 
      "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==",
 
      "version": "3.13.1",
 
      "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz",
 
      "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==",
 
      "dev": true,
 
      "dependencies": {
 
        "clone": "^2.1.2"
 
        "copy-anything": "^2.0.1",
 
        "tslib": "^1.10.0"
 
      },
 
      "bin": {
 
        "lessc": "bin/lessc"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      },
 
      "optionalDependencies": {
 
        "errno": "^0.1.1",
 
        "graceful-fs": "^4.1.2",
 
        "image-size": "~0.5.0",
 
        "make-dir": "^2.1.0",
 
        "mime": "^1.4.1",
 
        "mkdirp": "^0.5.0",
 
        "promise": "^7.1.1",
 
        "request": "^2.83.0",
 
        "native-request": "^1.0.5",
 
        "source-map": "~0.6.0"
 
      }
 
    },
 
    "node_modules/less-plugin-clean-css": {
 
      "version": "1.5.1",
 
      "resolved": "https://registry.npmjs.org/less-plugin-clean-css/-/less-plugin-clean-css-1.5.1.tgz",
 
      "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=",
 
      "integrity": "sha512-Pc68AFHAEJO3aAoRvnUTW5iAiAv6y+TQsWLTTwVNqjiDno6xCvxz1AtfQl7Y0MZSpHPalFajM1EU4RB5UVINpw==",
 
      "dev": true,
 
      "dependencies": {
 
        "clean-css": "^3.0.1"
 
      },
 
      "engines": {
 
        "node": ">=0.4.2"
 
      }
 
    },
 
    "node_modules/levn": {
 
      "version": "0.3.0",
 
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
 
      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
 
      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
 
      "dev": true,
 
      "dependencies": {
 
        "prelude-ls": "~1.1.2",
 
        "type-check": "~0.3.2"
 
      },
 
      "engines": {
 
        "node": ">= 0.8.0"
 
      }
 
    },
 
    "node_modules/license-checker": {
 
      "version": "25.0.1",
 
      "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz",
 
      "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==",
 
      "dev": true,
 
      "dependencies": {
 
        "chalk": "^2.4.1",
 
        "debug": "^3.1.0",
 
        "mkdirp": "^0.5.1",
 
        "nopt": "^4.0.1",
 
        "read-installed": "~4.0.3",
 
        "semver": "^5.5.0",
 
        "spdx-correct": "^3.0.0",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-satisfies": "^4.0.0",
 
        "treeify": "^1.1.0"
 
      },
 
      "bin": {
 
        "license-checker": "bin/license-checker"
 
      }
 
    },
 
    "node_modules/license-checker/node_modules/debug": {
 
      "version": "3.2.7",
 
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
 
      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "ms": "^2.1.1"
 
      }
 
    },
 
    "node_modules/license-checker/node_modules/semver": {
 
      "version": "5.7.2",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 
      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 
      "dev": true,
 
      "bin": {
 
        "semver": "bin/semver"
 
      }
 
    },
 
    "node_modules/lodash": {
 
      "version": "4.17.15",
 
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
 
      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
 
      "version": "4.17.21",
 
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
 
      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 
      "dev": true
 
    },
 
    "node_modules/make-dir": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
 
      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "pify": "^4.0.1",
 
        "semver": "^5.6.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/make-dir/node_modules/semver": {
 
      "version": "5.7.2",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 
      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 
      "dev": true,
 
      "optional": true,
 
      "bin": {
 
        "semver": "bin/semver"
 
      }
 
    },
 
    "node_modules/mime": {
 
      "version": "1.6.0",
 
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
 
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
 
      "dev": true,
 
      "optional": true,
 
      "bin": {
 
        "mime": "cli.js"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/mime-db": {
 
      "version": "1.40.0",
 
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
 
      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">= 0.6"
 
      }
 
    },
 
    "node_modules/mime-types": {
 
      "version": "2.1.24",
 
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
 
      "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "mime-db": "1.40.0"
 
      },
 
      "engines": {
 
        "node": ">= 0.6"
 
      }
 
    },
 
    "node_modules/mimic-fn": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
 
      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/minimatch": {
 
      "version": "3.0.4",
 
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
 
      "version": "3.1.2",
 
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
 
      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 
      "dev": true,
 
      "dependencies": {
 
        "brace-expansion": "^1.1.7"
 
      },
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/minimist": {
 
      "version": "0.0.8",
 
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
 
      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
 
      "dev": true
 
      "version": "1.2.8",
 
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
 
      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
 
      "dev": true,
 
      "funding": {
 
        "url": "https://github.com/sponsors/ljharb"
 
      }
 
    },
 
    "node_modules/mkdirp": {
 
      "version": "0.5.1",
 
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
 
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
 
      "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
 
      "version": "0.5.6",
 
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
 
      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
 
      "dev": true,
 
      "dependencies": {
 
        "minimist": "0.0.8"
 
        "minimist": "^1.2.6"
 
      },
 
      "bin": {
 
        "mkdirp": "bin/cmd.js"
 
      }
 
    },
 
    "node_modules/ms": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
 
      "dev": true
 
    },
 
    "node_modules/mute-stream": {
 
      "version": "0.0.8",
 
      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
 
      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
 
      "dev": true
 
    },
 
    "node_modules/native-request": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz",
 
      "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/natural-compare": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
 
      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
 
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
 
      "dev": true
 
    },
 
    "node_modules/nice-try": {
 
      "version": "1.0.5",
 
      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
 
      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
 
      "dev": true
 
    },
 
    "node_modules/nopt": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
 
      "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
 
      "version": "4.0.3",
 
      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
 
      "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
 
      "dev": true,
 
      "dependencies": {
 
        "abbrev": "1",
 
        "osenv": "^0.1.4"
 
      },
 
      "bin": {
 
        "nopt": "bin/nopt.js"
 
      }
 
    },
 
    "node_modules/normalize-package-data": {
 
      "version": "2.5.0",
 
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 
      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
 
      "dev": true,
 
      "dependencies": {
 
        "hosted-git-info": "^2.1.4",
 
        "resolve": "^1.10.0",
 
        "semver": "2 || 3 || 4 || 5",
 
        "validate-npm-package-license": "^3.0.1"
 
      }
 
    },
 
    "node_modules/oauth-sign": {
 
      "version": "0.9.0",
 
      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
 
      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
 
    "node_modules/normalize-package-data/node_modules/semver": {
 
      "version": "5.7.2",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 
      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": "*"
 
      "bin": {
 
        "semver": "bin/semver"
 
      }
 
    },
 
    "node_modules/npm-normalize-package-bin": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
 
      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
 
      "dev": true
 
    },
 
    "node_modules/once": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
 
      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
 
      "dev": true,
 
      "dependencies": {
 
        "wrappy": "1"
 
      }
 
    },
 
    "node_modules/onetime": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
 
      "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
 
      "version": "5.1.2",
 
      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
 
      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
 
      "dev": true,
 
      "dependencies": {
 
        "mimic-fn": "^2.1.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/optionator": {
 
      "version": "0.8.3",
 
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
 
      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
 
      "dev": true,
 
      "dependencies": {
 
        "deep-is": "~0.1.3",
 
        "fast-levenshtein": "~2.0.6",
 
        "levn": "~0.3.0",
 
        "prelude-ls": "~1.1.2",
 
        "type-check": "~0.3.2",
 
        "word-wrap": "~1.2.3"
 
      },
 
      "engines": {
 
        "node": ">= 0.8.0"
 
      }
 
    },
 
    "node_modules/os-homedir": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
 
      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
 
      "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/os-tmpdir": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
 
      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
 
      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/osenv": {
 
      "version": "0.1.5",
 
      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
 
      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
 
      "deprecated": "This package is no longer supported.",
 
      "dev": true,
 
      "dependencies": {
 
        "os-homedir": "^1.0.0",
 
        "os-tmpdir": "^1.0.0"
 
      }
 
    },
 
    "node_modules/parent-module": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
 
      "dev": true,
 
      "dependencies": {
 
        "callsites": "^3.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/path-is-absolute": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
 
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
 
      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/path-key": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
 
      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
 
      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/path-parse": {
 
      "version": "1.0.6",
 
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
 
      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
 
      "version": "1.0.7",
 
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 
      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 
      "dev": true
 
    },
 
    "node_modules/performance-now": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
 
      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
 
    "node_modules/picocolors": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
 
      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
 
      "dev": true
 
    },
 
    "node_modules/pify": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
 
      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
 
      "dev": true,
 
      "optional": true
 
      "optional": true,
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/prelude-ls": {
 
      "version": "1.1.2",
 
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
 
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
 
      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">= 0.8.0"
 
      }
 
    },
 
    "node_modules/progress": {
 
      "version": "2.0.3",
 
      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
 
      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.4.0"
 
      }
 
    },
 
    "node_modules/promise": {
 
      "version": "7.3.1",
 
      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
 
      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "asap": "~2.0.3"
 
      }
 
    },
 
    "node_modules/prr": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
 
      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/psl": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
 
      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
 
      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/punycode": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
 
      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
 
      "version": "2.3.1",
 
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
 
      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/qs": {
 
      "version": "6.5.2",
 
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
 
      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">=0.6"
 
      }
 
    },
 
    "node_modules/read-installed": {
 
      "version": "4.0.3",
 
      "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
 
      "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=",
 
      "integrity": "sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==",
 
      "deprecated": "This package is no longer supported.",
 
      "dev": true,
 
      "dependencies": {
 
        "debuglog": "^1.0.1",
 
        "read-package-json": "^2.0.0",
 
        "readdir-scoped-modules": "^1.0.0",
 
        "semver": "2 || 3 || 4 || 5",
 
        "slide": "~1.1.3",
 
        "util-extend": "^1.0.1"
 
      },
 
      "optionalDependencies": {
 
        "graceful-fs": "^4.1.2"
 
      }
 
    },
 
    "node_modules/read-installed/node_modules/semver": {
 
      "version": "5.7.2",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 
      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
 
      "dev": true,
 
      "bin": {
 
        "semver": "bin/semver"
 
      }
 
    },
 
    "node_modules/read-package-json": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz",
 
      "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==",
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz",
 
      "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==",
 
      "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.",
 
      "dev": true,
 
      "dependencies": {
 
        "glob": "^7.1.1",
 
        "json-parse-better-errors": "^1.0.1",
 
        "json-parse-even-better-errors": "^2.3.0",
 
        "normalize-package-data": "^2.0.0",
 
        "slash": "^1.0.0"
 
      },
 
      "optionalDependencies": {
 
        "graceful-fs": "^4.1.2"
 
      }
 
    },
 
    "node_modules/readable-stream": {
 
      "version": "3.6.0",
 
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
 
      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
 
      "dev": true,
 
      "dependencies": {
 
        "inherits": "^2.0.3",
 
        "string_decoder": "^1.1.1",
 
        "util-deprecate": "^1.0.1"
 
      },
 
      "engines": {
 
        "node": ">= 6"
 
        "npm-normalize-package-bin": "^1.0.0"
 
      }
 
    },
 
    "node_modules/readdir-scoped-modules": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
 
      "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
 
      "deprecated": "This functionality has been moved to @npmcli/fs",
 
      "dev": true,
 
      "dependencies": {
 
        "debuglog": "^1.0.1",
 
        "dezalgo": "^1.0.0",
 
        "graceful-fs": "^4.1.2",
 
        "once": "^1.3.0"
 
      }
 
    },
 
    "node_modules/regexpp": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
 
      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6.5.0"
 
      }
 
    },
 
    "node_modules/request": {
 
      "version": "2.88.0",
 
      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
 
      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
 
      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "aws-sign2": "~0.7.0",
 
        "aws4": "^1.8.0",
 
        "caseless": "~0.12.0",
 
        "combined-stream": "~1.0.6",
 
        "extend": "~3.0.2",
 
        "forever-agent": "~0.6.1",
 
        "form-data": "~2.3.2",
 
        "har-validator": "~5.1.0",
 
        "http-signature": "~1.2.0",
 
        "is-typedarray": "~1.0.0",
 
        "isstream": "~0.1.2",
 
        "json-stringify-safe": "~5.0.1",
 
        "mime-types": "~2.1.19",
 
        "oauth-sign": "~0.9.0",
 
        "performance-now": "^2.1.0",
 
        "qs": "~6.5.2",
 
        "safe-buffer": "^5.1.2",
 
        "tough-cookie": "~2.4.3",
 
        "tunnel-agent": "^0.6.0",
 
        "uuid": "^3.3.2"
 
      },
 
      "engines": {
 
        "node": ">= 4"
 
      }
 
    },
 
    "node_modules/resolve": {
 
      "version": "1.12.0",
 
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
 
      "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
 
      "version": "1.22.8",
 
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
 
      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
 
      "dev": true,
 
      "dependencies": {
 
        "path-parse": "^1.0.6"
 
        "is-core-module": "^2.13.0",
 
        "path-parse": "^1.0.7",
 
        "supports-preserve-symlinks-flag": "^1.0.0"
 
      },
 
      "bin": {
 
        "resolve": "bin/resolve"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/ljharb"
 
      }
 
    },
 
    "node_modules/resolve-from": {
 
      "version": "4.0.0",
 
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 
      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/restore-cursor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
 
      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
 
      "dev": true,
 
      "dependencies": {
 
        "onetime": "^5.1.0",
 
        "signal-exit": "^3.0.2"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/rimraf": {
 
      "version": "2.6.3",
 
      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
 
      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
 
      "deprecated": "Rimraf versions prior to v4 are no longer supported",
 
      "dev": true,
 
      "dependencies": {
 
        "glob": "^7.1.3"
 
      },
 
      "bin": {
 
        "rimraf": "bin.js"
 
      }
 
    },
 
    "node_modules/run-async": {
 
      "version": "2.3.0",
 
      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
 
      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
 
      "version": "2.4.1",
 
      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
 
      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "is-promise": "^2.1.0"
 
      },
 
      "engines": {
 
        "node": ">=0.12.0"
 
      }
 
    },
 
    "node_modules/rxjs": {
 
      "version": "6.5.4",
 
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
 
      "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
 
      "version": "6.6.7",
 
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
 
      "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "tslib": "^1.9.0"
 
      },
 
      "engines": {
 
        "npm": ">=2.0.0"
 
      }
 
    },
 
    "node_modules/safe-buffer": {
 
      "version": "5.2.0",
 
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
 
      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
 
      "dev": true
 
    },
 
    "node_modules/safer-buffer": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 
      "dev": true
 
    },
 
    "node_modules/select2": {
 
      "version": "3.5.1",
 
      "resolved": "https://registry.npmjs.org/select2/-/select2-3.5.1.tgz",
 
      "integrity": "sha1-8oGUibvGX9bTKL5yu+K5XdfofP4="
 
      "integrity": "sha512-IFX3UFPpPyK1I1Kuw1R1x+upMyNAZbMlkFhiTnRCRR7ii0KU1brmJMLa3GZcrMWCHiQlm0eKqb6i4XO4pqOrGQ=="
 
    },
 
    "node_modules/select2-bootstrap-css": {
 
      "version": "1.4.6",
 
      "resolved": "https://registry.npmjs.org/select2-bootstrap-css/-/select2-bootstrap-css-1.4.6.tgz",
 
      "integrity": "sha1-XPtoJG9SmcoYWOAe/XiIBMc0mX4="
 
      "integrity": "sha512-BBsisfivUYjwhj3QdWNS15sBqC/DHoszRC4B3GIzJwMNO1pT1uVvwDm5u2TLXi7oj/3S4vIeQ6yAuMa86d7c9A=="
 
    },
 
    "node_modules/semver": {
 
      "version": "5.7.1",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
 
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
 
      "version": "6.3.1",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
 
      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
 
      "dev": true,
 
      "bin": {
 
        "semver": "bin/semver"
 
        "semver": "bin/semver.js"
 
      }
 
    },
 
    "node_modules/shebang-command": {
 
      "version": "1.2.0",
 
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
 
      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
 
      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
 
      "dev": true,
 
      "dependencies": {
 
        "shebang-regex": "^1.0.0"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/shebang-regex": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
 
      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
 
      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/signal-exit": {
 
      "version": "3.0.2",
 
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
 
      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
 
      "version": "3.0.7",
 
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
 
      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
 
      "dev": true
 
    },
 
    "node_modules/slash": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
 
      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/slice-ansi": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
 
      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-styles": "^3.2.0",
 
        "astral-regex": "^1.0.0",
 
        "is-fullwidth-code-point": "^2.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
 
      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
 
      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/slide": {
 
      "version": "1.1.6",
 
      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
 
      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
 
      "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==",
 
      "dev": true,
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/source-map": {
 
      "version": "0.6.1",
 
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 
      "dev": true,
 
      "optional": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/spdx-compare": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz",
 
      "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==",
 
      "dev": true,
 
      "dependencies": {
 
        "array-find-index": "^1.0.2",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-ranges": "^2.0.0"
 
      }
 
    },
 
    "node_modules/spdx-correct": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
 
      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
 
      "version": "3.2.0",
 
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
 
      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
 
      "dev": true,
 
      "dependencies": {
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-license-ids": "^3.0.0"
 
      }
 
    },
 
    "node_modules/spdx-exceptions": {
 
      "version": "2.2.0",
 
      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
 
      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
 
      "version": "2.5.0",
 
      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
 
      "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
 
      "dev": true
 
    },
 
    "node_modules/spdx-expression-parse": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
 
      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
 
      "version": "3.0.1",
 
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 
      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
 
      "dev": true,
 
      "dependencies": {
 
        "spdx-exceptions": "^2.1.0",
 
        "spdx-license-ids": "^3.0.0"
 
      }
 
    },
 
    "node_modules/spdx-license-ids": {
 
      "version": "3.0.5",
 
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
 
      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
 
      "version": "3.0.18",
 
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
 
      "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
 
      "dev": true
 
    },
 
    "node_modules/spdx-ranges": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz",
 
      "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==",
 
      "dev": true
 
    },
 
    "node_modules/spdx-satisfies": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz",
 
      "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==",
 
      "dev": true,
 
      "dependencies": {
 
        "spdx-compare": "^1.0.0",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-ranges": "^2.0.0"
 
      }
 
    },
 
    "node_modules/sprintf-js": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
 
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
 
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
 
      "dev": true
 
    },
 
    "node_modules/sshpk": {
 
      "version": "1.16.1",
 
      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
 
      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "asn1": "~0.2.3",
 
        "assert-plus": "^1.0.0",
 
        "bcrypt-pbkdf": "^1.0.0",
 
        "dashdash": "^1.12.0",
 
        "ecc-jsbn": "~0.1.1",
 
        "getpass": "^0.1.1",
 
        "jsbn": "~0.1.0",
 
        "safer-buffer": "^2.0.2",
 
        "tweetnacl": "~0.14.0"
 
      },
 
      "bin": {
 
        "sshpk-conv": "bin/sshpk-conv",
 
        "sshpk-sign": "bin/sshpk-sign",
 
        "sshpk-verify": "bin/sshpk-verify"
 
      },
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/string_decoder": {
 
      "version": "1.3.0",
 
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
 
      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
 
      "dev": true,
 
      "dependencies": {
 
        "safe-buffer": "~5.2.0"
 
      }
 
    },
 
    "node_modules/string-width": {
 
      "version": "4.2.0",
 
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
 
      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
 
      "version": "4.2.3",
 
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 
      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 
      "dev": true,
 
      "dependencies": {
 
        "emoji-regex": "^8.0.0",
 
        "is-fullwidth-code-point": "^3.0.0",
 
        "strip-ansi": "^6.0.0"
 
        "strip-ansi": "^6.0.1"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/string-width/node_modules/ansi-regex": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/string-width/node_modules/strip-ansi": {
 
      "version": "6.0.0",
 
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
 
      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
 
      "version": "6.0.1",
 
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 
      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-regex": "^5.0.0"
 
        "ansi-regex": "^5.0.1"
 
      },
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/strip-ansi": {
 
      "version": "5.2.0",
 
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
 
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
 
      "dev": true,
 
      "dependencies": {
 
        "ansi-regex": "^4.1.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/strip-ansi/node_modules/ansi-regex": {
 
      "version": "4.1.0",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
 
      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/strip-json-comments": {
 
      "version": "3.0.1",
 
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
 
      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
 
      "version": "3.1.1",
 
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
 
      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/sindresorhus"
 
      }
 
    },
 
    "node_modules/supports-color": {
 
      "version": "5.5.0",
 
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 
      "dev": true,
 
      "dependencies": {
 
        "has-flag": "^3.0.0"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/supports-preserve-symlinks-flag": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
 
      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">= 0.4"
 
      },
 
      "funding": {
 
        "url": "https://github.com/sponsors/ljharb"
 
      }
 
    },
 
    "node_modules/table": {
 
      "version": "5.4.6",
 
      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
 
      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
 
      "dev": true,
 
      "dependencies": {
 
        "ajv": "^6.10.2",
 
        "lodash": "^4.17.14",
 
        "slice-ansi": "^2.1.0",
 
        "string-width": "^3.0.0"
 
      },
 
      "engines": {
 
        "node": ">=6.0.0"
 
      }
 
    },
 
    "node_modules/table/node_modules/emoji-regex": {
 
      "version": "7.0.3",
 
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
 
      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
 
      "dev": true
 
    },
 
    "node_modules/table/node_modules/is-fullwidth-code-point": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
 
      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
 
      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    },
 
    "node_modules/table/node_modules/string-width": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
 
      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
 
      "dev": true,
 
      "dependencies": {
 
        "emoji-regex": "^7.0.1",
 
        "is-fullwidth-code-point": "^2.0.0",
 
        "strip-ansi": "^5.1.0"
 
      },
 
      "engines": {
 
        "node": ">=6"
 
      }
 
    },
 
    "node_modules/text-table": {
 
      "version": "0.2.0",
 
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 
      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
 
      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
 
      "dev": true
 
    },
 
    "node_modules/through": {
 
      "version": "2.3.8",
 
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
 
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
 
      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
 
      "dev": true
 
    },
 
    "node_modules/tmp": {
 
      "version": "0.0.33",
 
      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
 
      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
 
      "dev": true,
 
      "dependencies": {
 
        "os-tmpdir": "~1.0.2"
 
      },
 
      "engines": {
 
        "node": ">=0.6.0"
 
      }
 
    },
 
    "node_modules/tough-cookie": {
 
      "version": "2.4.3",
 
      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
 
      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "psl": "^1.1.24",
 
        "punycode": "^1.4.1"
 
      },
 
      "engines": {
 
        "node": ">=0.8"
 
      }
 
    },
 
    "node_modules/tough-cookie/node_modules/punycode": {
 
      "version": "1.4.1",
 
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
 
      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/treeify": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
 
      "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.6"
 
      }
 
    },
 
    "node_modules/tslib": {
 
      "version": "1.11.0",
 
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz",
 
      "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==",
 
      "version": "1.14.1",
 
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
 
      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 
      "dev": true
 
    },
 
    "node_modules/tunnel-agent": {
 
      "version": "0.6.0",
 
      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
 
      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
 
      "dev": true,
 
      "optional": true,
 
      "dependencies": {
 
        "safe-buffer": "^5.0.1"
 
      },
 
      "engines": {
 
        "node": "*"
 
      }
 
    },
 
    "node_modules/tweetnacl": {
 
      "version": "0.14.5",
 
      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
 
      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "node_modules/type-check": {
 
      "version": "0.3.2",
 
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
 
      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
 
      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
 
      "dev": true,
 
      "dependencies": {
 
        "prelude-ls": "~1.1.2"
 
      },
 
      "engines": {
 
        "node": ">= 0.8.0"
 
      }
 
    },
 
    "node_modules/type-fest": {
 
      "version": "0.8.1",
 
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
 
      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=8"
 
      }
 
    },
 
    "node_modules/uri-js": {
 
      "version": "4.2.2",
 
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
 
      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
 
      "version": "4.4.1",
 
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
 
      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
 
      "dev": true,
 
      "dependencies": {
 
        "punycode": "^2.1.0"
 
      }
 
    },
 
    "node_modules/util-deprecate": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
 
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
 
      "dev": true
 
    },
 
    "node_modules/util-extend": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz",
 
      "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=",
 
      "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==",
 
      "dev": true
 
    },
 
    "node_modules/uuid": {
 
      "version": "3.3.3",
 
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
 
      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
 
      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
 
      "dev": true,
 
      "optional": true,
 
      "bin": {
 
        "uuid": "bin/uuid"
 
      }
 
    },
 
    "node_modules/v8-compile-cache": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
 
      "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
 
      "version": "2.4.0",
 
      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
 
      "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
 
      "dev": true
 
    },
 
    "node_modules/validate-npm-package-license": {
 
      "version": "3.0.4",
 
      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 
      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
 
      "dev": true,
 
      "dependencies": {
 
        "spdx-correct": "^3.0.0",
 
        "spdx-expression-parse": "^3.0.0"
 
      }
 
    },
 
    "node_modules/verror": {
 
      "version": "1.10.0",
 
      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
 
      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
 
      "dev": true,
 
      "engines": [
 
        "node >=0.6.0"
 
      ],
 
      "optional": true,
 
      "dependencies": {
 
        "assert-plus": "^1.0.0",
 
        "core-util-is": "1.0.2",
 
        "extsprintf": "^1.2.0"
 
      }
 
    },
 
    "node_modules/which": {
 
      "version": "1.3.1",
 
      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 
      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 
      "dev": true,
 
      "dependencies": {
 
        "isexe": "^2.0.0"
 
      },
 
      "bin": {
 
        "which": "bin/which"
 
      }
 
    },
 
    "node_modules/word-wrap": {
 
      "version": "1.2.3",
 
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
 
      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
 
      "version": "1.2.5",
 
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
 
      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
 
      "dev": true,
 
      "engines": {
 
        "node": ">=0.10.0"
 
      }
 
    },
 
    "node_modules/wrappy": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
 
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
 
      "dev": true
 
    },
 
    "node_modules/write": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
 
      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
 
      "dev": true,
 
      "dependencies": {
 
        "mkdirp": "^0.5.1"
 
      },
 
      "engines": {
 
        "node": ">=4"
 
      }
 
    }
 
  },
 
  "dependencies": {
 
    "@babel/code-frame": {
 
      "version": "7.8.3",
 
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
 
      "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
 
      "dev": true,
 
      "requires": {
 
        "@babel/highlight": "^7.8.3"
 
      }
 
    },
 
    "@babel/highlight": {
 
      "version": "7.8.3",
 
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
 
      "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
 
      "dev": true,
 
      "requires": {
 
        "chalk": "^2.0.0",
 
        "esutils": "^2.0.2",
 
        "js-tokens": "^4.0.0"
 
      }
 
    },
 
    "abbrev": {
 
      "version": "1.1.1",
 
      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
 
      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
 
      "dev": true
 
    },
 
    "acorn": {
 
      "version": "7.1.0",
 
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
 
      "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
 
      "dev": true
 
    },
 
    "acorn-jsx": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
 
      "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
 
      "dev": true,
 
      "requires": {}
 
    },
 
    "ajv": {
 
      "version": "6.10.2",
 
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
 
      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
 
      "dev": true,
 
      "requires": {
 
        "fast-deep-equal": "^2.0.1",
 
        "fast-json-stable-stringify": "^2.0.0",
 
        "json-schema-traverse": "^0.4.1",
 
        "uri-js": "^4.2.2"
 
      }
 
    },
 
    "amdefine": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
 
      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
 
      "dev": true
 
    },
 
    "ansi-escapes": {
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
 
      "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
 
      "dev": true,
 
      "requires": {
 
        "type-fest": "^0.8.1"
 
      }
 
    },
 
    "ansi-regex": {
 
      "version": "5.0.0",
 
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
 
      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
 
      "dev": true
 
    },
 
    "ansi-styles": {
 
      "version": "3.2.1",
 
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 
      "dev": true,
 
      "requires": {
 
        "color-convert": "^1.9.0"
 
      }
 
    },
 
    "argparse": {
 
      "version": "1.0.10",
 
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 
      "dev": true,
 
      "requires": {
 
        "sprintf-js": "~1.0.2"
 
      }
 
    },
 
    "array-find-index": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
 
      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
 
      "dev": true
 
    },
 
    "asap": {
 
      "version": "2.0.6",
 
      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
 
      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
 
      "dev": true
 
    },
 
    "asn1": {
 
      "version": "0.2.4",
 
      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
 
      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "safer-buffer": "~2.1.0"
 
      }
 
    },
 
    "assert-plus": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
 
      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "astral-regex": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
 
      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
 
      "dev": true
 
    },
 
    "asynckit": {
 
      "version": "0.4.0",
 
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "at.js": {
 
      "version": "1.5.4",
 
      "resolved": "https://registry.npmjs.org/at.js/-/at.js-1.5.4.tgz",
 
      "integrity": "sha512-G8mgUb/PqShPoH8AyjuxsTGvIr1o716BtQUKDM44C8qN2W615y7KGJ68MlTGamd0J0D/m28emUkzagaHTdrGZw==",
 
      "requires": {}
 
    },
 
    "aws-sign2": {
 
      "version": "0.7.0",
 
      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
 
      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "aws4": {
 
      "version": "1.8.0",
 
      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
 
      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "balanced-match": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 
      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
 
      "dev": true
 
    },
 
    "bcrypt-pbkdf": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
 
      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "tweetnacl": "^0.14.3"
 
      }
 
    },
 
    "bootstrap": {
 
      "version": "3.3.7",
 
      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz",
 
      "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
 
    },
 
    "brace-expansion": {
 
      "version": "1.1.11",
 
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 
      "dev": true,
 
      "requires": {
 
        "balanced-match": "^1.0.0",
 
        "concat-map": "0.0.1"
 
      }
 
    },
 
    "callsites": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
 
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 
      "dev": true
 
    },
 
    "caseless": {
 
      "version": "0.12.0",
 
      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
 
      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "chalk": {
 
      "version": "2.4.2",
 
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
 
      "dev": true,
 
      "requires": {
 
        "ansi-styles": "^3.2.1",
 
        "escape-string-regexp": "^1.0.5",
 
        "supports-color": "^5.3.0"
 
      }
 
    },
 
    "chardet": {
 
      "version": "0.7.0",
 
      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
 
      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
 
      "dev": true
 
    },
 
    "clean-css": {
 
      "version": "3.4.28",
 
      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
 
      "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
 
      "dev": true,
 
      "requires": {
 
        "commander": "2.8.x",
 
        "source-map": "0.4.x"
 
      },
 
      "dependencies": {
 
        "source-map": {
 
          "version": "0.4.4",
 
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
 
          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
 
          "dev": true,
 
          "requires": {
 
            "amdefine": ">=0.0.4"
 
          }
 
        }
 
      }
 
    },
 
    "cli-cursor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
 
      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
 
      "dev": true,
 
      "requires": {
 
        "restore-cursor": "^3.1.0"
 
      }
 
    },
 
    "cli-width": {
 
      "version": "2.2.0",
 
      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
 
      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
 
      "dev": true
 
    },
 
    "clone": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
 
      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
 
      "dev": true
 
    },
 
    "codemirror": {
 
      "version": "5.49.0",
 
      "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.49.0.tgz",
 
      "integrity": "sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA=="
 
    },
 
    "color-convert": {
 
      "version": "1.9.3",
 
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
 
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
 
      "dev": true,
 
      "requires": {
 
        "color-name": "1.1.3"
 
      }
 
    },
 
    "color-name": {
 
      "version": "1.1.3",
 
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
 
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
 
      "dev": true
 
    },
 
    "combined-stream": {
 
      "version": "1.0.8",
 
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "delayed-stream": "~1.0.0"
 
      }
 
    },
 
    "commander": {
 
      "version": "2.8.1",
 
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
 
      "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
 
      "dev": true,
 
      "requires": {
 
        "graceful-readlink": ">= 1.0.0"
 
      }
 
    },
 
    "concat-map": {
 
      "version": "0.0.1",
 
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
 
      "dev": true
 
    },
 
    "core-util-is": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
 
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "cross-spawn": {
 
      "version": "6.0.5",
 
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
 
      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
 
      "dev": true,
 
      "requires": {
 
        "nice-try": "^1.0.4",
 
        "path-key": "^2.0.1",
 
        "semver": "^5.5.0",
 
        "shebang-command": "^1.2.0",
 
        "which": "^1.2.9"
 
      }
 
    },
 
    "dashdash": {
 
      "version": "1.14.1",
 
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
 
      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "assert-plus": "^1.0.0"
 
      }
 
    },
 
    "datatables.net": {
 
      "version": "1.10.20",
 
      "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz",
 
      "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==",
 
      "requires": {
 
        "jquery": ">=1.7"
 
      }
 
    },
 
    "datatables.net-bs": {
 
      "version": "1.10.20",
 
      "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.10.20.tgz",
 
      "integrity": "sha512-NsMoOOYZ6NlteOpzhltw21lXsNdhjIMbIOxnqmcrb62ntl8eL9pYzk2AeiDXBlIKY4e550ZrExCq3CYKQ9myEg==",
 
      "requires": {
 
        "datatables.net": "1.10.20",
 
        "jquery": ">=1.7"
 
      }
 
    },
 
    "debug": {
 
      "version": "3.2.6",
 
      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
 
      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
 
      "dev": true,
 
      "requires": {
 
        "ms": "^2.1.1"
 
      }
 
    },
 
    "debuglog": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
 
      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=",
 
      "dev": true
 
    },
 
    "deep-is": {
 
      "version": "0.1.3",
 
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
 
      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
 
      "dev": true
 
    },
 
    "delayed-stream": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 
      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "dezalgo": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
 
      "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
 
      "dev": true,
 
      "requires": {
 
        "asap": "^2.0.0",
 
        "wrappy": "1"
 
      }
 
    },
 
    "doctrine": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
 
      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
 
      "dev": true,
 
      "requires": {
 
        "esutils": "^2.0.2"
 
      }
 
    },
 
    "dom-serializer": {
 
      "version": "0.2.2",
 
      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
 
      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
 
      "dev": true,
 
      "requires": {
 
        "domelementtype": "^2.0.1",
 
        "entities": "^2.0.0"
 
      },
 
      "dependencies": {
 
        "domelementtype": {
 
          "version": "2.0.1",
 
          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
 
          "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
 
          "dev": true
 
        },
 
        "entities": {
 
          "version": "2.0.0",
 
          "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
 
          "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
 
          "dev": true
 
        }
 
      }
 
    },
 
    "domelementtype": {
 
      "version": "1.3.1",
 
      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
 
      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
 
      "dev": true
 
    },
 
    "domhandler": {
 
      "version": "2.4.2",
 
      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
 
      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
 
      "dev": true,
 
      "requires": {
 
        "domelementtype": "1"
 
      }
 
    },
 
    "domutils": {
 
      "version": "1.7.0",
 
      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
 
      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
 
      "dev": true,
 
      "requires": {
 
        "dom-serializer": "0",
 
        "domelementtype": "1"
 
      }
 
    },
 
    "ecc-jsbn": {
 
      "version": "0.1.2",
 
      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
 
      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "jsbn": "~0.1.0",
 
        "safer-buffer": "^2.1.0"
 
      }
 
    },
 
    "emoji-regex": {
 
      "version": "8.0.0",
 
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
      "dev": true
 
    },
 
    "entities": {
 
      "version": "1.1.2",
 
      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
 
      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
 
      "dev": true
 
    },
 
    "errno": {
 
      "version": "0.1.7",
 
      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
 
      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "prr": "~1.0.1"
 
      }
 
    },
 
    "escape-string-regexp": {
 
      "version": "1.0.5",
 
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
 
      "dev": true
 
    },
 
    "eslint": {
 
      "version": "6.8.0",
 
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
 
      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
 
      "dev": true,
 
      "requires": {
 
        "@babel/code-frame": "^7.0.0",
 
        "ajv": "^6.10.0",
 
        "chalk": "^2.1.0",
 
        "cross-spawn": "^6.0.5",
 
        "debug": "^4.0.1",
 
        "doctrine": "^3.0.0",
 
        "eslint-scope": "^5.0.0",
 
        "eslint-utils": "^1.4.3",
 
        "eslint-visitor-keys": "^1.1.0",
 
        "espree": "^6.1.2",
 
        "esquery": "^1.0.1",
 
        "esutils": "^2.0.2",
 
        "file-entry-cache": "^5.0.1",
 
        "functional-red-black-tree": "^1.0.1",
 
        "glob-parent": "^5.0.0",
 
        "globals": "^12.1.0",
 
        "ignore": "^4.0.6",
 
        "import-fresh": "^3.0.0",
 
        "imurmurhash": "^0.1.4",
 
        "inquirer": "^7.0.0",
 
        "is-glob": "^4.0.0",
 
        "js-yaml": "^3.13.1",
 
        "json-stable-stringify-without-jsonify": "^1.0.1",
 
        "levn": "^0.3.0",
 
        "lodash": "^4.17.14",
 
        "minimatch": "^3.0.4",
 
        "mkdirp": "^0.5.1",
 
        "natural-compare": "^1.4.0",
 
        "optionator": "^0.8.3",
 
        "progress": "^2.0.0",
 
        "regexpp": "^2.0.1",
 
        "semver": "^6.1.2",
 
        "strip-ansi": "^5.2.0",
 
        "strip-json-comments": "^3.0.1",
 
        "table": "^5.2.3",
 
        "text-table": "^0.2.0",
 
        "v8-compile-cache": "^2.0.3"
 
      },
 
      "dependencies": {
 
        "debug": {
 
          "version": "4.1.1",
 
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
 
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
 
          "dev": true,
 
          "requires": {
 
            "ms": "^2.1.1"
 
          }
 
        },
 
        "semver": {
 
          "version": "6.3.0",
 
          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
 
          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
 
          "dev": true
 
        }
 
      }
 
    },
 
    "eslint-plugin-html": {
 
      "version": "6.0.0",
 
      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.0.0.tgz",
 
      "integrity": "sha512-PQcGippOHS+HTbQCStmH5MY1BF2MaU8qW/+Mvo/8xTa/ioeMXdSP+IiaBw2+nh0KEMfYQKuTz1Zo+vHynjwhbg==",
 
      "dev": true,
 
      "requires": {
 
        "htmlparser2": "^3.10.1"
 
      }
 
    },
 
    "eslint-scope": {
 
      "version": "5.0.0",
 
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
 
      "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
 
      "dev": true,
 
      "requires": {
 
        "esrecurse": "^4.1.0",
 
        "estraverse": "^4.1.1"
 
      }
 
    },
 
    "eslint-utils": {
 
      "version": "1.4.3",
 
      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
 
      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
 
      "dev": true,
 
      "requires": {
 
        "eslint-visitor-keys": "^1.1.0"
 
      }
 
    },
 
    "eslint-visitor-keys": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
 
      "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
 
      "dev": true
 
    },
 
    "espree": {
 
      "version": "6.1.2",
 
      "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
 
      "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
 
      "dev": true,
 
      "requires": {
 
        "acorn": "^7.1.0",
 
        "acorn-jsx": "^5.1.0",
 
        "eslint-visitor-keys": "^1.1.0"
 
      }
 
    },
 
    "esprima": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
 
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
 
      "dev": true
 
    },
 
    "esquery": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz",
 
      "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==",
 
      "dev": true,
 
      "requires": {
 
        "estraverse": "^4.0.0"
 
      }
 
    },
 
    "esrecurse": {
 
      "version": "4.2.1",
 
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
 
      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
 
      "dev": true,
 
      "requires": {
 
        "estraverse": "^4.1.0"
 
      }
 
    },
 
    "estraverse": {
 
      "version": "4.3.0",
 
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
 
      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
 
      "dev": true
 
    },
 
    "esutils": {
 
      "version": "2.0.3",
 
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
 
      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
 
      "dev": true
 
    },
 
    "extend": {
 
      "version": "3.0.2",
 
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
 
      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "external-editor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
 
      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
 
      "dev": true,
 
      "requires": {
 
        "chardet": "^0.7.0",
 
        "iconv-lite": "^0.4.24",
 
        "tmp": "^0.0.33"
 
      }
 
    },
 
    "extsprintf": {
 
      "version": "1.3.0",
 
      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
 
      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "fast-deep-equal": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
 
      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
 
      "dev": true
 
    },
 
    "fast-json-stable-stringify": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
 
      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
 
      "dev": true
 
    },
 
    "fast-levenshtein": {
 
      "version": "2.0.6",
 
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
 
      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
 
      "dev": true
 
    },
 
    "figures": {
 
      "version": "3.2.0",
 
      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
 
      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
 
      "dev": true,
 
      "requires": {
 
        "escape-string-regexp": "^1.0.5"
 
      }
 
    },
 
    "file-entry-cache": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
 
      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
 
      "dev": true,
 
      "requires": {
 
        "flat-cache": "^2.0.1"
 
      }
 
    },
 
    "flat-cache": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
 
      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
 
      "dev": true,
 
      "requires": {
 
        "flatted": "^2.0.0",
 
        "rimraf": "2.6.3",
 
        "write": "1.0.3"
 
      }
 
    },
 
    "flatted": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
 
      "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
 
      "dev": true
 
    },
 
    "forever-agent": {
 
      "version": "0.6.1",
 
      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
 
      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "form-data": {
 
      "version": "2.3.3",
 
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
 
      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "asynckit": "^0.4.0",
 
        "combined-stream": "^1.0.6",
 
        "mime-types": "^2.1.12"
 
      }
 
    },
 
    "fs.realpath": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
 
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
 
      "dev": true
 
    },
 
    "functional-red-black-tree": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
 
      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
 
      "dev": true
 
    },
 
    "getpass": {
 
      "version": "0.1.7",
 
      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
 
      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "assert-plus": "^1.0.0"
 
      }
 
    },
 
    "glob": {
 
      "version": "7.1.6",
 
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
 
      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
 
      "dev": true,
 
      "requires": {
 
        "fs.realpath": "^1.0.0",
 
        "inflight": "^1.0.4",
 
        "inherits": "2",
 
        "minimatch": "^3.0.4",
 
        "once": "^1.3.0",
 
        "path-is-absolute": "^1.0.0"
 
      }
 
    },
 
    "glob-parent": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
 
      "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
 
      "dev": true,
 
      "requires": {
 
        "is-glob": "^4.0.1"
 
      }
 
    },
 
    "globals": {
 
      "version": "12.3.0",
 
      "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
 
      "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
 
      "dev": true,
 
      "requires": {
 
        "type-fest": "^0.8.1"
 
      }
 
    },
 
    "graceful-fs": {
 
      "version": "4.2.3",
 
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
 
      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
 
      "dev": true
 
    },
 
    "graceful-readlink": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
 
      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
 
      "dev": true
 
    },
 
    "har-schema": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
 
      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "har-validator": {
 
      "version": "5.1.3",
 
      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
 
      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "ajv": "^6.5.5",
 
        "har-schema": "^2.0.0"
 
      }
 
    },
 
    "has-flag": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
 
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
 
      "dev": true
 
    },
 
    "hosted-git-info": {
 
      "version": "2.8.5",
 
      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
 
      "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
 
      "dev": true
 
    },
 
    "htmlparser2": {
 
      "version": "3.10.1",
 
      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
 
      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
 
      "dev": true,
 
      "requires": {
 
        "domelementtype": "^1.3.1",
 
        "domhandler": "^2.3.0",
 
        "domutils": "^1.5.1",
 
        "entities": "^1.1.1",
 
        "inherits": "^2.0.1",
 
        "readable-stream": "^3.1.1"
 
      }
 
    },
 
    "http-signature": {
 
      "version": "1.2.0",
 
      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
 
      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "assert-plus": "^1.0.0",
 
        "jsprim": "^1.2.2",
 
        "sshpk": "^1.7.0"
 
      }
 
    },
 
    "iconv-lite": {
 
      "version": "0.4.24",
 
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 
      "dev": true,
 
      "requires": {
 
        "safer-buffer": ">= 2.1.2 < 3"
 
      }
 
    },
 
    "ignore": {
 
      "version": "4.0.6",
 
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
 
      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
 
      "dev": true
 
    },
 
    "image-size": {
 
      "version": "0.5.5",
 
      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
 
      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "import-fresh": {
 
      "version": "3.2.1",
 
      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
 
      "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
 
      "dev": true,
 
      "requires": {
 
        "parent-module": "^1.0.0",
 
        "resolve-from": "^4.0.0"
 
      }
 
    },
 
    "imurmurhash": {
 
      "version": "0.1.4",
 
      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
 
      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
 
      "dev": true
 
    },
 
    "inflight": {
 
      "version": "1.0.6",
 
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
 
      "dev": true,
 
      "requires": {
 
        "once": "^1.3.0",
 
        "wrappy": "1"
 
      }
 
    },
 
    "inherits": {
 
      "version": "2.0.4",
 
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
 
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
 
      "dev": true
 
    },
 
    "inquirer": {
 
      "version": "7.0.4",
 
      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
 
      "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
 
      "dev": true,
 
      "requires": {
 
        "ansi-escapes": "^4.2.1",
 
        "chalk": "^2.4.2",
 
        "cli-cursor": "^3.1.0",
 
        "cli-width": "^2.0.0",
 
        "external-editor": "^3.0.3",
 
        "figures": "^3.0.0",
 
        "lodash": "^4.17.15",
 
        "mute-stream": "0.0.8",
 
        "run-async": "^2.2.0",
 
        "rxjs": "^6.5.3",
 
        "string-width": "^4.1.0",
 
        "strip-ansi": "^5.1.0",
 
        "through": "^2.3.6"
 
      }
 
    },
 
    "is-extglob": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 
      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
 
      "dev": true
 
    },
 
    "is-fullwidth-code-point": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 
      "dev": true
 
    },
 
    "is-glob": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
 
      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
 
      "dev": true,
 
      "requires": {
 
        "is-extglob": "^2.1.1"
 
      }
 
    },
 
    "is-promise": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
 
      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
 
      "dev": true
 
    },
 
    "is-typedarray": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
 
      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "isexe": {
 
      "version": "2.0.0",
 
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 
      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
 
      "dev": true
 
    },
 
    "isstream": {
 
      "version": "0.1.2",
 
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
 
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "jquery": {
 
      "version": "3.4.1",
 
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
 
      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
 
    },
 
    "jquery.caret": {
 
      "version": "0.3.1",
 
      "resolved": "https://registry.npmjs.org/jquery.caret/-/jquery.caret-0.3.1.tgz",
 
      "integrity": "sha1-nAkzGPrzJ+/zIugmyp8yQTaLx7g="
 
    },
 
    "jquery.flot": {
 
      "version": "0.8.3",
 
      "resolved": "https://registry.npmjs.org/jquery.flot/-/jquery.flot-0.8.3.tgz",
 
      "integrity": "sha512-/tEE8J5NjwvStHDaCHkvTJpD7wDS4hE1OEL8xEmhgQfUe0gLUem923PIceNez1mz4yBNx6Hjv7pJcowLNd+nbg=="
 
    },
 
    "js-tokens": {
 
      "version": "4.0.0",
 
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 
      "dev": true
 
    },
 
    "js-yaml": {
 
      "version": "3.13.1",
 
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
 
      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
 
      "dev": true,
 
      "requires": {
 
        "argparse": "^1.0.7",
 
        "esprima": "^4.0.0"
 
      }
 
    },
 
    "jsbn": {
 
      "version": "0.1.1",
 
      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
 
      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "json-parse-better-errors": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
 
      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
 
      "dev": true
 
    },
 
    "json-schema": {
 
      "version": "0.2.3",
 
      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
 
      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "json-schema-traverse": {
 
      "version": "0.4.1",
 
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 
      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
 
      "dev": true
 
    },
 
    "json-stable-stringify-without-jsonify": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
 
      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
 
      "dev": true
 
    },
 
    "json-stringify-safe": {
 
      "version": "5.0.1",
 
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
 
      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "jsprim": {
 
      "version": "1.4.1",
 
      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
 
      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "assert-plus": "1.0.0",
 
        "extsprintf": "1.3.0",
 
        "json-schema": "0.2.3",
 
        "verror": "1.10.0"
 
      }
 
    },
 
    "less": {
 
      "version": "3.10.3",
 
      "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz",
 
      "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==",
 
      "dev": true,
 
      "requires": {
 
        "clone": "^2.1.2",
 
        "errno": "^0.1.1",
 
        "graceful-fs": "^4.1.2",
 
        "image-size": "~0.5.0",
 
        "mime": "^1.4.1",
 
        "mkdirp": "^0.5.0",
 
        "promise": "^7.1.1",
 
        "request": "^2.83.0",
 
        "source-map": "~0.6.0"
 
      }
 
    },
 
    "less-plugin-clean-css": {
 
      "version": "1.5.1",
 
      "resolved": "https://registry.npmjs.org/less-plugin-clean-css/-/less-plugin-clean-css-1.5.1.tgz",
 
      "integrity": "sha1-zFeveqM5iVflbezr5jy2DCNClwM=",
 
      "dev": true,
 
      "requires": {
 
        "clean-css": "^3.0.1"
 
      }
 
    },
 
    "levn": {
 
      "version": "0.3.0",
 
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
 
      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
 
      "dev": true,
 
      "requires": {
 
        "prelude-ls": "~1.1.2",
 
        "type-check": "~0.3.2"
 
      }
 
    },
 
    "license-checker": {
 
      "version": "25.0.1",
 
      "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz",
 
      "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==",
 
      "dev": true,
 
      "requires": {
 
        "chalk": "^2.4.1",
 
        "debug": "^3.1.0",
 
        "mkdirp": "^0.5.1",
 
        "nopt": "^4.0.1",
 
        "read-installed": "~4.0.3",
 
        "semver": "^5.5.0",
 
        "spdx-correct": "^3.0.0",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-satisfies": "^4.0.0",
 
        "treeify": "^1.1.0"
 
      }
 
    },
 
    "lodash": {
 
      "version": "4.17.15",
 
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
 
      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
 
      "dev": true
 
    },
 
    "mime": {
 
      "version": "1.6.0",
 
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
 
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "mime-db": {
 
      "version": "1.40.0",
 
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
 
      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "mime-types": {
 
      "version": "2.1.24",
 
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
 
      "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "mime-db": "1.40.0"
 
      }
 
    },
 
    "mimic-fn": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
 
      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
 
      "dev": true
 
    },
 
    "minimatch": {
 
      "version": "3.0.4",
 
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
 
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
 
      "dev": true,
 
      "requires": {
 
        "brace-expansion": "^1.1.7"
 
      }
 
    },
 
    "minimist": {
 
      "version": "0.0.8",
 
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
 
      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
 
      "dev": true
 
    },
 
    "mkdirp": {
 
      "version": "0.5.1",
 
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
 
      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
 
      "dev": true,
 
      "requires": {
 
        "minimist": "0.0.8"
 
      }
 
    },
 
    "ms": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
 
      "dev": true
 
    },
 
    "mute-stream": {
 
      "version": "0.0.8",
 
      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
 
      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
 
      "dev": true
 
    },
 
    "natural-compare": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
 
      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
 
      "dev": true
 
    },
 
    "nice-try": {
 
      "version": "1.0.5",
 
      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
 
      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
 
      "dev": true
 
    },
 
    "nopt": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
 
      "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
 
      "dev": true,
 
      "requires": {
 
        "abbrev": "1",
 
        "osenv": "^0.1.4"
 
      }
 
    },
 
    "normalize-package-data": {
 
      "version": "2.5.0",
 
      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 
      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
 
      "dev": true,
 
      "requires": {
 
        "hosted-git-info": "^2.1.4",
 
        "resolve": "^1.10.0",
 
        "semver": "2 || 3 || 4 || 5",
 
        "validate-npm-package-license": "^3.0.1"
 
      }
 
    },
 
    "oauth-sign": {
 
      "version": "0.9.0",
 
      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
 
      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "once": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
 
      "dev": true,
 
      "requires": {
 
        "wrappy": "1"
 
      }
 
    },
 
    "onetime": {
 
      "version": "5.1.0",
 
      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
 
      "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
 
      "dev": true,
 
      "requires": {
 
        "mimic-fn": "^2.1.0"
 
      }
 
    },
 
    "optionator": {
 
      "version": "0.8.3",
 
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
 
      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
 
      "dev": true,
 
      "requires": {
 
        "deep-is": "~0.1.3",
 
        "fast-levenshtein": "~2.0.6",
 
        "levn": "~0.3.0",
 
        "prelude-ls": "~1.1.2",
 
        "type-check": "~0.3.2",
 
        "word-wrap": "~1.2.3"
 
      }
 
    },
 
    "os-homedir": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
 
      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
 
      "dev": true
 
    },
 
    "os-tmpdir": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
 
      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
 
      "dev": true
 
    },
 
    "osenv": {
 
      "version": "0.1.5",
 
      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
 
      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
 
      "dev": true,
 
      "requires": {
 
        "os-homedir": "^1.0.0",
 
        "os-tmpdir": "^1.0.0"
 
      }
 
    },
 
    "parent-module": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
 
      "dev": true,
 
      "requires": {
 
        "callsites": "^3.0.0"
 
      }
 
    },
 
    "path-is-absolute": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
 
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
 
      "dev": true
 
    },
 
    "path-key": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
 
      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
 
      "dev": true
 
    },
 
    "path-parse": {
 
      "version": "1.0.6",
 
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
 
      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
 
      "dev": true
 
    },
 
    "performance-now": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
 
      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "prelude-ls": {
 
      "version": "1.1.2",
 
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
 
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
 
      "dev": true
 
    },
 
    "progress": {
 
      "version": "2.0.3",
 
      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
 
      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
 
      "dev": true
 
    },
 
    "promise": {
 
      "version": "7.3.1",
 
      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
 
      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "asap": "~2.0.3"
 
      }
 
    },
 
    "prr": {
 
      "version": "1.0.1",
 
      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
 
      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "psl": {
 
      "version": "1.4.0",
 
      "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
 
      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "punycode": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
 
      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
 
      "dev": true
 
    },
 
    "qs": {
 
      "version": "6.5.2",
 
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
 
      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "read-installed": {
 
      "version": "4.0.3",
 
      "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
 
      "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=",
 
      "dev": true,
 
      "requires": {
 
        "debuglog": "^1.0.1",
 
        "graceful-fs": "^4.1.2",
 
        "read-package-json": "^2.0.0",
 
        "readdir-scoped-modules": "^1.0.0",
 
        "semver": "2 || 3 || 4 || 5",
 
        "slide": "~1.1.3",
 
        "util-extend": "^1.0.1"
 
      }
 
    },
 
    "read-package-json": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz",
 
      "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==",
 
      "dev": true,
 
      "requires": {
 
        "glob": "^7.1.1",
 
        "graceful-fs": "^4.1.2",
 
        "json-parse-better-errors": "^1.0.1",
 
        "normalize-package-data": "^2.0.0",
 
        "slash": "^1.0.0"
 
      }
 
    },
 
    "readable-stream": {
 
      "version": "3.6.0",
 
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
 
      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
 
      "dev": true,
 
      "requires": {
 
        "inherits": "^2.0.3",
 
        "string_decoder": "^1.1.1",
 
        "util-deprecate": "^1.0.1"
 
      }
 
    },
 
    "readdir-scoped-modules": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
 
      "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
 
      "dev": true,
 
      "requires": {
 
        "debuglog": "^1.0.1",
 
        "dezalgo": "^1.0.0",
 
        "graceful-fs": "^4.1.2",
 
        "once": "^1.3.0"
 
      }
 
    },
 
    "regexpp": {
 
      "version": "2.0.1",
 
      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
 
      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
 
      "dev": true
 
    },
 
    "request": {
 
      "version": "2.88.0",
 
      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
 
      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "aws-sign2": "~0.7.0",
 
        "aws4": "^1.8.0",
 
        "caseless": "~0.12.0",
 
        "combined-stream": "~1.0.6",
 
        "extend": "~3.0.2",
 
        "forever-agent": "~0.6.1",
 
        "form-data": "~2.3.2",
 
        "har-validator": "~5.1.0",
 
        "http-signature": "~1.2.0",
 
        "is-typedarray": "~1.0.0",
 
        "isstream": "~0.1.2",
 
        "json-stringify-safe": "~5.0.1",
 
        "mime-types": "~2.1.19",
 
        "oauth-sign": "~0.9.0",
 
        "performance-now": "^2.1.0",
 
        "qs": "~6.5.2",
 
        "safe-buffer": "^5.1.2",
 
        "tough-cookie": "~2.4.3",
 
        "tunnel-agent": "^0.6.0",
 
        "uuid": "^3.3.2"
 
      }
 
    },
 
    "resolve": {
 
      "version": "1.12.0",
 
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
 
      "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
 
      "dev": true,
 
      "requires": {
 
        "path-parse": "^1.0.6"
 
      }
 
    },
 
    "resolve-from": {
 
      "version": "4.0.0",
 
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 
      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
 
      "dev": true
 
    },
 
    "restore-cursor": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
 
      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
 
      "dev": true,
 
      "requires": {
 
        "onetime": "^5.1.0",
 
        "signal-exit": "^3.0.2"
 
      }
 
    },
 
    "rimraf": {
 
      "version": "2.6.3",
 
      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
 
      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
 
      "dev": true,
 
      "requires": {
 
        "glob": "^7.1.3"
 
      }
 
    },
 
    "run-async": {
 
      "version": "2.3.0",
 
      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
 
      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
 
      "dev": true,
 
      "requires": {
 
        "is-promise": "^2.1.0"
 
      }
 
    },
 
    "rxjs": {
 
      "version": "6.5.4",
 
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
 
      "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
 
      "dev": true,
 
      "requires": {
 
        "tslib": "^1.9.0"
 
      }
 
    },
 
    "safe-buffer": {
 
      "version": "5.2.0",
 
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
 
      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
 
      "dev": true
 
    },
 
    "safer-buffer": {
 
      "version": "2.1.2",
 
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 
      "dev": true
 
    },
 
    "select2": {
 
      "version": "3.5.1",
 
      "resolved": "https://registry.npmjs.org/select2/-/select2-3.5.1.tgz",
 
      "integrity": "sha1-8oGUibvGX9bTKL5yu+K5XdfofP4="
 
    },
 
    "select2-bootstrap-css": {
 
      "version": "1.4.6",
 
      "resolved": "https://registry.npmjs.org/select2-bootstrap-css/-/select2-bootstrap-css-1.4.6.tgz",
 
      "integrity": "sha1-XPtoJG9SmcoYWOAe/XiIBMc0mX4="
 
    },
 
    "semver": {
 
      "version": "5.7.1",
 
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
 
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
 
      "dev": true
 
    },
 
    "shebang-command": {
 
      "version": "1.2.0",
 
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
 
      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
 
      "dev": true,
 
      "requires": {
 
        "shebang-regex": "^1.0.0"
 
      }
 
    },
 
    "shebang-regex": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
 
      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
 
      "dev": true
 
    },
 
    "signal-exit": {
 
      "version": "3.0.2",
 
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
 
      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
 
      "dev": true
 
    },
 
    "slash": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
 
      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
 
      "dev": true
 
    },
 
    "slice-ansi": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
 
      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
 
      "dev": true,
 
      "requires": {
 
        "ansi-styles": "^3.2.0",
 
        "astral-regex": "^1.0.0",
 
        "is-fullwidth-code-point": "^2.0.0"
 
      },
 
      "dependencies": {
 
        "is-fullwidth-code-point": {
 
          "version": "2.0.0",
 
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
 
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
 
          "dev": true
 
        }
 
      }
 
    },
 
    "slide": {
 
      "version": "1.1.6",
 
      "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
 
      "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
 
      "dev": true
 
    },
 
    "source-map": {
 
      "version": "0.6.1",
 
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "spdx-compare": {
 
      "version": "1.0.0",
 
      "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz",
 
      "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==",
 
      "dev": true,
 
      "requires": {
 
        "array-find-index": "^1.0.2",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-ranges": "^2.0.0"
 
      }
 
    },
 
    "spdx-correct": {
 
      "version": "3.1.0",
 
      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
 
      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
 
      "dev": true,
 
      "requires": {
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-license-ids": "^3.0.0"
 
      }
 
    },
 
    "spdx-exceptions": {
 
      "version": "2.2.0",
 
      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
 
      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
 
      "dev": true
 
    },
 
    "spdx-expression-parse": {
 
      "version": "3.0.0",
 
      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
 
      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
 
      "dev": true,
 
      "requires": {
 
        "spdx-exceptions": "^2.1.0",
 
        "spdx-license-ids": "^3.0.0"
 
      }
 
    },
 
    "spdx-license-ids": {
 
      "version": "3.0.5",
 
      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
 
      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
 
      "dev": true
 
    },
 
    "spdx-ranges": {
 
      "version": "2.1.1",
 
      "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz",
 
      "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==",
 
      "dev": true
 
    },
 
    "spdx-satisfies": {
 
      "version": "4.0.1",
 
      "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz",
 
      "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==",
 
      "dev": true,
 
      "requires": {
 
        "spdx-compare": "^1.0.0",
 
        "spdx-expression-parse": "^3.0.0",
 
        "spdx-ranges": "^2.0.0"
 
      }
 
    },
 
    "sprintf-js": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
 
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
 
      "dev": true
 
    },
 
    "sshpk": {
 
      "version": "1.16.1",
 
      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
 
      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "asn1": "~0.2.3",
 
        "assert-plus": "^1.0.0",
 
        "bcrypt-pbkdf": "^1.0.0",
 
        "dashdash": "^1.12.0",
 
        "ecc-jsbn": "~0.1.1",
 
        "getpass": "^0.1.1",
 
        "jsbn": "~0.1.0",
 
        "safer-buffer": "^2.0.2",
 
        "tweetnacl": "~0.14.0"
 
      }
 
    },
 
    "string_decoder": {
 
      "version": "1.3.0",
 
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
 
      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
 
      "dev": true,
 
      "requires": {
 
        "safe-buffer": "~5.2.0"
 
      }
 
    },
 
    "string-width": {
 
      "version": "4.2.0",
 
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
 
      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
 
      "dev": true,
 
      "requires": {
 
        "emoji-regex": "^8.0.0",
 
        "is-fullwidth-code-point": "^3.0.0",
 
        "strip-ansi": "^6.0.0"
 
      },
 
      "dependencies": {
 
        "strip-ansi": {
 
          "version": "6.0.0",
 
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
 
          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
 
          "dev": true,
 
          "requires": {
 
            "ansi-regex": "^5.0.0"
 
          }
 
        }
 
      }
 
    },
 
    "strip-ansi": {
 
      "version": "5.2.0",
 
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
 
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
 
      "dev": true,
 
      "requires": {
 
        "ansi-regex": "^4.1.0"
 
      },
 
      "dependencies": {
 
        "ansi-regex": {
 
          "version": "4.1.0",
 
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
 
          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
 
          "dev": true
 
        }
 
      }
 
    },
 
    "strip-json-comments": {
 
      "version": "3.0.1",
 
      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
 
      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
 
      "dev": true
 
    },
 
    "supports-color": {
 
      "version": "5.5.0",
 
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 
      "dev": true,
 
      "requires": {
 
        "has-flag": "^3.0.0"
 
      }
 
    },
 
    "table": {
 
      "version": "5.4.6",
 
      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
 
      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
 
      "dev": true,
 
      "requires": {
 
        "ajv": "^6.10.2",
 
        "lodash": "^4.17.14",
 
        "slice-ansi": "^2.1.0",
 
        "string-width": "^3.0.0"
 
      },
 
      "dependencies": {
 
        "emoji-regex": {
 
          "version": "7.0.3",
 
          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
 
          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
 
          "dev": true
 
        },
 
        "is-fullwidth-code-point": {
 
          "version": "2.0.0",
 
          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
 
          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
 
          "dev": true
 
        },
 
        "string-width": {
 
          "version": "3.1.0",
 
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
 
          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
 
          "dev": true,
 
          "requires": {
 
            "emoji-regex": "^7.0.1",
 
            "is-fullwidth-code-point": "^2.0.0",
 
            "strip-ansi": "^5.1.0"
 
          }
 
        }
 
      }
 
    },
 
    "text-table": {
 
      "version": "0.2.0",
 
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 
      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
 
      "dev": true
 
    },
 
    "through": {
 
      "version": "2.3.8",
 
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
 
      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
 
      "dev": true
 
    },
 
    "tmp": {
 
      "version": "0.0.33",
 
      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
 
      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
 
      "dev": true,
 
      "requires": {
 
        "os-tmpdir": "~1.0.2"
 
      }
 
    },
 
    "tough-cookie": {
 
      "version": "2.4.3",
 
      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
 
      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "psl": "^1.1.24",
 
        "punycode": "^1.4.1"
 
      },
 
      "dependencies": {
 
        "punycode": {
 
          "version": "1.4.1",
 
          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
 
          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
 
          "dev": true,
 
          "optional": true
 
        }
 
      }
 
    },
 
    "treeify": {
 
      "version": "1.1.0",
 
      "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
 
      "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==",
 
      "dev": true
 
    },
 
    "tslib": {
 
      "version": "1.11.0",
 
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz",
 
      "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==",
 
      "dev": true
 
    },
 
    "tunnel-agent": {
 
      "version": "0.6.0",
 
      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
 
      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "safe-buffer": "^5.0.1"
 
      }
 
    },
 
    "tweetnacl": {
 
      "version": "0.14.5",
 
      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
 
      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "type-check": {
 
      "version": "0.3.2",
 
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
 
      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
 
      "dev": true,
 
      "requires": {
 
        "prelude-ls": "~1.1.2"
 
      }
 
    },
 
    "type-fest": {
 
      "version": "0.8.1",
 
      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
 
      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
 
      "dev": true
 
    },
 
    "uri-js": {
 
      "version": "4.2.2",
 
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
 
      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
 
      "dev": true,
 
      "requires": {
 
        "punycode": "^2.1.0"
 
      }
 
    },
 
    "util-deprecate": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
 
      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
 
      "dev": true
 
    },
 
    "util-extend": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz",
 
      "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=",
 
      "dev": true
 
    },
 
    "uuid": {
 
      "version": "3.3.3",
 
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
 
      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
 
      "dev": true,
 
      "optional": true
 
    },
 
    "v8-compile-cache": {
 
      "version": "2.1.0",
 
      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
 
      "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
 
      "dev": true
 
    },
 
    "validate-npm-package-license": {
 
      "version": "3.0.4",
 
      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 
      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
 
      "dev": true,
 
      "requires": {
 
        "spdx-correct": "^3.0.0",
 
        "spdx-expression-parse": "^3.0.0"
 
      }
 
    },
 
    "verror": {
 
      "version": "1.10.0",
 
      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
 
      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
 
      "dev": true,
 
      "optional": true,
 
      "requires": {
 
        "assert-plus": "^1.0.0",
 
        "core-util-is": "1.0.2",
 
        "extsprintf": "^1.2.0"
 
      }
 
    },
 
    "which": {
 
      "version": "1.3.1",
 
      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
 
      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
 
      "dev": true,
 
      "requires": {
 
        "isexe": "^2.0.0"
 
      }
 
    },
 
    "word-wrap": {
 
      "version": "1.2.3",
 
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
 
      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
 
      "dev": true
 
    },
 
    "wrappy": {
 
      "version": "1.0.2",
 
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
 
      "dev": true
 
    },
 
    "write": {
 
      "version": "1.0.3",
 
      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
 
      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
 
      "dev": true,
 
      "requires": {
 
        "mkdirp": "^0.5.1"
 
      }
 
    }
 
  }
 
}
kallithea/front-end/package.json
Show inline comments
 
{
 
  "name": "kallithea",
 
  "private": true,
 
  "dependencies": {
 
    "at.js": "1.5.4",
 
    "bootstrap": "3.3.7",
 
    "codemirror": "5.49.0",
 
    "datatables.net": "1.10.20",
 
    "datatables.net-bs": "1.10.20",
 
    "jquery": "3.4.1",
 
    "jquery.caret": "0.3.1",
 
    "jquery.flot": "0.8.3",
 
    "select2": "3.5.1",
 
    "at.js": "1.5",
 
    "bootstrap": "3",
 
    "codemirror": "5",
 
    "datatables.net": "1",
 
    "datatables.net-bs": "1",
 
    "jquery": "3",
 
    "jquery.caret": "0.3",
 
    "jquery.flot": "0.8",
 
    "select2": "3",
 
    "select2-bootstrap-css": "1.4.6"
 
  },
 
  "devDependencies": {
 
    "eslint": "6.8.0",
 
    "eslint-plugin-html": "6.0.0",
 
    "less": "3.10.3",
 
    "less-plugin-clean-css": "1.5.1",
 
    "license-checker": "25.0.1"
 
    "eslint": "6",
 
    "eslint-plugin-html": "6",
 
    "less": "3",
 
    "less-plugin-clean-css": "1.5",
 
    "license-checker": "25"
 
  }
 
}
kallithea/i18n/be/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -336,99 +336,96 @@ msgstr "Адміністратар"
 
msgid "Disabled"
 
msgstr "Адключана"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Дазволена, з ручной актывацыяй уліковага запісу"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Дазволена, з аўтаматычнай актывацыяй уліковага запісу"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручная актывацыя вонкавага ўліковага запісу"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Аўтаматычная актывацыя вонкавага ўліковага запісу"
 

	
 
msgid "Enabled"
 
msgstr "Уключана"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глабальныя прывілеі паспяхова абноўленыя"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Адбылася памылка падчас абнаўлення прывілеяў"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Адбылася памылка пры стварэнні групы рэпазітароў %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Створаная новая група рэпазітароў %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Група рэпазітароў %s абноўленая"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Адбылася памылка пры абнаўленні групы рэпазітароў %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Група ўтрымлівае %s рэпазітароў і не можа быць выдаленая"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Група ўтрымлівае ў сабе %s падгруп і не можа быць выдаленая"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Група рэпазітароў %s выдаленая"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Памылка пры выдаленні групы рэпазітароў %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Адміністратар не можа адклікаць свае прывелеі"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Прывілеі групы рэпазітароў абноўленыя"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Памылка пры водгуку прывелея"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Памылка пры стварэнні рэпазітара %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Рэпазітар %s створаны з %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Зроблены форк рэпазітара %s на %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Рэпазітар %s створаны"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Рэпазітар %s паспяхова абноўлены"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Памылка падчас абнаўлення рэпазітара %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Форкі %s адлучаныя"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Выдаленыя форки рэпазітара %s"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Рэпазітар %s выдалены"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Немагчыма выдаліць %s, ён усё яшчэ мае форкі"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Памылка падчас выдалення %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Прывілеі рэпазітара абноўленыя"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Памылка пры выдаленні поля"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Не форк --"
 

	
 
@@ -474,96 +471,99 @@ msgstr "Абноўленыя налады праграмы"
 
msgid "Updated visualisation settings"
 
msgstr "Налады візуалізацыі абноўленыя"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Адбылася памылка пры абнаўленні наладаў візуалізацыі"
 

	
 
msgid "Please enter email address"
 
msgstr "Калі ласка, увядзіце e-mail-адрас"
 

	
 
msgid "Send email task created"
 
msgstr "Задача адпраўкі e-mail створаная"
 

	
 
msgid "Added new hook"
 
msgstr "Дададзены новы хук"
 

	
 
msgid "Updated hooks"
 
msgstr "Абноўленыя хукі"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Памылка пры стварэнні хука"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Запланаванае пераіндэксаванне базы Whoosh"
 

	
 
msgid "Created user group %s"
 
msgstr "Створана група карыстальнікаў %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Памылка пры стварэнні групы карыстальнікаў %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Група карыстальнікаў %s абноўленая"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Памылка пры абнаўленні групы карыстальнікаў %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Група карыстальнікаў паспяхова выдаленая"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Памылка пры выдаленні групы карыстальнікаў"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Мэтавая група не можа быць той жа самай"
 

	
 
msgid "User group permissions updated"
 
msgstr "Прывілеі групы карыстальнікаў абноўленыя"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Адміністратар не можа адклікаць свае прывелеі"
 

	
 
msgid "Updated permissions"
 
msgstr "Абноўленыя прывілеі"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Памылка пры захаванні прывілеяў"
 

	
 
msgid "Created user %s"
 
msgstr "Карыстальнік %s створаны"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Памылка пры стварэнні карыстальніка %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Карыстальнік паспяхова абноўлены"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Карыстальнік паспяхова выдалены"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Памылка пры выдаленні карыстальніка"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Дададзены IP %s у белы спіс карыстальніка"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Адбылася памылка пры захаванні IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Выдалены IP %s з белага спісу карыстальніка"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Вы павінны быць зарэгістраваным карыстальнікам, каб выканаць гэта дзеянне"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Старонка даступная толькі аўтарызаваным карыстальнікам"
 

	
 
msgid "Binary file"
 
msgstr "Двайковы файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набор змены апынуўся занадта вялікімі і быў падрэзаны, выкарыстоўвайце "
 
"меню параўнання для паказу выніку параўнання"
 

	
 
msgid "No changes detected"
 
msgstr "Змен не выяўлена"
kallithea/i18n/da/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -368,99 +368,96 @@ msgstr "Admin"
 
msgid "Disabled"
 
msgstr "Deaktiveret"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Tilladt med manuel kontoaktivering"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Tilladt med automatisk kontoaktivering"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Manuel aktivering af ekstern konto"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Automatisk aktivering af ekstern konto"
 

	
 
msgid "Enabled"
 
msgstr "Aktiveret"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Globale tilladelser opdateret"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Der opstod en fejl under opdatering af tilladelser"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Der opstod en fejl under oprettelse af repository-gruppen %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Oprettet repository-gruppen %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Opdateret repository-gruppen %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Der opstod en fejl under opdatering af repository-gruppen %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Denne gruppe indeholder %s repositories og kan ikke slettes"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Denne gruppe indeholder %s undergrupper og kan ikke slettes"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Fjernet repository-gruppen %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Der opstod en fejl under sletning af repository-gruppen %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Kan ikke tilbagekalde tilladelse for én selv som admin"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Repository-gruppe tilladelser opdateret"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Der opstod en fejl under tilbagekaldelse af tilladelse"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Fejl ved oprettelse af repository %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Oprettet repository %s fra %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Forked repository %s som %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Oprettet repository %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repository %s opdateret"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Der opstod en fejl under opdatering af repository %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Fraskilt %s forks"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Slettet %s forks"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Slettet repository %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Kan ikke slette repository %s, da den stadig har forks"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Der opstod en fejl under sletning af %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Repository tilladelser opdateret"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Feltvaliderings fejl: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Der opstod en fejl under oprettelse af felt: %r"
 

	
 
@@ -508,96 +505,99 @@ msgstr "Ugyldiggjort %s repositories"
 
msgid "Updated application settings"
 
msgstr "Opdateret applikationsindstillinger"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Opdateret visualiseringsindstillinger"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Der opstod en fejl under opdatering af visualiseringsindstillinger"
 

	
 
msgid "Please enter email address"
 
msgstr "Indtast email-adresse"
 

	
 
msgid "Send email task created"
 
msgstr "Send email-opgave oprettet"
 

	
 
msgid "Added new hook"
 
msgstr "Tilføjet nyt hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Opdateret hooks"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Der opstod en fejl under oprettelse af et hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh reindex-opgave skeduleret"
 

	
 
msgid "Created user group %s"
 
msgstr "Oprettet brugergruppe %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Der opstod en fejl under oprettelse af brugergruppe %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Opdateret brugergruppe %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Der opstod en fejl under opdatering af brugergruppe %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Brugergruppe slettet succesfuldt"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Der opstod en fejl under sletning af brugergruppe"
 

	
 
msgid "User group permissions updated"
 
msgstr "Brugergrupper-tilladelser opdateret"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Kan ikke tilbagekalde tilladelse for én selv som admin"
 

	
 
msgid "Updated permissions"
 
msgstr "Tilladelser opdateret"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Der opstod en fejl under gemning af tilladelser"
 

	
 
msgid "Created user %s"
 
msgstr "Bruger %s oprettet"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Der opstod en fejl under oprettelse af bruger %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Bruger opdateret"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Slettet bruger"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Der opstod en fejl under sletning af bruger %s"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Standardbrugeren kan ikke redigeres"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Tilføjet IP-adresse %s til bruger-whitelist"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Der opstod en fejl under tilføjelse af IP-adresse"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Fjernet IP-adresse fra bruger-whitelist"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Du skal være registreret bruger for at kunne udføre denne handling"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Du skal være logget ind for at se denne side"
 

	
 
msgid "Binary file"
 
msgstr "Binær fil"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Changeset var for stor, og blev afskåret, brug diff menu for at få vist "
 
"denne diff"
 

	
kallithea/i18n/de/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -355,99 +355,96 @@ msgstr "Admin"
 
msgid "Disabled"
 
msgstr "Deaktiviert"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Erlaubt mit manueller Kontoaktivierung"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Erlaubt mit automatischer Kontoaktivierung"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Manuelle Aktivierung externen Kontos"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Automatische Aktivierung externen Kontos"
 

	
 
msgid "Enabled"
 
msgstr "Aktiviert"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Globale Berechtigungen erfolgreich geändert"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Fehler bei der Änderung der globalen Berechtigungen"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Fehler bei der Erstellung der Repositoriumsgruppe %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Repositoriumsgruppe %s erstellt"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Repositoriumsgruppe %s aktualisiert"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Fehler bei der Aktualisierung der Repositoriumsgruppe %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Die Gruppe enthält %s Repositorys und kann nicht gelöscht werden"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Diese Gruppe enthält %s Untergruppen und kann nicht gelöscht werden"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Repositoriumsgruppe %s entfernt"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Fehler beim Löschen der Repositoriumsgruppe %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Als Administrator kann man sich keine Berechtigungen entziehen"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Berechtigungen der Repositoriumsgruppe aktualisiert"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Fehler beim Entzug der Berechtigungen"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Fehler beim Erstellen des Repositoriums %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Repositorium %s von %s erstellt"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Aufgespaltenes Repositorium %s zu %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Repositorium erzeugt %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repository %s wurde erfolgreich aktualisiert"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Fehler bei der Aktualisierung des Repositoriums %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s Spaltung abgetrennt"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s Spaltung gelöscht"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Repositorium %s gelöscht"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "%s konnte nicht gelöscht werden, da es noch Forks besitzt"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Beim Löschen von %s trat ein Fehler auf"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Repositoriumsberechtigungen aktualisiert"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Feldvalidierung fehlgeschlagen: %s"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Fehler beim Entfernen des Feldes"
 

	
 
@@ -505,96 +502,99 @@ msgid "Error occurred during updating vi
 
msgstr ""
 
"Es ist ein Fehler während der Aktualisierung der Layouteinstellung "
 
"aufgetreten"
 

	
 
msgid "Please enter email address"
 
msgstr "Bitte geben Sie eine E-Mail-Adresse an"
 

	
 
msgid "Send email task created"
 
msgstr "Task zum Versenden von E-Mails erstellt"
 

	
 
msgid "Added new hook"
 
msgstr "Neuer Hook hinzugefügt"
 

	
 
msgid "Updated hooks"
 
msgstr "Die Hooks wurden aktutalisiert"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Während der Erzeugung des Hooks ist ein Fehler aufgetreten"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh Reindizierungs Aufgabe wurde zur Ausführung geplant"
 

	
 
msgid "Created user group %s"
 
msgstr "Nutzergruppe %s erstellt"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr ""
 
"Es ist ein Fehler während der Erstellung der Nutzergruppe %s aufgetreten"
 

	
 
msgid "Updated user group %s"
 
msgstr "Aktualisierte Nutzergruppe %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr ""
 
"Während des Updates der Benutzergruppe %s ist ein Fehler aufgetreten"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Die Nutzergruppe wurde erfolgreich entfernt"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Während des Löschens der Benutzergruppe ist ein Fehler aufgetreten"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Zielgruppe kann nicht die gleiche Gruppe sein"
 

	
 
msgid "User group permissions updated"
 
msgstr "Berechtigungen der Benutzergruppe wurden aktualisiert"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Als Administrator kann man sich keine Berechtigungen entziehen"
 

	
 
msgid "Updated permissions"
 
msgstr "Berechtigungen wurden aktualisiert"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr ""
 
"Es ist ein Fehler während des Speicherns der Berechtigungen aufgetreten"
 

	
 
msgid "Created user %s"
 
msgstr "Nutzer %s erstellt"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Während des Erstellens des Benutzers %s ist ein Fehler aufgetreten"
 

	
 
msgid "User updated successfully"
 
msgstr "Der Benutzer wurde erfolgreich aktualisiert"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Der Nutzer wurde erfolgreich gelöscht"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Während der Löschen des Benutzers trat ein Fehler auf"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Der Standard-Benutzer kann nicht bearbeitet werden"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Die IP-Adresse %s wurde zur Nutzerwhitelist hinzugefügt"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Während des Speicherns der IP-Adresse ist ein Fehler aufgetreten"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "IP-Adresse wurde von der Nutzerwhitelist entfernt"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Sie müssen ein Registrierter Nutzer sein um diese Aktion durchzuführen"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Sie müssen sich anmelden um diese Seite aufzurufen"
 

	
 
msgid "Binary file"
 
msgstr "Binäre Datei"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Der Änderungssatz war zu groß und wurde abgeschnitten, benutzen sie das "
kallithea/i18n/el/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -254,96 +254,102 @@ msgid "Meanwhile, the following reviewer
 
msgstr "Εντωμεταξύ, οι ακόλουθοι κριτικοί προστέθηκαν: %s"
 

	
 
msgid "Meanwhile, the following reviewers have been removed: %s"
 
msgstr "Εντωμεταξύ, οι ακόλουθοι κριτικοί αφαιρέθηκαν: %s"
 

	
 
msgid "No description"
 
msgstr "Χωρίς περιγραφή"
 

	
 
msgid "Pull request updated"
 
msgstr "Ενημερώθηκε η αίτηση έλξης"
 

	
 
msgid "Successfully deleted pull request"
 
msgstr "Επιτυχής διαγραφή αιτήματος έλξης"
 

	
 
msgid "Revision %s not found in %s"
 
msgstr "Η αναθεώρηση %s δεν βρέθηκε στο %s"
 

	
 
msgid "Error: changesets not found when displaying pull request from %s."
 
msgstr ""
 
"Σφάλμα: τα σετ αλλαγών δεν βρέθηκαν όταν εμφανίζεται το αίτημα έλξης από "
 
"το %s."
 

	
 
msgid "This pull request has already been merged to %s."
 
msgstr "Το αίτημα έλξης έχει ήδη συγχωνευτεί με το %s."
 

	
 
msgid "This pull request has been closed and can not be updated."
 
msgstr "Αυτό το αίτημα έλξης έχει κλείσει και δεν μπορεί να ενημερωθεί."
 

	
 
msgid "The following additional changes are available on %s:"
 
msgstr "Οι επιπλέον ακόλουθες αλλαγές είναι διαθέσιμες στο %s:"
 

	
 
msgid "No additional changesets found for iterating on this pull request."
 
msgstr ""
 
"Δεν βρέθηκαν επιπλέον σετ αλλαγών στην προσέγγιση αυτού του αιτήματος "
 
"έλξης."
 

	
 
msgid "Note: Branch %s has another head: %s."
 
msgstr "Σημείωση: Ο κλάδος %s έχει άλλη κεφαλή (head): %s."
 

	
 
msgid "Git pull requests don't support iterating yet."
 
msgstr "Αιτήματα έλξης του git δεν υποστηρίζουν ακόμα ενημερώσεις."
 

	
 
msgid ""
 
"Error: some changesets not found when displaying pull request from %s."
 
msgstr ""
 
"Σφάλμα: κάποια σετ αλλαγών δεν βρέθηκαν όταν εμφανιζόταν αυτό το αίτημα "
 
"έλξης από το %s."
 

	
 
msgid "%d additional changesets are not shown."
 
msgstr "%d επιπλέον σύνολα αλλαγών δεν εμφανίζονται."
 

	
 
msgid "%d changesets available for merging are not shown."
 
msgstr "%d σύνολα αλλαγών δεν εμφανίζονται για συγχώνευση."
 

	
 
msgid "The diff can't be shown - the PR revisions could not be found."
 
msgstr ""
 
"Οι διαφορές δεν μπορούν να εμφανιστούν - οι αναθεωρήσεις δεν βρέθηκαν."
 

	
 
msgid "Invalid search query. Try quoting it."
 
msgstr "Άκυρο αίτημα αναζήτησης. Δοκιμάστε με εισαγωγικά."
 

	
 
msgid "The server has no search index."
 
msgstr "Ο διακομιστής δεν έχει ευρετήριο αναζήτησης."
 

	
 
msgid "An error occurred during search operation."
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη λειτουργία αναζήτησης."
 

	
 
msgid "No data ready yet"
 
msgstr "Δεν υπάρχουν ακόμα έτοιμα δεδομένα"
 

	
 
msgid "Statistics are disabled for this repository"
 
msgstr "Τα στατιστικά είναι απενεργοποιημένα για αυτό το αποθετήριο"
 

	
 
msgid "Auth settings updated successfully"
 
msgstr "Οι ρυθμίσεις εξουσιοδότησης ενημερώθηκαν επιτυχώς"
 

	
 
msgid "error occurred during update of auth settings"
 
msgstr ""
 
"παρουσιάστηκε σφάλμα κατά την ενημέρωση των ρυθμίσεων εξουσιοδότησης"
 

	
 
msgid "Default settings updated successfully"
 
msgstr "Οι προεπιλεγμένες ρυθμίσεις ενημερώθηκαν επιτυχώς"
 

	
 
msgid "Error occurred during update of defaults"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση των προεπιλογών"
 

	
 
msgid "Forever"
 
msgstr "Πάντα"
 

	
 
msgid "5 minutes"
 
msgstr "5 λεπτά"
 

	
 
msgid "1 hour"
 
msgstr "1 ώρα"
 

	
 
msgid "1 day"
 
msgstr "1 ημέρα"
 

	
 
msgid "1 month"
 
msgstr "1 μήνας"
 

	
 
msgid "Lifetime"
 
@@ -417,99 +423,96 @@ msgstr "Διαχειριστής"
 
msgid "Disabled"
 
msgstr "Απενεργοποιημένο"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Επιτρέπεται με χειροποίητη ενεργοποίηση του λογαριασμού"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Επιτρέπεται με αυτόματη ενεργοποίηση του λογαριασμού"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Χειροποίητη ενεργοποίηση εξωτερικού λογαριασμού"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Αυτόματη ενεργοποίηση εξωτερικού λογαριασμού"
 

	
 
msgid "Enabled"
 
msgstr "Ενεργό"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Τα καθολικά δικαιώματα ενημερώθηκαν επιτυχώς"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση δικαιωμάτων"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Συνέβηκε κάποιο λάθος κατά την δημιουργία της ομάδας αποθετηρίου %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Δημιουργήθηκε η ομάδα αποθετηρίου %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Ενημερώθηκε η ομάδα αποθετηρίου %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση της ομάδας αποθετηρίων %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Αυτή η ομάδα περιέχει %s αποθετήρια και δε μπορεί να διαγραφεί"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Αυτή η ομάδα περιέχει %s υποομάδες και δε μπορεί να διαγραφεί"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Αφαιρέθηκε η ομάδα αποθετηρίου %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη διαγραφή της ομάδας αποθετηρίων %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Δεν μπορείτε να ανακαλέσετε την άδεια σας ως διαχειριστής"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Τα δικαιώματα της ομάδας αποθετηρίου ενημερώθηκαν"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκληση του δικαιώματος"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Σφάλμα κατά τη δημιουργία αποθετηρίου %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Δημιουργήθηκε το αποθετήριο %s από το %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Κλωνοποιήθηκε το αποθετηρίο %s ως %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Δημιουργήθηκε το αποθετήριο %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Το αποθετήριο %s ενημερώθηκε επιτυχώς"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση του αποθετηρίου %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Αποσυνδέθηκαν %s κλώνοι"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Διαγράφηκαν %s κλώνοι"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Διαγράφηκε το αποθετήριο %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Δε μπορεί να διαγραφεί το αποθετήριο %s που ακόμα έχει κλώνους"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την διαγραφή του %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Τα δικαιώματα του αποθετηρίου ενημερώθηκαν"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Σφάλμα στην επιβεβαίωση του πεδίου: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία πεδίου: %r"
 

	
 
@@ -575,96 +578,99 @@ msgid "Send email task created"
 
msgstr "Δημιουργήθηκε η εργασία της αποστολής ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "Hook already exists"
 
msgstr "Το άγκιστρο υπάρχει ήδη"
 

	
 
msgid ""
 
"Hook names with \".kallithea_\" are reserved for internal use. Please use "
 
"another hook name."
 
msgstr ""
 
"Άγκιστρα με το όνομα \".kallithea_\" είναι δεσμευμένα για εσωτερική "
 
"χρήση. Παρακαλώ δώστε άλλο όνομα στο άγκιστρο."
 

	
 
msgid "Added new hook"
 
msgstr "Προσθήκη νέου άγκιστρου"
 

	
 
msgid "Updated hooks"
 
msgstr "Τα άγκιστρα ενημερώθηκαν"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την δημιουργία του άγκιστρου"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Προγραμματίστηκε η αναδημιουργία ευρετηρίου για το Whoosh"
 

	
 
msgid "Created user group %s"
 
msgstr "Δημιουργήθηκε η ομάδα χρηστών %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία της ομάδας χρηστών %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Ενημερώθηκε η ομάδα χρηστών %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση της ομάδας χρηστών %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Η ομάδα χρηστών διαγράφηκε επιτυχώς"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την διαγραφή της ομάδας χρηστών"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Η ομάδα προορισμός δεν μπορεί να είναι η ίδια"
 

	
 
msgid "User group permissions updated"
 
msgstr "Τα δικαιώματα της ομάδας χρηστών ενημερώθηκαν"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Δεν μπορείτε να ανακαλέσετε την άδεια σας ως διαχειριστής"
 

	
 
msgid "Updated permissions"
 
msgstr "Τα δικαιώματα ενημερώθηκαν"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την αποθήκευση των δικαιωμάτων"
 

	
 
msgid "Created user %s"
 
msgstr "Δημιουργήθηκε ο χρήστης %s"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την δημιουργία του χρήστη %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Ο χρήστης ενημερώθηκε επιτυχώς"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Ο χρήστης διαγράφηκε επιτυχώς"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη διαγραφή του χρήστη"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Δεν μπορεί να γίνει επεξεργασία στον προεπιλεγμένο χρήστη"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Η IP διεύθυνση %s προστέθηκε στην λίστα επιτρεπόμενων του χρήστη"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την προσθήκη της IP διεύθυνσης"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Η IP διεύθυνση αφαιρέθηκε από τη λίστα επιτρεπόμενων του χρήστη"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Πρέπει να είστε εγγεγραμμένος χρήστης για να εκτελέσετε αυτή την ενέργεια"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Πρέπει να είστε συνδεμένος για να δείτε αυτήν τη σελίδα"
 

	
 
msgid "Binary file"
 
msgstr "Δυαδικό αρχείο"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Το σετ αλλαγών ήταν πολύ μεγάλο και αποκόπηκε, χρησιμοποιήστε το μενού "
 
"διαφορών για να εμφανίσετε τις διαφορές"
 
@@ -2056,96 +2062,112 @@ msgstr "Ετικέτα"
 
msgid "Key"
 
msgstr "Κλειδί"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Επιβεβαίωση διαγραφής αυτού του πεδίου: %s"
 

	
 
msgid "New field key"
 
msgstr "Νέο κλειδί πεδίου"
 

	
 
msgid "New field label"
 
msgstr "Νέα ετικέτα πεδίου"
 

	
 
msgid "Enter short label"
 
msgstr "Εισαγωγή σύντομης ετικέτας"
 

	
 
msgid "New field description"
 
msgstr "Νέα περιγραφή πεδίου"
 

	
 
msgid "Enter description of a field"
 
msgstr "Εισαγωγή περιγραφής ενός πεδίου"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Τα επιπλέον πεδία είναι απενεργοποιημένα."
 

	
 
msgid "Private Repository"
 
msgstr "Ιδιωτικό Αποθετήριο"
 

	
 
msgid "Fork of repository"
 
msgstr "Κλώνος αποθετηρίου"
 

	
 
msgid "Remote repository URL"
 
msgstr "Διεύθυνση URL απομακρυσμένου αποθετηρίου"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Τραβήξτε τις αλλαγές από το απομακρυσμένο αποθετήριο"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr ""
 
"Επιβεβαιώστε ότι θα τραβήξετε αλλαγές από το απομακρυσμένο αποθετήριο "
 
"δεδομένων."
 

	
 
msgid "This repository does not have a remote repository URL."
 
msgstr ""
 
"Αυτό το αποθετήριο δεν έχει διεύθυνση URL απομακρυσμένου αποθετηρίου."
 

	
 
msgid "Permanent URL"
 
msgstr "Μόνιμη διεύθυνση URL"
 

	
 
msgid ""
 
"In case this repository is renamed or moved into another group the "
 
"repository URL changes.\n"
 
"                           Using the above permanent URL guarantees that "
 
"this repository always will be accessible on that URL.\n"
 
"                           This is useful for CI systems, or any other "
 
"cases that you need to hardcode the URL into a 3rd party service."
 
msgstr ""
 
"Σε περίπτωση που αυτό το αποθετήριο μετονομαστεί ή μετακινηθεί σε άλλη "
 
"ομάδα, η διεύθυνση URL του αποθετηρίου αλλάζει.\n"
 
"Χρησιμοποιώντας την παραπάνω μόνιμη διεύθυνση URL εξασφαλίζετε ότι αυτό "
 
"το αποθετήριο θα είναι πάντα προσβάσιμο σε εκείνη τη διεύθυνση.\n"
 
"Αυτό είναι χρήσιμο για συστήματα CI ή οποιεσδήποτε άλλες περιπτώσεις που "
 
"χρειάζεστε να ενσωματώσετε σκληρή κωδικοποίηση της διεύθυνσης URL σε "
 
"υπηρεσία τρίτου."
 

	
 
msgid "Remote repository"
 
msgstr "Απομακρυσμένο αποθετήριο"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"Προαιρετικό: Διεύθυνση URL ενός απομακρυσμένου αποθετηρίου. Εάν οριστεί, "
 
"το αποθετήριο μπορεί να τραβηχτεί από αυτήν τη διεύθυνση URL."
 

	
 
msgid "Change owner of this repository."
 
msgstr "Αλλάξτε τον κάτοχο αυτού του αποθετηρίου."
 

	
 
msgid "Processed commits"
 
msgstr "Επεξεργασμένα commits"
 

	
 
msgid "Processed progress"
 
msgstr "Επεξεργασμένη πρόοδος"
 

	
 
msgid "Reset Statistics"
 
msgstr "Επαναφορά Στατιστικών"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "Επιβεβαιώστε την κατάργηση των τρεχόντων στατιστικών στοιχείων."
 

	
 
msgid "Repositories Administration"
 
msgstr "Διαχείριση Αποθετηρίων"
 

	
 
msgid "State"
 
msgstr "Κατάσταση"
 

	
 
msgid "Settings Administration"
 
msgstr "Διαχείριση Ρυθμίσεων"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Επανάληψη αντιστοίχισης και επανασάρωση"
 

	
 
msgid "Visual"
 
msgstr "Εμφάνιση"
 

	
 
msgid "Hooks"
 
msgstr "Άγκιστρα"
 

	
 
msgid "Full Text Search"
 
msgstr "Αναζήτηση Πλήρους Κειμένου"
 
@@ -2157,182 +2179,217 @@ msgid "Send test email to"
 
msgstr "Αποστολή δοκιμαστικού μηνύματος ηλεκτρονικού ταχυδρομείου σε"
 

	
 
msgid "Send"
 
msgstr "Αποστολή"
 

	
 
msgid "Site branding"
 
msgstr "Επωνυμία ιστότοπου"
 

	
 
msgid "Set a custom title for your Kallithea Service."
 
msgstr "Ορίστε έναν προσαρμοσμένο τίτλο για την υπηρεσία της Καλλιθέα σας."
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Πεδίο ελέγχου ταυτότητας HTTP"
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "Μπλοκ προσαρμογής HTML / JavaScript / CSS"
 

	
 
msgid ""
 
"HTML (possibly with                         JavaScript and/or CSS) that "
 
"will be added to the bottom                         of every page. This "
 
"can be used for web analytics                         systems, but also "
 
"to                         perform instance-specific customizations like "
 
"adding a                         project banner at the top of every page."
 
msgstr ""
 
"HTML (ενδεχομένως με JavaScript ή / και CSS) που θα προστεθούν στο κάτω "
 
"μέρος της κάθε σελίδας. Αυτό μπορεί να χρησιμοποιηθεί για web analytics, "
 
"αλλά και για την προσαρμογή της εμφάνισης, όπως η προσθήκη ενός banner "
 
"στο επάνω μέρος κάθε σελίδας."
 

	
 
msgid "ReCaptcha public key"
 
msgstr "Δημόσιο κλειδί ReCaptcha"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Δημόσιο κλειδί για το σύστημα reCaptcha."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "Ιδιωτικό κλειδί ReCaptcha"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Ιδιωτικό κλειδί για το σύστημα reCaptcha. Ο καθορισμός αυτής της τιμής θα "
 
"ενεργοποιήσει το captcha κατά την εγγραφή."
 

	
 
msgid "Save Settings"
 
msgstr "Αποθήκευση Ρυθμίσεων"
 

	
 
msgid "Custom Global Mercurial Hooks"
 
msgstr "Προσαρμοσμένα Παγκόσμια Αγκίστρια Mercurial"
 

	
 
msgid ""
 
"Hooks can be used to trigger actions on certain events such as push / "
 
"pull. They can trigger Python functions or external applications."
 
msgstr ""
 
"Τα αγκίστρια μπορούν να χρησιμοποιηθούν για να ενεργοποιήσουν ενέργειες "
 
"σε συγκεκριμένα γεγονότα, όπως το push / pull. Μπορούν να ενεργοποιήσουν "
 
"συναρτήσεις Python ή εξωτερικές εφαρμογές."
 

	
 
msgid "Git Hooks"
 
msgstr "Άγκιστρα Git"
 

	
 
msgid ""
 
"Kallithea has no support for custom Git hooks. Kallithea will use Git "
 
"post-receive hooks internally. Installation of these hooks is managed in "
 
"%s."
 
msgstr ""
 
"Η Καλλιθέα δεν υποστηρίζει προσαρμοσμένα αγκίστρια Git. Η Καλλιθέα θα "
 
"χρησιμοποιήσει αγκίστρια μετά την αποστολή (post-receive hooks) του Git "
 
"εσωτερικά. Η εγκατάσταση αυτών των αγκιστριών διαχειρίζεται στο %s."
 

	
 
msgid "Custom Hooks are not enabled"
 
msgstr "Τα προσαρμοσμένα άγκιστρα δεν είναι ενεργά"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Απέτυχε η αφαίρεση γάντζου"
 

	
 
msgid "Rescan options"
 
msgstr "Επιλογές Επανασάρωσης"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Διαγραφή εγγραφών αποθετηρίων που λείπουν"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Επιλέξτε αυτήν την επιλογή για να καταργήσετε όλα τα σχόλια, να αιτήματα "
 
"έλξης και άλλες εγγραφές που σχετίζονται με αποθετήρια που δεν υπάρχουν "
 
"πλέον στο σύστημα αρχείων."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Ακυρώνει την προσωρινή αποθήκευση για όλα τα αποθετήρια"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Επιλέξτε αυτό για να φορτώσετε ξανά τα δεδομένα και να καταργήστε την "
 
"cache για όλα τα αποθετήρια."
 

	
 
msgid "Install Git hooks"
 
msgstr "Εγκατάσταση Git hooks"
 

	
 
msgid ""
 
"Install Kallithea's internal hooks for all Git repositories where they "
 
"are missing or can be upgraded. Existing hooks that don't seem to come "
 
"from Kallithea will not be touched."
 
msgstr ""
 
"Εγκατάσταση των εσωτερικών αγκιστριών της Καλλιθέας για όλα τα αποθετήρια "
 
"Git όπου αυτά λείπουν ή μπορούν να αναβαθμιστούν. Τα υπάρχοντα αγκίστρια "
 
"που δεν φαίνεται να προέρχονται από την Καλλιθέα δεν θα αλλάξουνε."
 

	
 
msgid "Install and overwrite Git hooks"
 
msgstr "Εγκατάσταση και επανεγγραφή Git hooks"
 

	
 
msgid ""
 
"Install Kallithea's internal hooks for all Git repositories. Existing "
 
"hooks that don't seem to come from Kallithea will be disabled by renaming "
 
"to .bak extension."
 
msgstr ""
 
"Εγκαταστήστε τα εσωτερικά hooks της Kallithea για όλα τα αποθετήρια Git. "
 
"Τα υπάρχοντα hooks που δεν φαίνεται να προέρχονται από την Kallithea θα "
 
"απενεργοποιηθούν με τη μετονομασία σε επέκταση .bak."
 

	
 
msgid "Rescan Repositories"
 
msgstr "Επανασάρωση αποθετηρίων"
 

	
 
msgid "Index build option"
 
msgstr "Επιλογή δημιουργίας ευρετηρίου"
 

	
 
msgid "Build from scratch"
 
msgstr "Κατασκευή από το μηδέν"
 

	
 
msgid ""
 
"This option completely reindexes all of the repositories for proper "
 
"fulltext search capabilities."
 
msgstr ""
 
"Αυτή η επιλογή ξαναδημιουργεί πλήρως τα ευρετήρια σε όλα τα αποθετήρια "
 
"για δυνατότητα αναζήτησης πλήρους κειμένου."
 

	
 
msgid "Reindex"
 
msgstr "Αναδημιουργία ευρετηρίου"
 

	
 
msgid "Checking for updates..."
 
msgstr "Έλεγχος για ενημερώσεις..."
 

	
 
msgid "Kallithea version"
 
msgstr "Έκδοση Καλλιθέας"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Αρχείο διαμόρφωσης Καλλιθέας"
 

	
 
msgid "Python version"
 
msgstr "Έκδοση Python"
 

	
 
msgid "Platform"
 
msgstr "Πλατφόρμα"
 

	
 
msgid "Git version"
 
msgstr "Έκδοση Git"
 

	
 
msgid "Git path"
 
msgstr "Διαδρομή Git"
 

	
 
msgid "Python Packages"
 
msgstr "Πακέτα Python"
 

	
 
msgid "Mercurial Push Hooks"
 
msgstr "Αγκίστρια Αποστολής (Push Hooks) του Mercurial"
 

	
 
msgid "Show repository size after push"
 
msgstr "Εμφάνιση μεγέθους αποθετηρίου μετά την ώθηση"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Ενημέρωση αποθετηρίου μετά την ώθηση (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Επεκτάσεις Mercurial"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Ενεργοποίηση επέκτασης μεγάλων αρχείων"
 

	
 
msgid "Location of repositories"
 
msgstr "Τοποθεσία αποθετηρίων"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Κάντε κλικ για να ξεκλειδώσετε. Πρέπει να επανεκκινήσετε την Καλλιθέα για "
 
"να εφαρμοστεί αυτή η ρύθμιση."
 

	
 
msgid ""
 
"Filesystem location where repositories are stored. After changing this "
 
"value, a restart and rescan of the repository folder are both required."
 
msgstr ""
 
"Θέση συστήματος αρχείων όπου αποθηκεύονται τα αποθετήρια. Μετά την αλλαγή "
 
"αυτής της τιμής, απαιτείται επανεκκίνηση και σάρωση του φακέλου "
 
"αποθετηρίου."
 

	
 
msgid "General"
 
msgstr "Γενικά"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Χρήση πρόσθετων πεδίων αποθετηρίου"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Επιτρέπει την αποθήκευση πρόσθετων προσαρμοσμένων πεδίων ανά αποθετήριο."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Εμφάνιση της έκδοσης Καλλιθέας"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Εμφανίζει ή αποκρύπτει τον αριθμό έκδοσης της Καλλιθέας που εμφανίζεται "
 
"στο υποσέλιδο."
 
@@ -3665,50 +3722,53 @@ msgstr "Χρήση ID"
 
msgid "Use SSH"
 
msgstr "Χρήση SSH"
 

	
 
msgid "Use Name"
 
msgstr "Χρήση Ονόματος"
 

	
 
msgid "Use HTTP"
 
msgstr "Χρήση HTTP"
 

	
 
msgid "Trending files"
 
msgstr "Δημοφιλή αρχεία"
 

	
 
msgid "Download"
 
msgstr "Λήψη"
 

	
 
msgid "There are no downloads yet"
 
msgstr "Δεν υπάρχουν λήψεις ακόμα"
 

	
 
msgid "Downloads are disabled for this repository"
 
msgstr "Οι λήψεις είναι απενεργοποιημένες για αυτό το αποθετήριο"
 

	
 
msgid "Download as zip"
 
msgstr "Λήψη ως zip"
 

	
 
msgid "Check this to download archive with subrepos"
 
msgstr "Επιλέξτε αυτό για τη λήψη του αρχείου με τα υπο-αποθετήρια"
 

	
 
msgid "With subrepos"
 
msgstr "Με υπο-αποθετήρια"
 

	
 
msgid "Feed"
 
msgstr "Ροή"
 

	
 
msgid "Latest Changes"
 
msgstr "Τελευταίες Αλλαγές"
 

	
 
msgid "Quick Start"
 
msgstr "Γρήγορη Εκκίνηση"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "Προσθέστε ή ανεβάστε αρχεία απευθείας μέσω Καλλιθέας"
 

	
 
msgid "Push new repository"
 
msgstr "Ώθηση νέου αποθετηρίου"
 

	
 
msgid "Existing repository?"
 
msgstr "Υπάρχον αποθετήριο;"
 

	
 
msgid "Readme file from %s"
 
msgstr "Αρχείο README από το %s"
 

	
 
msgid "Download %s as %s"
 
msgstr "Λήψη %s ως %s"
kallithea/i18n/fr/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -423,99 +423,96 @@ msgstr "Interdite"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Autorisé avec activation de compte manuelle"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Autorisé avec activation de compte automatique"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Activation manuelle du compte externe"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Activation automatique du compte externe"
 

	
 
msgid "Enabled"
 
msgstr "Autorisée"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Permissions globales mises à jour avec succès"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Une erreur est survenue durant la mise à jour des permissions"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Une erreur est survenue durant la création du groupe de dépôts %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Groupe de dépôts %s créé"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Groupe de dépôts %s mis à jour"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du groupe de dépôts %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Ce groupe contient %s dépôts et ne peut être supprimé"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Ce groupe contient %s sous-groupes et ne peut pas être supprimé"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Groupe de dépôts %s supprimé"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr ""
 
"Une erreur est survenue durant la suppression du groupe de dépôts %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Impossible de révoquer votre permission d'administrateur"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Permissions du groupe de dépôts mises à jour"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Une erreur est survenue durant la révocation de la permission"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Erreur de création du dépôt %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Dépôt %s créé depuis %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "dépôt %s forké en tant que %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Dépôt %s créé"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Dépôt %s mis à jour avec succès"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Une erreur est survenue durant la mise à jour du dépôt %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s forks détachés"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s forks supprimés"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Dépôt %s supprimé"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Impossible de supprimer le dépôt %s : des forks y sont attachés"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Erreur pendant la suppression de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissions du dépôt mises à jour"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Erreur de validation du champ : %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Une erreur est survenue durant la création du champ : %r"
 

	
 
@@ -587,96 +584,99 @@ msgid "Hook already exists"
 
msgstr "Le hook existe déjà"
 

	
 
msgid ""
 
"Hook names with \".kallithea_\" are reserved for internal use. Please use "
 
"another hook name."
 
msgstr ""
 
"Les noms de hook avec \".kallithea_\" sont réservés pour un usage "
 
"interne. Merci de choisir un autre nom pour le hook."
 

	
 
msgid "Added new hook"
 
msgstr "Le nouveau hook a été ajouté"
 

	
 
msgid "Updated hooks"
 
msgstr "Hooks mis à jour"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Une erreur est survenue durant la création du hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "La tâche de réindexation Whoosh a été planifiée"
 

	
 
msgid "Created user group %s"
 
msgstr "Groupe d'utilisateurs %s créé"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr ""
 
"Une erreur est survenue durant la création du groupe d'utilisateurs %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Groupe d'utilisateurs %s mis à jour"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du groupe d'utilisateurs %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Groupe d'utilisateurs supprimé avec succès"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr ""
 
"Une erreur est survenue durant la suppression du groupe d'utilisateurs"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Le groupe cible ne peut pas être le même"
 

	
 
msgid "User group permissions updated"
 
msgstr "Permissions du groupe d'utilisateurs mises à jour"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Impossible de révoquer votre permission d'administrateur"
 

	
 
msgid "Updated permissions"
 
msgstr "Permissions mises à jour"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Une erreur est survenue durant l’enregistrement des permissions"
 

	
 
msgid "Created user %s"
 
msgstr "Utilisateur %s créé"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Une erreur est survenue durant la création de l'utilisateur %s"
 

	
 
msgid "User updated successfully"
 
msgstr "L’utilisateur a été mis à jour avec succès"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Utilisateur supprimé avec succès"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Une erreur est survenue durant la suppression de l’utilisateur"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "L'utilisateur par défaut ne peut pas être modifié"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "L'adresse IP %s a été ajoutée à la liste blanche"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Une erreur est survenue durant la sauvegarde d'IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "L'adresse IP a été supprimée de la liste blanche"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Vous devez être un utilisateur enregistré pour effectuer cette action"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Vous devez être connecté pour visualiser cette page"
 

	
 
msgid "Binary file"
 
msgstr "Fichier binaire"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Cet ensemble de changements était trop gros pour être affiché et a été "
 
"découpé, utilisez le menu « diff » pour afficher les différences"
 
@@ -790,97 +790,97 @@ msgid "No files"
 
msgstr "Aucun fichier"
 

	
 
msgid "new file"
 
msgstr "nouveau fichier"
 

	
 
msgid "mod"
 
msgstr "mod"
 

	
 
msgid "del"
 
msgstr "suppr."
 

	
 
msgid "rename"
 
msgstr "renommer"
 

	
 
msgid "chmod"
 
msgstr "chmod"
 

	
 
msgid "SSH key is missing"
 
msgstr "La clé SSH est manquante"
 

	
 
msgid ""
 
"Invalid SSH key - it must have both a key type and a base64 part, like "
 
"'ssh-rsa ASRNeaZu4FA...xlJp='"
 
msgstr ""
 
"Clé SSH invalide – elle doit comporter à la fois un type de clé et une "
 
"partie base64, comme 'ssh-rsa ASRNeaZu4FA...xlJp='"
 

	
 
msgid ""
 
"Invalid SSH key - it must start with key type 'ssh-rsa', 'ssh-dss', 'ssh-"
 
"ed448', or 'ssh-ed25519'"
 
msgstr ""
 
"Clé SSH invalide – elle doit commencer par le type de clé 'ssh-rsa', 'ssh-"
 
"dss', 'ssh-ed448', ou 'ssh-ed25519'"
 

	
 
msgid "Invalid SSH key - unexpected characters in base64 part %r"
 
msgstr "Clé SSH invalide – caractères inattendus dans la partie base 64 %r"
 

	
 
msgid ""
 
"Invalid SSH key - base64 part %r seems truncated (it can't be decoded)"
 
msgstr ""
 
"Clé SSH invalide – la partie base64 %r semble tronquée (elle ne peut pas "
 
"être décodée)"
 

	
 
msgid ""
 
"Invalid SSH key - base64 part %r seems truncated (it contains a partial "
 
"string length)"
 
msgstr ""
 
"Clé SSH invalide – la partie base64 %r semble tronquée (elle contient une "
 
"taille partielle)"
 
"valeur de taille incomplète)"
 

	
 
msgid ""
 
"Invalid SSH key - base64 part %r seems truncated (it is too short for "
 
"declared string length %s)"
 
msgstr ""
 
"Clé SSH invalide – la partie base64 %r semble tronquée (elle est trop "
 
"court pour la taille déclarée %s)"
 

	
 
msgid ""
 
"Invalid SSH key - base64 part %r seems truncated (it contains too few "
 
"strings for a %s key)"
 
msgstr ""
 
"Clé SSH invalide – la partie base64 %r semble tronquée (elle ne contient "
 
"pas assez de parties pour une clé %s)"
 

	
 
msgid "Invalid SSH key - it is a %s key but the base64 part contains %r"
 
msgstr ""
 
"Clé SSH invalide – c'est une clé %s mais la partie base64 contient %r"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d an"
 
msgstr[1] "%d ans"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d mois"
 
msgstr[1] "%d mois"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d jour"
 
msgstr[1] "%d jours"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d heure"
 
msgstr[1] "%d heures"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d minute"
 
msgstr[1] "%d minutes"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d seconde"
 
msgstr[1] "%d secondes"
 
@@ -2063,96 +2063,112 @@ msgid "Label"
 
msgstr "Libellé"
 

	
 
msgid "Key"
 
msgstr "Clé"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Voulez-vous vraiment supprimer ce champ : %s ?"
 

	
 
msgid "New field key"
 
msgstr "Clé du nouveau champ"
 

	
 
msgid "New field label"
 
msgstr "Libellé du nouveau champ"
 

	
 
msgid "Enter short label"
 
msgstr "Saisir un libellé court"
 

	
 
msgid "New field description"
 
msgstr "Description du nouveau champ"
 

	
 
msgid "Enter description of a field"
 
msgstr "Saisir la description du champ"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Les champs supplémentaires sont désactivés."
 

	
 
msgid "Private Repository"
 
msgstr "Dépôt privé"
 

	
 
msgid "Fork of repository"
 
msgstr "Forker du dépôt"
 

	
 
msgid "Remote repository URL"
 
msgstr "URL du dépôt distant"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Récupérer les modifications depuis le dépôt distant"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr ""
 
"Voulez-vous vraiment récupérer les changements depuis le dépôt distant ?"
 

	
 
msgid "This repository does not have a remote repository URL."
 
msgstr "Ce dépôt n'a pas d'URL de dépôt distant."
 

	
 
msgid "Permanent URL"
 
msgstr "URL permanente"
 

	
 
msgid ""
 
"In case this repository is renamed or moved into another group the "
 
"repository URL changes.\n"
 
"                           Using the above permanent URL guarantees that "
 
"this repository always will be accessible on that URL.\n"
 
"                           This is useful for CI systems, or any other "
 
"cases that you need to hardcode the URL into a 3rd party service."
 
msgstr ""
 
"Dans le cas où ce dépôt est renommé ou déplacé dans un autre groupe, "
 
"l’URL du dépôt change.\n"
 
"                           L’utilisation de l’URL permanente ci-dessus "
 
"garantit que ce dépôt sera toujours accessible à cette URL.\n"
 
"                           Cela peut être utile pour les systèmes "
 
"d’intégration continue, ou tout autre cas où il est nécessaire de coder "
 
"l’URL en dur dans un système tiers."
 

	
 
msgid "Remote repository"
 
msgstr "Dépôt distant"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"Optionel : URL d'un dépôt distant. Si renseigné, le dépôt sera pullé à "
 
"partir de cette URL."
 

	
 
msgid "Change owner of this repository."
 
msgstr "Changer le propriétaire de ce dépôt."
 

	
 
msgid "Processed commits"
 
msgstr "Commits traités"
 

	
 
msgid "Processed progress"
 
msgstr "Avancement"
 

	
 
msgid "Reset Statistics"
 
msgstr "Remettre les statistiques à zéro"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr ""
 
"Souhaitez-vous vraiment réinitialiser les statistiques de ce dépôt ?"
 

	
 
msgid "Repositories Administration"
 
msgstr "Administration des dépôts"
 

	
 
msgid "State"
 
msgstr "État"
 

	
 
msgid "Settings Administration"
 
msgstr "Administration des options"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Mapper et scanner"
 

	
 
msgid "Visual"
 
msgstr "Visuel"
 

	
 
msgid "Hooks"
 
msgstr "Hooks"
 

	
 
msgid "Full Text Search"
 
@@ -2367,138 +2383,144 @@ msgstr "Activer les champs supplémentaires sur les dépôts"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Permet d'enregistrer des champs personnalisés additionnels pour chaque "
 
"dépôt."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Afficher la version de Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Afficher ou cacher le numéro de version de Kallithea dans le pied de page."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Afficher les Gravatars des utilisateurs"
 

	
 
msgid ""
 
"Gravatar URL allows you to use another avatar server application.\n"
 
"                                                        The following "
 
"variables of the URL will be replaced accordingly.\n"
 
"                                                        {scheme}    "
 
"'http' or 'https' sent from running Kallithea server,\n"
 
"                                                        {email}     user "
 
"email,\n"
 
"                                                        {md5email}  md5 "
 
"hash of the user email (like at gravatar.com),\n"
 
"                                                        {size}      size "
 
"of the image that is expected from the server application,\n"
 
"                                                        {netloc}    "
 
"network location/server host of running Kallithea server"
 
msgstr ""
 
"L'URL de Gravatar vous permet d'utiliser un autre serveur d'avatars.\n"
 
"                                                        Les variables "
 
"suivantes dans l'URL seront remplacées comme suit :\n"
 
"                                                        {scheme}    "
 
"'http' ou 'https' envoyé à partir du serveur Kallithea en cours "
 
"d'utilisation,\n"
 
"                                                        {email}     "
 
"adresse e-mail de l'utilisateur,\n"
 
"                                                        {md5email}  "
 
"empreinte md5 (hash) de l'adresse e-mail de l'utilisateur (comme sur "
 
"gravatar.com),\n"
 
"                                                        {size}      "
 
"taille de l'image demandée au serveur,\n"
 
"                                                        {netloc}    "
 
"emplacement réseau/hôte du serveur Kallithea en cours d'utilisation."
 

	
 
msgid "HTTP Clone URL"
 
msgstr "URL de clone HTTP"
 

	
 
msgid ""
 
"Schema of clone URL construction eg. '{scheme}://{user}@{netloc}/"
 
"{repo}'.\n"
 
"                                                    The following "
 
"variables are available:\n"
 
"                                                    {scheme} 'http' or "
 
"'https' sent from running Kallithea server,\n"
 
"                                                    {user}   current user "
 
"username,\n"
 
"                                                    {netloc} network "
 
"location/server host of running Kallithea server,\n"
 
"                                                    {repo}   full "
 
"repository name,\n"
 
"                                                    {repoid} ID of "
 
"repository, can be used to construct clone-by-id,\n"
 
"                                                    {system_user}  name "
 
"of the Kallithea system user,\n"
 
"                                                    {hostname}  server "
 
"hostname\n"
 
"                                                    "
 
msgstr ""
 
"Modèle de construction d'URL de clone. Par exemple : '{scheme}://{user}"
 
"@{netloc}/{repo}'.\n"
 
"                                                       Les variables "
 
"suivantes sont disponibles :\n"
 
"                                                        {scheme}    "
 
"'http' ou 'https' envoyé à partir du serveur Kallithea en cours "
 
"d'utilisation,\n"
 
"                                                        {user}     nom de "
 
"l'utilisateur courant,\n"
 
"                                                        {netloc}    "
 
"emplacement réseau/hôte du serveur Kallithea en cours d'utilisation,\n"
 
"                                                        {repo}    nom "
 
"complet du dépôt,\n"
 
"                                                        {repoid}    ID du "
 
"dépôt, peut être utilisé pour cloner par ID,\n"
 
"                                                        {system_user}  "
 
"nom de l'utilisateur système Kallithea,\n"
 
"                                                        {hostname}  nom "
 
"d'hôte du serveur\n"
 
"                                                    "
 

	
 
msgid "SSH Clone URL"
 
msgstr "URL de clone SSH"
 

	
 
msgid ""
 
"Schema for constructing SSH clone URL, eg. 'ssh://{system_user}"
 
"@{hostname}/{repo}'."
 
msgstr ""
 
"Schéma de construction d'une URL de clone SSH, par exemple. 'ssh://"
 
"{system_user}@{hostname}/{repo}'."
 

	
 
msgid "Repository page size"
 
msgstr "Taille de la page du dépôt"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Nombre d'éléments affichés dans les pages des dépôts avant d'afficher la "
 
"pagination."
 

	
 
msgid "Admin page size"
 
msgstr "Taille de la page d'admin"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Nombre d'éléments affichés dans les grilles des pages admin avant "
 
"d'afficher la pagination."
 

	
 
msgid "Icons"
 
msgstr "Icônes"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Afficher l’icône de dépôt public sur les dépôts"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Afficher l’icône de dépôt privé sur les dépôts"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "Afficher l’icône « public/privé » à côté du nom des dépôts."
 

	
 
msgid "Meta Tagging"
 
msgstr "Meta-tagging"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Analyser les méta-tags dans le champ de description du dépôt et les "
 
"transformer en tags colorés."
 
@@ -3700,50 +3722,53 @@ msgid "Use SSH"
 
msgstr "Utiliser SSH"
 

	
 
msgid "Use Name"
 
msgstr "Utiliser le nom"
 

	
 
msgid "Use HTTP"
 
msgstr "Utiliser HTTP"
 

	
 
msgid "Trending files"
 
msgstr "Populaires"
 

	
 
msgid "Download"
 
msgstr "Télécharger"
 

	
 
msgid "There are no downloads yet"
 
msgstr "Il n’y a pas encore de téléchargements proposés"
 

	
 
msgid "Downloads are disabled for this repository"
 
msgstr "Les téléchargements sont désactivés pour ce dépôt"
 

	
 
msgid "Download as zip"
 
msgstr "Télécharger en ZIP"
 

	
 
msgid "Check this to download archive with subrepos"
 
msgstr ""
 
"Télécharger une archive contenant également les sous-dépôts éventuels"
 

	
 
msgid "With subrepos"
 
msgstr "Avec les sous-dépôts"
 

	
 
msgid "Feed"
 
msgstr "Flux"
 

	
 
msgid "Latest Changes"
 
msgstr "Derniers changements"
 

	
 
msgid "Quick Start"
 
msgstr "Démarrage rapide"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "Ajouter ou téléverser des fichiers directement via Kallithea"
 

	
 
msgid "Push new repository"
 
msgstr "Pusher le nouveau dépôt"
 

	
 
msgid "Existing repository?"
 
msgstr "Le dépôt existe déjà ?"
 

	
 
msgid "Readme file from %s"
 
msgstr "Fichier Readme depuis %s"
 

	
 
msgid "Download %s as %s"
 
msgstr "Télécharge %s comme %s"
kallithea/i18n/ja/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -305,99 +305,96 @@ msgstr "管理"
 
msgid "Disabled"
 
msgstr "無効"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "手動でアカウントをアクティベートする"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "自動でアカウントをアクティベートする"
 

	
 
msgid "Manual activation of external account"
 
msgstr "外部アカウントを手動でアクティベートする"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "外部アカウントを自動でアクティベートする"
 

	
 
msgid "Enabled"
 
msgstr "有効"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "全般の権限の更新に成功しました"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "権限の更新中にエラーが発生しました"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "リポジトリグループ %s の作成中にエラーが発生しました"
 

	
 
msgid "Created repository group %s"
 
msgstr "リポジトリグループ %s を作成しました"
 

	
 
msgid "Updated repository group %s"
 
msgstr "リポジトリグループ %s を更新しました"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "リポジトリグループ %s の更新中にエラーが発生しました"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "このグループは %s 個のリポジトリを含んでいるため削除できません"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "このグループは %s 個のサブグループを含んでいるため削除できません"
 

	
 
msgid "Removed repository group %s"
 
msgstr "リポジトリグループ %s を削除しました"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "リポジトリグループ %s の削除中にエラーが発生しました"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "自分自身の管理者としての権限を取り消すことはできません"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "リポジトリグループ権限を更新しました"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "権限の取消中にエラーが発生しました"
 

	
 
msgid "Error creating repository %s"
 
msgstr "リポジトリ %s の作成中にエラーが発生しました"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "リポジトリ %s を %s から作成しました"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "リポジトリ %s を %s としてフォークしました"
 

	
 
msgid "Created repository %s"
 
msgstr "リポジトリ %s を作成しました"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "リポジトリ %s の更新に成功しました"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "リポジトリ %s の更新中にエラーが発生しました"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s 個のフォークを切り離しました"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s 個のフォークを削除しました"
 

	
 
msgid "Deleted repository %s"
 
msgstr "リポジトリ %s を削除しました"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr ""
 
"フォークしたリポジトリが存在するため、 リポジトリ %s は削除できません"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "%s の削除中にエラーが発生しました"
 

	
 
msgid "Repository permissions updated"
 
msgstr "リポジトリ権限を更新しました"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "フィールドの削除中にエラーが発生しました"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- フォークではありません --"
 
@@ -441,96 +438,99 @@ msgstr "アプリケーション設定を更新しました"
 
msgid "Updated visualisation settings"
 
msgstr "表示設定を更新しました"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "表示設定の更新中にエラーが発生しました"
 

	
 
msgid "Please enter email address"
 
msgstr "メールアドレスを入力してください"
 

	
 
msgid "Send email task created"
 
msgstr "メール送信タスクを作成しました"
 

	
 
msgid "Added new hook"
 
msgstr "新しいフックを追加しました"
 

	
 
msgid "Updated hooks"
 
msgstr "フックを更新しました"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "フックの作成中にエラーが発生しました"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whooshの再インデックスタスクを予定に入れました"
 

	
 
msgid "Created user group %s"
 
msgstr "ユーザーグループ %s を作成しました"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "ユーザーグループ %s の作成中にエラーが発生しました"
 

	
 
msgid "Updated user group %s"
 
msgstr "ユーザーグループ %s を更新しました"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "ユーザーグループ %s の更新中にエラーが発生しました"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "ユーザーグループの削除に成功しました"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "ユーザーグループの削除中にエラーが発生しました"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "対象に同じ物を選ぶことはできません"
 

	
 
msgid "User group permissions updated"
 
msgstr "ユーザーグループ権限を更新しました"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "自分自身の管理者としての権限を取り消すことはできません"
 

	
 
msgid "Updated permissions"
 
msgstr "権限を更新しました"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "権限の保存時にエラーが発生しました"
 

	
 
msgid "Created user %s"
 
msgstr "ユーザー %s を作成しました"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "ユーザー %s の作成中にエラーが発生しました"
 

	
 
msgid "User updated successfully"
 
msgstr "ユーザーの更新に成功しました"
 

	
 
msgid "Successfully deleted user"
 
msgstr "ユーザーの削除に成功しました"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "ユーザーの削除中にエラーが発生しました"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "デフォルト ユーザーを編集できません"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "ユーザーホワイトリストにIP %s を追加しました"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "IPアドレスの保存中にエラーが発生しました"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "ユーザーホワイトリストからIPアドレスを削除しました"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"このアクションを実行するためには登録済みのユーザーである必要があります"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "このページを閲覧するためにはサインインが必要です"
 

	
 
msgid "Binary file"
 
msgstr "バイナリファイル"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"チェンジセットが大きすぎるため省略しました。差分を表示する場合は差分メ"
 
"ニューを使用してください"
kallithea/i18n/pl/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -319,99 +319,96 @@ msgstr "Administracja"
 
msgid "Disabled"
 
msgstr "Wyłączone"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Dozwolona z ręczną aktywacją konta"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Dozwolona z automatyczną aktywacją konta"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ręczna aktywacja nowego konta"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Automatyczna aktywacja nowego konta"
 

	
 
msgid "Enabled"
 
msgstr "Włączone"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Globalne uprawnienia zaktualizowane poprawnie"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Wystąpił błąd podczas aktualizacji uprawnień"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Wystąpił błąd podczas tworzenia grupy repo %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Utworzono grupę repo %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Zaktualizowano grupę repo %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Wystąpił błąd podczas aktualizacji grupy repo %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Ta grupa zawiera %s repozytorium i nie może być usunięta"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Usunięto grupę repo %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Wystąpił błąd podczas usuwania z repozytorium grupy %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Nie można cofnąć zezwolenia dla admina jako admin"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Aktualizacja uprawnień grup repozytorium"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Wystąpił błąd podczas cofania zezwolenia"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Błąd podczas tworzenia repozytorium %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "utworzone repozytorium %s z %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Gałęzi %s w repozytorium %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Utworzone repozytorium %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repozytorium %s zostało pomyślnie zaktualizowane"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Wystąpił błąd podczas aktualizacji repozytorium %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Oderwane rozgałęzienie %s"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Usunięte rozgałęzienia %s"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Usunięte repozytorium %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr ""
 
"Nie można usunąć repozytorium %s nadal zawiera załączniki rozgałęzienia"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Wystąpił błąd podczas usuwania %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Uprawnienia repozytorium zostały zaktualizowane"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Błąd walidacji pola: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Wystąpił błąd podczas tworzenia pola: %r"
 
@@ -467,96 +464,99 @@ msgstr "Aktualizacja ustawień aplikacji"
 
msgid "Updated visualisation settings"
 
msgstr "Aktualizacja ustawień wizualizacji"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Wystąpił błąd podczas aktualizacji ustawień wizualizacji"
 

	
 
msgid "Please enter email address"
 
msgstr "Proszę podać adres email"
 

	
 
msgid "Hook already exists"
 
msgstr "Hook już istnieje"
 

	
 
msgid "Added new hook"
 
msgstr "Dodano nowy hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Aktualizacja hooku"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Wystąpił błąd podczas tworzenia hooku"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Zadanie ponownej indeksacji whoosh zostało zaplanowane"
 

	
 
msgid "Created user group %s"
 
msgstr "Utworzono grupę użytkowników %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Wystąpił błąd podczas tworzenia grupy użytkowników %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Zaktualizowano grupę użytkowników %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Wystąpił błąd podczas aktualizacji grupy użytkowników %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Grupa użytkowników została usunięta z powodzeniem"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Wystąpił błąd podczas usuwania grupy użytkowników"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Grupa docelowa nie może być taka sama"
 

	
 
msgid "User group permissions updated"
 
msgstr "Aktualizacja uprawnień grupy użytkowników"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Nie można cofnąć zezwolenia dla admina jako admin"
 

	
 
msgid "Updated permissions"
 
msgstr "Aktualizacja uprawnień"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Wystąpił błąd podczas zapisywania uprawnień"
 

	
 
msgid "Created user %s"
 
msgstr "Utworzono użytkownika %s"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Wystąpił błąd podczas tworzenia użytkownika %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Użytkownik został zaktualizowany"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Użytkownik został usunięty"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Wystąpił błąd podczas usuwania użytkownika"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Domyślny użytkownik nie może być edytowany"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Dodano ip %s do listy dozwolonych adresów użytkownika"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Wystąpił błąd podczas zapisywania adresu IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Usunięto adres ip z listy dozwolonych adresów dla użytkownika"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Musisz być zarejestrowanym użytkownikiem, żeby wykonać to działanie"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Musisz być zalogowany, żeby oglądać stronę"
 

	
 
msgid "Binary file"
 
msgstr "Plik binarny"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Lista zmian była zbyt duża i została obcięta, użyj menu porównań żeby "
 
"wyświetlić różnice"
 

	
kallithea/i18n/pt/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -198,99 +198,96 @@ msgstr "Gravar"
 
msgid "Admin"
 
msgstr "Administrador"
 

	
 
msgid "Disabled"
 
msgstr "Desativado"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Permitido com ativação manual de conta"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Permitido com ativação automática de conta"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ativação manual de conta externa"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Ativação automática de conta externa"
 

	
 
msgid "Enabled"
 
msgstr "Ativado"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Ocorreu um erro durante a atualização das permissões"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Ocorreu um erro durante a criação do grupo de repositórios %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Grupo de repositórios %s criado"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Grupo de repositórios %s atualizado"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Ocorreu um erro durante a atualização do grupo de repositórios %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Esse grupo contém %s repositórios e não pode ser apagado"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Este grupo contém %s subgrupos e não pode ser apagado"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Grupo de repositórios %s apagado"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Ocorreu um erro durante a exclusão do grupo de repositórios %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Não pode revocar sua própria permissão de administrador"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Permissões atualizadas do Grupo de Repositórios"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Ocorreu um erro durante a revocação das permissões"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Erro ao criar repositório %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Repositório %s criado de %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Repositório %s bifurcado como %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Repositório %s criado"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repositório %s atualizado com sucesso"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Ocorreu um erro durante a atualização do repositório %s"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s bifurcações apagadas"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Repositório %s apagado"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Ocorreu um erro durante a exclusão de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissões do repositório atualizadas"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Ocorreu um erro durante a remoção do campo"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Atualizada a visibilidade do repositório no diário público"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
 

	
 
msgid "Nothing"
 
msgstr "Nada"
 

	
 
@@ -317,96 +314,99 @@ msgstr ""
 
"Ocorreu um erro durante a atualização das configurações da aplicação"
 

	
 
msgid "Updated application settings"
 
msgstr "Configurações da aplicação atualizadas"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Configurações de visualização atualizadas"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Ocorreu um erro durante a atualização das configurações de visualização"
 

	
 
msgid "Added new hook"
 
msgstr "Adicionado novo gancho"
 

	
 
msgid "Updated hooks"
 
msgstr "Atualizados os ganchos"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Ocorreu um erro durante a criação do hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Tarefa de reindexação do whoosh agendada"
 

	
 
msgid "Created user group %s"
 
msgstr "Grupo de utilizadores %s criado"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Ocorreu um erro durante a criação do grupo de utilizadores %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Grupo de utilizadores %s atualizado"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Ocorreu um erro durante a atualização do grupo de utilizadores %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Grupo de utilizadores apagado com sucesso"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Ocorreu um erro durante a exclusão do grupo de utilizadores"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "O grupo destino não pode ser o mesmo"
 

	
 
msgid "User group permissions updated"
 
msgstr "Permissões do Grupo de Utilizadores atualizadas"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Não pode revocar sua própria permissão de administrador"
 

	
 
msgid "Updated permissions"
 
msgstr "Permissões atualizadas"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Ocorreu um erro durante o salvamento das permissões"
 

	
 
msgid "Created user %s"
 
msgstr "Utilizador %s criado"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Ocorreu um erro durante a criação do utilizador %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Utilizador atualizado com sucesso"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Utilizador apagado com sucesso"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Ocorreu um erro ao apagar o utilizador"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Ocorreu um erro durante o salvamento do IP"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Precisa ser um utilizador registado para realizar essa ação"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Precisa estar logado para ver essa página"
 

	
 
msgid "Binary file"
 
msgstr "Ficheiro binário"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Conjunto de mudanças é grande demais e foi cortado, use o menu de "
 
"diferenças para ver as diferenças"
 

	
 
msgid "No changes detected"
 
msgstr "Nenhuma alteração detectada"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Ramo apagado: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Tag criada: %s"
 

	
kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -198,99 +198,96 @@ msgstr "Gravar"
 
msgid "Admin"
 
msgstr "Administrador"
 

	
 
msgid "Disabled"
 
msgstr "Desabilitado"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Permitido com ativação manual de conta"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Permitido com ativação automática de conta"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ativação manual de conta externa"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Ativação automática de conta externa"
 

	
 
msgid "Enabled"
 
msgstr "Habilitado"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Ocorreu um erro durante a atualização das permissões"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Ocorreu um erro durante a criação do grupo de repositórios %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Grupo de repositórios %s criado"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Grupo de repositórios %s atualizado"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Ocorreu um erro durante a atualização do grupo de repositórios %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Esse grupo contém %s repositórios e não pode ser excluído"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Este grupo contém %s subgrupos e não pode ser excluído"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Grupo de repositórios %s excluído"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Ocorreu um erro durante a exclusão do grupo de repositórios %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Você não pode revocar sua própria permissão de administrador"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Permissões atualizadas do Grupo de Repositórios"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Ocorreu um erro durante a revocação das permissões"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Erro ao criar repositório %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Repositório %s criado de %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Repositório %s bifurcado como %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Repositório %s criado"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repositório %s atualizado com sucesso"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Ocorreu um erro durante a atualização do repositório %s"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s bifurcações excluídas"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Repositório %s excluído"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Ocorreu um erro durante a exclusão de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissões do repositório atualizadas"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Ocorreu um erro durante a remoção do campo"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Atualizada a visibilidade do repositório no diário público"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
 

	
 
msgid "Nothing"
 
msgstr "Nada"
 

	
 
@@ -317,96 +314,99 @@ msgstr ""
 
"Ocorreu um erro durante a atualização das configurações da aplicação"
 

	
 
msgid "Updated application settings"
 
msgstr "Configurações da aplicação atualizadas"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Configurações de visualização atualizadas"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Ocorreu um erro durante a atualização das configurações de visualização"
 

	
 
msgid "Added new hook"
 
msgstr "Adicionado novo gancho"
 

	
 
msgid "Updated hooks"
 
msgstr "Atualizados os ganchos"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Ocorreu um erro durante a criação do hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Tarefa de reindexação do whoosh agendada"
 

	
 
msgid "Created user group %s"
 
msgstr "Grupo de usuários %s criado"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Ocorreu um erro durante a criação do grupo de usuários %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Grupo de usuários %s atualizado"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Ocorreu um erro durante a atualização do grupo de usuários %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Grupo de usuários excluído com sucesso"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Ocorreu um erro durante a exclusão do grupo de usuários"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "O grupo destino não pode ser o mesmo"
 

	
 
msgid "User group permissions updated"
 
msgstr "Permissões do Grupo de Usuários atualizadas"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Você não pode revocar sua própria permissão de administrador"
 

	
 
msgid "Updated permissions"
 
msgstr "Permissões atualizadas"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Ocorreu um erro durante o salvamento das permissões"
 

	
 
msgid "Created user %s"
 
msgstr "Usuário %s criado"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Ocorreu um erro durante a criação do usuário %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Usuário atualizado com sucesso"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Usuário excluído com sucesso"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Ocorreu um erro ao excluir o usuário"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Ocorreu um erro durante o salvamento do IP"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Você precisa ser um usuário registrado para realizar essa ação"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Você precisa estar logado para ver essa página"
 

	
 
msgid "Binary file"
 
msgstr "Arquivo binário"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Conjunto de mudanças é grande demais e foi cortado, use o menu de "
 
"diferenças para ver as diferenças"
 

	
 
msgid "No changes detected"
 
msgstr "Nenhuma alteração detectada"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Excluído ramo: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Tag criada: %s"
 

	
kallithea/i18n/ru/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -405,99 +405,96 @@ msgstr "Администратор"
 
msgid "Disabled"
 
msgstr "Отключено"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Разрешена, с ручной активацией учётной записи"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Разрешена, с автоматической активацией учётной записи"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручная активация внешней учетной записи"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Автоматическая активация внешней учетной записи"
 

	
 
msgid "Enabled"
 
msgstr "Включено"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глобальные привилегии успешно обновлены"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Произошла ошибка во время обновления привилегий"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Произошла ошибка при создании группы репозиториев %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Создана новая группа репозиториев %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Группа репозиториев %s обновлена"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Произошла ошибка при обновлении группы репозиториев %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Данная группа содержит %s репозитариев и не может быть удалена"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Группа содержит в себе %s подгрупп и не может быть удалён"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Группа репозиториев %s удалена"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Произошла ошибка при удалении группы репозиториев %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Администратор не может отозвать свои привелегии"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Привилегии группы репозиториев обновлены"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Произошла ошибка при отзыве привелегии"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Произошла ошибка при создании репозитория %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Репозиторий %s создан из %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Создан форк репозитория %s с именем %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Репозиторий %s создан"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Репозитарий %s успешно обновлён"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Произошла ошибка во время обновления репозитория %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Форки %s отсоединены"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Удалены форки репозитория %s"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Репозиторий %s удалён"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Невозможно удалить репозиторий %s, поскольку существуют его форки"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Произошла ошибка во время удаления %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Привилегии репозитория обновлены"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Ошибка валидации поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Произошла ошибка при создании поля: %r"
 

	
 
@@ -552,96 +549,99 @@ msgstr "Настройки визуализации обновлены"
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Произошла ошибка при обновлении настроек визуализации"
 

	
 
msgid "Please enter email address"
 
msgstr "Пожалуйста, введите адрес электронной почты"
 

	
 
msgid "Send email task created"
 
msgstr "Задача отправки Email создана"
 

	
 
msgid "Hook already exists"
 
msgstr "Хук уже существует"
 

	
 
msgid "Added new hook"
 
msgstr "Добавлена новая ловушка"
 

	
 
msgid "Updated hooks"
 
msgstr "Обновлённые ловушки"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "произошла ошибка при создании хука"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Переиндексация базы Whoosh успешно запланирована"
 

	
 
msgid "Created user group %s"
 
msgstr "Создана группа пользователей %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Произошла ошибка при создании группы пользователей %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Группа пользователей %s обновлена"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Произошла ошибка при обновлении группы пользователей %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Группа пользователей успешно удалена"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Произошла ошибка при удалении группы пользователей"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Целевая группа не может быть такой же"
 

	
 
msgid "User group permissions updated"
 
msgstr "Привилегии группы пользователей обновлены"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Администратор не может отозвать свои привелегии"
 

	
 
msgid "Updated permissions"
 
msgstr "Обновлены привилегии"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Произошла ошибка при сохранении привилегий"
 

	
 
msgid "Created user %s"
 
msgstr "Пользователь %s создан"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Произошла ошибка при создании пользователя %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Пользователь успешно обновлён"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Пользователь успешно удалён"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Произошла ошибка при удалении пользователя"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Нельзя редактировать пользователя по умолчанию"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Добавлен IP %s в белый список пользователя"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Произошла ошибка при сохранении IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Удален IP %s из белого списка пользователя"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Вы должны быть зарегистрированным пользователем, чтобы выполнить это "
 
"действие"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Страница доступна только авторизованным пользователям"
 

	
 
msgid "Binary file"
 
msgstr "Двоичный файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набор изменения оказался слишком большими и был урезан, используйте меню "
kallithea/i18n/uk/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -386,99 +386,96 @@ msgstr "Адмін"
 
msgid "Disabled"
 
msgstr "Вимкнуто"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Дозволено з ручною активацією облікового запису"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Дозволено з автоматичною активацію облікового запису"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручна Активація зовнішнього акаунту"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Автоматична Активація зовнішнього акаунту"
 

	
 
msgid "Enabled"
 
msgstr "Увімкнено"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глобальні права успішно оновлено"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Сталася помилка під час оновлення прав"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Сталася помилка при створенні repository group %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Створена група репозиторіїв %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Оновлено групу репозиторіїв %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Сталася помилка при оновленні repository group %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Ця група містить %s репозиторії, і їх неможливо видалити"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Ця група містить %s підгрупи і не може бути видалена"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Видалена група репозиторіїв %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Сталася помилка під час видалення групи репохиторіїв %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Неможливо відкликати дозвіл для себе як адміністратора"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Оновлено дозволи групи репозиторіїв"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Сталася помилка під час відкликання прав"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Помилка створення репозиторію  %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Створено репозиторій  %s з %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Роздвоєно репозиторій %s як %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Створено репозиторій %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Репозиторій %s успішно оновлений"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Сталася помилка при оновленні репозиторію %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Від'єднано %s forks"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Видалено %s forks"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Видалений репозиторій %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Неможливо видалити репозиторій %s, що ще має forks"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Сталася помилка під час видалення %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Права доступів до репозиторіїв оновлено"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Помилка перевірки поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Сталася помилка під час створення поля: %r"
 

	
 
@@ -534,96 +531,99 @@ msgstr "Оновлені параметри візуалізації"
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Під час оновлення параметрів візуалізації сталася помилка"
 

	
 
msgid "Please enter email address"
 
msgstr "Будь ласка, введіть адресу електронної пошти"
 

	
 
msgid "Send email task created"
 
msgstr "Надіслати електронною поштою завдання створено"
 

	
 
msgid "Hook already exists"
 
msgstr "Hook вже існує"
 

	
 
msgid "Added new hook"
 
msgstr "Додано новий hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Оновлено hooks"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Сталася помилка під час створення hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Завдання реіндекса Whoosh заплановано"
 

	
 
msgid "Created user group %s"
 
msgstr "Створена Група користувачів %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Під час створення групи користувачів  %s сталася помилка"
 

	
 
msgid "Updated user group %s"
 
msgstr "Оновлена група користувачів %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Сталася помилка під час оновлення групи користувачів %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Група користувачів успішно видалена"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Під час видалення групи користувачів сталася помилка"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Цільова група не може бути однаковою"
 

	
 
msgid "User group permissions updated"
 
msgstr "Права на групи користувачів оновлені"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Неможливо відкликати дозвіл для себе як адміністратора"
 

	
 
msgid "Updated permissions"
 
msgstr "Оновлені дозволи"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Сталася помилка під час збереження дозволів"
 

	
 
msgid "Created user %s"
 
msgstr "Створено користувача %s"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Під час створення користувача %s сталася помилка"
 

	
 
msgid "User updated successfully"
 
msgstr "Користувач успішно оновлений"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Користувач успішно видалений"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Сталася помилка під час видалення користувача"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Користувача за промовчанням не можна редагувати"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Додана IP-адреса %s в білий список користувача"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Сталася помилка під час додавання IP-адреси"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Вилучено IP-адресу з білого списку користувачів"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Для виконання цієї дії потрібно бути зареєстрованим користувачем"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Ви повинні бути зареєстровані для перегляду цієї сторінки"
 

	
 
msgid "Binary file"
 
msgstr "Двійковий файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набір змін був занадто великий і було відрізано, використовуйте меню діфф "
 
"для показу цього порівняння"
 

	
kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po
Show inline comments
 
# Copyright (C) 2014 RhodeCode GmbH, and others.
 
# This file is distributed under the same license as the Kallithea project.
 

	
 
msgid ""
 
msgstr ""
 
"Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 
"Language: zh_CN\n"
 
"MIME-Version: 1.0\n"
 
"Content-Type: text/plain; charset=UTF-8\n"
 
"Content-Transfer-Encoding: 8bit\n"
 
"Plural-Forms: nplurals=1; plural=0;\n"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr "已检测到CSRF令牌泄漏-所有表单令牌都已过期"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "文件系统中找不到存储库"
 

	
 
msgid "There are no changesets yet"
 
msgstr "还没有修订集"
 

	
 
msgid "SSH access is disabled."
 
msgstr "SSH访问被禁用。"
 

	
 
msgid "None"
 
msgstr "无"
 

	
 
msgid "(closed)"
 
msgstr "(已关闭)"
 

	
 
msgid "No permission to change status"
 
msgstr "无权更改状态"
 

	
 
msgid "Successfully deleted pull request %s"
 
msgstr "成功删除拉取请求%s"
 

	
 
msgid "Such revision does not exist for this repository"
 
msgstr "在此代码库内,此修改并不存在"
 

	
 
msgid "Could not find other repository %s"
 
msgstr "找不到那个版本库 %s"
 

	
 
msgid "Cannot compare repositories of different types"
 
msgstr "不能比较不同类型的存储库"
 

	
 
msgid "Cannot show empty diff"
 
msgstr "不能显示空的差异"
 

	
 
msgid "No ancestor found for merge diff"
 
msgstr "找不到合并差异的祖先"
 

	
 
msgid "Multiple merge ancestors found for merge compare"
 
msgstr "在合并比较中发现多个合并祖先"
 

	
 
msgid "Cannot compare repositories without using common ancestor"
 
msgstr "如果不使用共同的祖先,就不能比较存储库"
 

	
 
msgid "No response"
 
msgstr "无响应"
 

	
 
msgid "Unknown error"
 
msgstr "未知错误"
 

	
 
msgid ""
 
"The request could not be understood by the server due to malformed syntax."
 
msgstr "由于错误的语法,服务器无法对请求进行响应。"
 

	
 
msgid "Unauthorized access to resource"
 
msgstr "未授权的资源访问"
 

	
 
msgid "You don't have permission to view this page"
 
msgstr "无权访问该页面"
 

	
 
msgid "The resource could not be found"
 
msgstr "资源未找到"
 

	
 
msgid ""
 
"The server encountered an unexpected condition which prevented it from "
 
"fulfilling the request."
 
msgstr "服务进入非预期的混乱状态,这会阻止它对请求进行响应。"
 

	
 
msgid "Changeset was too big and was cut off..."
 
msgstr "修订集太大并已被截断..."
 

	
 
msgid "%s %s feed"
 
msgstr "%s %s订阅"
 

	
 
msgid "Changes on %s repository"
 
msgstr "%s库的修改"
 

	
 
msgid "Click here to add new file"
 
msgstr "点击这里添加新文件"
 

	
 
msgid "There are no files yet."
 
msgstr "这里还没有文件。"
 

	
 
msgid "%s at %s"
 
msgstr "%s 在 %s"
 

	
 
msgid "You can only delete files with revision being a valid branch"
 
msgstr "您只能删除有效分支的修订中的文件"
 

	
 
msgid "Deleted file %s via Kallithea"
 
msgstr "删除文件 %s 通过 Kallithea"
 

	
 
msgid "Successfully deleted file %s"
 
msgstr "成功删除文件 %s"
 

	
 
msgid "Error occurred during commit"
 
msgstr "提交时发生错误"
 

	
 
msgid "You can only edit files with revision being a valid branch"
 
msgstr "您只能编辑有效分支的修订中的文件"
 

	
 
msgid "Edited file %s via Kallithea"
 
msgstr "已编辑文件 %s 通过 Kallithea"
 

	
 
msgid "No changes"
 
msgstr "无变更"
 

	
 
msgid "Successfully committed to %s"
 
msgstr "成功提交到%s"
 

	
 
msgid "Added file via Kallithea"
 
msgstr "已添加文件通过 Kallithea"
 

	
 
msgid "No content"
 
msgstr "无内容"
 

	
 
msgid "No filename"
 
msgstr "无文件名"
 

	
 
msgid "Location must be relative path and must not contain .. in path"
 
msgstr "位置必须是相对路径,并且..不能在路径中"
 

	
 
msgid "Downloads disabled"
 
msgstr "下载已禁用"
 

	
 
msgid "Unknown revision %s"
 
msgstr "未知版本%s"
 

	
 
msgid "Empty repository"
 
msgstr "空版本库"
 

	
 
msgid "Unknown archive type"
 
msgstr "未知包类型"
 

	
 
msgid "Changesets"
 
msgstr "修订集"
 

	
 
msgid "Branches"
 
msgstr "分支"
 

	
 
msgid "Tags"
 
msgstr "标签"
 

	
 
msgid "An error occurred during repository forking %s"
 
msgstr "在复刻版本库%s的时候发生错误"
 

	
 
msgid "Groups"
 
msgstr "组"
 

	
 
msgid "Repositories"
 
msgstr "版本库"
 

	
 
msgid "Branch"
 
msgstr "分支"
 

	
 
msgid "Closed Branches"
 
msgstr "已关闭分支"
 

	
 
msgid "Tag"
 
msgstr "标签"
 

	
 
msgid "Bookmark"
 
msgstr "书签"
 

	
 
msgid "Public Journal"
 
msgstr "公共日志"
 

	
 
msgid "Journal"
 
msgstr "日志"
 

	
 
msgid "Authentication failed."
 
msgstr "认证失败。"
 

	
 
msgid "Bad captcha"
 
msgstr "验证码错误"
 

	
 
msgid "You have successfully registered with %s"
 
msgstr "您已成功注册 %s"
 

	
 
msgid "A password reset confirmation code has been sent"
 
msgstr "密码重置确认码已经发送"
 

	
 
msgid "Invalid password reset token"
 
msgstr "无效的密码重置令牌"
 

	
 
msgid "Successfully updated password"
 
msgstr "成功更新密码"
 

	
 
msgid "Invalid reviewer \"%s\" specified"
 
msgstr "指定的审核者 \"%s\" 无效"
 

	
 
msgid "%s (closed)"
 
msgstr "%s (已关闭)"
 

	
 
msgid "Changeset"
 
msgstr "修订集"
 

	
 
msgid "Special"
 
msgstr "特殊"
 

	
 
msgid "Peer branches"
 
msgstr "同等分支"
 

	
 
msgid "Bookmarks"
 
msgstr "书签"
 

	
 
msgid "Error creating pull request: %s"
 
msgstr "创建拉取请求出错:%s"
 

	
 
msgid "Error occurred while creating pull request"
 
msgstr "创建拉取请求时发生错误"
 

	
 
msgid "Successfully opened new pull request"
 
msgstr "成功提交拉取请求"
 

	
 
msgid "New pull request iteration created"
 
msgstr "已创建新的拉取请求迭代"
 

	
 
msgid "Meanwhile, the following reviewers have been added: %s"
 
msgstr "同时,下列审查员已被加入:%s"
 

	
 
msgid "Meanwhile, the following reviewers have been removed: %s"
 
msgstr "同时,以下审查员已被删除:%s"
 

	
 
msgid "No description"
 
msgstr "无描述"
 

	
 
msgid "Pull request updated"
 
msgstr "拉取请求已更新"
 

	
 
msgid "Successfully deleted pull request"
 
msgstr "成功删除拉取请求"
 

	
 
msgid "Revision %s not found in %s"
 
msgstr "在 %s 中找不到修订集 %s"
 

	
 
msgid "Error: changesets not found when displaying pull request from %s."
 
msgstr "错误:当显示来自%s的拉动请求时,没有找到修订集。"
 

	
 
msgid "This pull request has already been merged to %s."
 
msgstr "这个拉取请求已经被合并到%s。"
 

	
 
msgid "This pull request has been closed and can not be updated."
 
msgstr "该拉取请求已被关闭,无法更新。"
 

	
 
msgid "The following additional changes are available on %s:"
 
msgstr "以下是对%s的额外修改:"
 

	
 
msgid "Note: Branch %s has another head: %s."
 
msgstr "注意:分支%s有另一个head:%s。"
 

	
 
msgid "Git pull requests don't support iterating yet."
 
msgstr "Git拉动请求还不支持迭代。"
 

	
 
msgid "The diff can't be shown - the PR revisions could not be found."
 
msgstr "不能显示差异-找不到PR的修订。"
 

	
 
msgid "Invalid search query. Try quoting it."
 
msgstr "错误的搜索。请尝试用引号包含它。"
 

	
 
msgid "The server has no search index."
 
msgstr "该服务器没有搜索索引。"
 

	
 
msgid "An error occurred during search operation."
 
msgstr "搜索操作期间发生错误。"
 

	
 
msgid "No data ready yet"
 
msgstr "数据尚未就绪"
 

	
 
msgid "Statistics are disabled for this repository"
 
msgstr "该版本库统计功能已经禁用"
 

	
 
msgid "Auth settings updated successfully"
 
msgstr "验证设置更新成功"
 

	
 
msgid "error occurred during update of auth settings"
 
msgstr "验证设置更新时发生错误"
 

	
 
msgid "Default settings updated successfully"
 
msgstr "默认设置已经成功更新"
 

	
 
msgid "Error occurred during update of defaults"
 
msgstr "默认值更新时发生错误"
 

	
 
msgid "Forever"
 
msgstr "永久"
 

	
 
msgid "5 minutes"
 
msgstr "5 分钟"
 

	
 
msgid "1 hour"
 
msgstr "1 小时"
 

	
 
msgid "1 day"
 
msgstr "1 天"
 

	
 
msgid "1 month"
 
msgstr "1 个月"
 

	
 
msgid "Lifetime"
 
msgstr "终身"
 

	
 
msgid "Error occurred during gist creation"
 
msgstr "gist 创建时发生错误"
 

	
 
msgid "Deleted gist %s"
 
msgstr "已删除 gist %s"
 

	
 
msgid "Unmodified"
 
msgstr "未修改"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "成功更新 gist 内容"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "成功更新 gist 数据"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "gist %s 更新时发生错误"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr "由于是系统帐号,无法编辑该用户"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "你的帐号已经更新完成"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "用户 %s 更新时发生错误"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "用户密码更新时发生错误"
 

	
 
msgid "Added email %s to user"
 
msgstr "已为用户添加电子邮件 %s"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "保存电子邮件时发生错误"
 

	
 
msgid "Removed email from user"
 
msgstr "成功删除用户电子邮件"
 

	
 
msgid "API key successfully created"
 
msgstr "API 密钥创建成功"
 

	
 
msgid "API key successfully reset"
 
msgstr "API 密钥重置成功"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API 密钥删除成功"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "成功添加SSH密钥%s"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "成功删除SSH密钥"
 

	
 
msgid "Read"
 
msgstr "读"
 

	
 
msgid "Write"
 
msgstr "写"
 

	
 
msgid "Admin"
 
msgstr "管理"
 

	
 
msgid "Disabled"
 
msgstr "停用"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "已允许手动激活账号"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "已允许自动激活账号"
 

	
 
msgid "Manual activation of external account"
 
msgstr "外部账号手动激活"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "外部账号自动激活"
 

	
 
msgid "Enabled"
 
msgstr "启用"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "全局权限更新成功"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "权限更新时发生错误"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "在创建版本库组%s时发生错误"
 

	
 
msgid "Created repository group %s"
 
msgstr "成功创建版本库组 %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "成功更新版本库组%s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "在更新版本库组%s时发生错误"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "这个组内有%s个版本库因而无法删除"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "此组包含%s个子组,不能被删除"
 

	
 
msgid "Removed repository group %s"
 
msgstr "删除了版本库组%s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "删除版本库组%s时发生错误"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "版本库组的权限已更新"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "撤销许可的过程中发生了一个错误"
 

	
 
msgid "Error creating repository %s"
 
msgstr "创建版本库%s时出错"
 

	
 
msgid "Created repository %s"
 
msgstr "创建了版本库 %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "版本库%s成功更新"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "在删除%s的时候发生错误"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "成功更新在公共日志中的可见性"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "设置版本库到公共日志时发生错误"
 

	
 
msgid "Nothing"
 
msgstr "无"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "成功将版本库%s标记为复刻自%s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "在搜索操作中发生错误"
 

	
 
msgid "Pulled from remote location"
 
msgstr "成功拉取自远程路径"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "从远程路径拉取时发生错误"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "删除版本库统计时发生错误"
 

	
 
msgid "Updated VCS settings"
 
msgstr "成功更新版本控制系统设置"
 

	
 
msgid "Updated application settings"
 
msgstr "更新应用设置"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "成功更新可视化设置"
 

	
 
msgid "Added new hook"
 
msgstr "新建钩子"
 

	
 
msgid "Updated hooks"
 
msgstr "更新钩子"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh重新索引任务调度"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "不能以管理员身份撤销自己的权限"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "保存权限时发生错误"
 

	
 
msgid "User updated successfully"
 
msgstr "用户更新成功"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "删除用户时发生错误"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "必须是注册用户才能进行此操作"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "必须登录才能访问该页面"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr "修订集过大并已被截断,使用差异菜单查看此差异"
 

	
 
msgid "No changes detected"
 
msgstr "未发现差异"
 

	
 
msgid "Ignore whitespace changes"
 
msgstr "忽略空白的改变"
 

	
 
msgid "Increase diff context to %(num)s lines"
 
msgstr "增加差异上下文到 %(num)s 行"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "已经删除分支%s"
 

	
 
msgid "Created tag: %s"
 
msgstr "创建标签%s"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "显示所有合并的修订集 %s->%s"
 

	
 
msgid "and"
 
msgstr "还有"
 

	
 
msgid "%s more"
 
msgstr "%s个"
 

	
 
msgid "revisions"
 
msgstr "修订"
 

	
 
msgid "[deleted] repository"
 
msgstr "[删除]版本库"
 

	
 
msgid "[created] repository"
 
msgstr "[创建]版本库"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[创建]复刻版本库"
 

	
 
msgid "[forked] repository"
 
msgstr "[复刻]版本库"
 

	
 
msgid "[updated] repository"
 
msgstr "[更新]版本库"
 

	
 
msgid "[delete] repository"
 
msgstr "[删除]版本库"
 

	
 
msgid "[created] user"
 
msgstr "[创建]用户"
 

	
 
msgid "[updated] user"
 
msgstr "[更新]用户"
 

	
 
msgid "[commented] on revision in repository"
 
msgstr "[评论]了版本库中的修订"
 

	
 
msgid "[commented] on pull request for"
 
msgstr "[评论]拉取请求"
 

	
 
msgid "[closed] pull request for"
 
msgstr "[关闭] 拉取请求"
 

	
 
msgid "[pushed] into"
 
msgstr "[推送]到"
 

	
 
msgid "[committed via Kallithea] into repository"
 
msgstr "[通过Kallithea提交]到版本库"
 

	
 
msgid "[pulled from remote] into repository"
 
msgstr "[远程拉取]到版本库"
 

	
 
msgid "[pulled] from"
 
msgstr "[拉取]自"
 

	
 
msgid "[started following] repository"
 
msgstr "[开始关注]版本库"
 

	
 
msgid "[stopped following] repository"
 
msgstr "[停止关注]版本库"
 

	
 
msgid " and %s more"
 
msgstr " 还有%s个"
 

	
 
msgid "No files"
 
msgstr "无文件"
 

	
 
msgid "mod"
 
msgstr "修改"
 

	
 
msgid "del"
 
msgstr "删除"
 

	
 
msgid "rename"
 
msgstr "重命名"
 

	
 
msgid "chmod"
 
msgstr "更改权限"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d年"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d月"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d天"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d时"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d分"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d秒"
 

	
 
msgid "in %s"
 
msgstr "%s"
 

	
 
msgid "%s ago"
 
msgstr "%s前"
 

	
 
msgid "in %s and %s"
 
msgstr "%s零%s"
 

	
 
msgid "%s and %s ago"
 
msgstr "%s零%s前"
 

	
 
msgid "just now"
 
msgstr "刚才"
 

	
 
msgid "Kallithea Administrator"
 
msgstr "Kallithea 管理员"
 

	
 
msgid "Only admins can fork repositories"
 
msgstr "只有管理员可以复刻版本库"
 

	
 
msgid "Non-admins can fork repositories"
 
msgstr "非管理员可以复刻版本库"
 

	
 
msgid "Registration disabled"
 
msgstr "禁止注册"
 

	
 
msgid "Not approved"
 
msgstr "未被批准"
 

	
 
msgid "Approved"
 
msgstr "已批准"
 

	
 
msgid "Please enter a login"
 
msgstr "请登录"
 

	
 
msgid "Enter a value %(min)i characters long or more"
 
msgstr "输入一个不少于%(min)i个字符的值"
 

	
 
msgid "Please enter a password"
 
msgstr "请输入密码"
 

	
 
msgid "Enter %(min)i characters or more"
 
msgstr "输入少于%(min)i个字符"
 

	
 
msgid "Closing"
 
msgstr "关闭中"
 

	
 
msgid "latest tip"
 
msgstr "最新tip版本"
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "值不能为空"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "用户名称%(username)s已经存在"
 

	
 
msgid "Username %(username)s is not valid"
 
msgstr "用户名称 %(username)s 无效"
 

	
 
msgid "Cannot assign this group as parent"
 
msgstr "不能将这个组作为parent"
 

	
 
msgid "Group \"%(group_name)s\" already exists"
 
msgstr "组 \"%(group_name)s\" 已经存在"
 

	
 
msgid "Repository with name \"%(group_name)s\" already exists"
 
msgstr "已经存在名为 \"%(group_name)s\" 的版本库"
 

	
 
msgid "Invalid characters (non-ascii) in password"
 
msgstr "密码含有无效(非ASCII)字符"
 

	
 
msgid "Passwords do not match"
 
msgstr "密码不符"
 

	
 
msgid "Repository named %(repo)s already exists"
 
msgstr "已经存在版本库%(repo)s"
 

	
 
msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 
msgstr "版本库组 \"%(group)s\" 中已经存在版本库 \"%(repo)s\""
 

	
 
msgid "Fork has to be the same type as parent"
 
msgstr "复刻版本库必须和父版本库类型相同"
 

	
 
msgid "You don't have permissions to create repository in this group"
 
msgstr "没有在该版本库组中创建版本库的权限"
 

	
 
msgid "This is not a valid path"
 
msgstr "不是一个合法的路径"
 

	
 
msgid ""
 
"The LDAP Login attribute of the CN must be specified - this is the name "
 
"of the attribute that is equivalent to \"username\""
 
msgstr "LDAP 登录属性的 CN 必须指定 - 这个名字作为用户名"
 

	
 
msgid "About"
 
msgstr "关于"
 

	
 
msgid "Repository"
 
msgstr "版本库"
 

	
 
msgid "Description"
 
msgstr "描述"
 

	
 
msgid "Last Change"
 
msgstr "最后修改"
 

	
 
msgid "Tip"
 
msgstr "Tip"
 

	
 
msgid "Owner"
 
msgstr "所有者"
 

	
 
msgid "Log In"
 
msgstr "登录"
 

	
 
msgid "Username"
 
msgstr "帐号"
 

	
 
msgid "Password"
 
msgstr "密码"
 

	
 
msgid "Forgot your password?"
 
msgstr "忘记了密码?"
 

	
 
msgid "Don't have an account?"
 
msgstr "还没有帐号?"
 

	
 
msgid "Sign In"
 
msgstr "登录"
 

	
 
msgid "Captcha"
 
msgstr "验证码"
 

	
 
msgid "Confirm"
 
msgstr "确认"
 

	
 
msgid "Sign Up"
 
msgstr "注册"
 

	
 
msgid "Re-enter password"
 
msgstr "确认密码"
 

	
 
msgid "First Name"
 
msgstr "名"
 

	
 
msgid "Last Name"
 
msgstr "姓"
 

	
 
msgid "Email"
 
msgstr "电子邮件"
 

	
 
msgid "journal filter..."
 
msgstr "日志过滤..."
 

	
 
msgid "Filter"
 
msgstr "过滤"
 

	
 
msgid "Action"
 
msgstr "操作"
 

	
 
msgid "Date"
 
msgstr "日期"
 

	
 
msgid "From IP"
 
msgstr "来源IP"
 

	
 
msgid "No actions yet"
 
msgstr "无操作"
 

	
 
msgid "Authentication"
 
msgstr "认证"
 

	
 
msgid "Plugin"
 
msgstr "插件"
 

	
 
msgid "Save"
 
msgstr "保存"
 

	
 
msgid "Type"
 
msgstr "类型"
 

	
 
msgid "Private repository"
 
msgstr "私有版本库"
 

	
 
msgid ""
 
"Private repositories are only visible to people explicitly added as "
 
"collaborators."
 
msgstr "私有版本库只对成员可见。"
 

	
 
msgid "Enable statistics"
 
msgstr "启用统计"
 

	
 
msgid "Enable statistics window on summary page."
 
msgstr "启用概况页面上的统计窗口。"
 

	
 
msgid "Enable downloads"
 
msgstr "启用下载"
 

	
 
msgid "Enable download menu on summary page."
 
msgstr "启用概况页面上的下载菜单。"
 

	
 
msgid "Expires"
 
msgstr "到期"
 

	
 
msgid "Never"
 
msgstr "永不"
 

	
 
msgid "Cancel"
 
msgstr "取消"
 

	
 
msgid "Created"
 
msgstr "创建于"
 

	
 
msgid "Reset"
 
msgstr "重置"
 

	
 
msgid "Gist"
 
msgstr "Gist"
 

	
 
msgid "URL"
 
msgstr "URL"
 

	
 
msgid "Delete"
 
msgstr "删除"
 

	
 
msgid "Edit"
 
msgstr "编辑"
 

	
 
msgid "created"
 
msgstr "创建于"
 

	
 
msgid "My Account"
 
msgstr "我的账户"
 

	
 
msgid "Profile"
 
msgstr "个人资料"
 

	
 
msgid "Built-in"
 
msgstr "内置"
 

	
 
msgid "Expired"
 
msgstr "已到期"
 

	
 
msgid "Remove"
 
msgstr "移除"
 

	
 
msgid "Add"
 
msgstr "增加"
 

	
 
msgid "Primary"
 
msgstr "主要"
 

	
 
msgid "Confirm to delete this email: %s"
 
msgstr "确认删除邮箱:%s"
 

	
 
msgid "New email address"
 
msgstr "增加邮箱"
 

	
 
msgid "New password"
 
msgstr "新密码"
 

	
 
msgid "Gravatar"
 
msgstr "Gravatar"
 

	
 
msgid "Name"
 
msgstr "名称"
 

	
 
msgid "Global"
 
msgstr "全局"
 

	
 
msgid "Anonymous access"
 
msgstr "匿名访问"
 

	
 
msgid "Repository group"
 
msgstr "版本库组"
 

	
 
msgid "Repository forking"
 
msgstr "版本库复刻"
 

	
 
msgid "Registration"
 
msgstr "注册"
 

	
 
msgid "Group name"
 
msgstr "组名"
 

	
 
msgid "Group parent"
 
msgstr "上级组"
 

	
 
msgid "Settings"
 
msgstr "设置"
 

	
 
msgid "Advanced"
 
msgstr "进阶"
 

	
 
msgid "Permissions"
 
msgstr "权限"
 

	
 
msgid "Created on"
 
msgstr "创建于"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "确认删除这个版本库组:%s包含%s个版本库"
 

	
 
msgid "Visible"
 
msgstr "可见"
 

	
 
msgid "Default"
 
msgstr "默认"
 

	
 
msgid "Revoke"
 
msgstr "撤销"
 

	
 
msgid "Both"
 
msgstr "两者"
 

	
 
msgid "Type of repository to create."
 
msgstr "要创建的版本库类型。"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr "保持简短。用README文件来写更长的描述。"
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "可选的选择一个组将版本库放到其中。"
 

	
 
msgid "Landing revision"
 
msgstr "默认修订"
 

	
 
msgid "Remote"
 
msgstr "远程"
 

	
 
msgid "Statistics"
 
msgstr "统计"
 

	
 
msgid "Parent"
 
msgstr "上级"
 

	
 
msgid "Set"
 
msgstr "设置"
 

	
 
msgid "Remove from public journal"
 
msgstr "从公共日志删除"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "确认删除版本库:%s"
 

	
 
msgid "Label"
 
msgstr "标签"
 

	
 
msgid "Key"
 
msgstr "键"
 

	
 
msgid "Change owner of this repository."
 
msgstr "修改这个版本库的所有者。"
 

	
 
msgid "State"
 
msgstr "状态"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Visual"
 
msgstr "外观"
 

	
 
msgid "Hooks"
 
msgstr "钩子"
 

	
 
msgid "Send"
 
msgstr "发送"
 

	
 
msgid "Failed to remove hook"
 
msgstr "移除钩子失败"
 

	
 
msgid "Reindex"
 
msgstr "重新索引"
 

	
 
msgid "Platform"
 
msgstr "平台"
 

	
 
msgid "Show repository size after push"
 
msgstr "推送后显示版本库大小"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "推送后更新版本库(hg update)"
 

	
 
msgid "General"
 
msgstr "通用"
 

	
 
msgid "Icons"
 
msgstr "图标"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "显示公共版本库图标"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "显示私有版本库图标"
 

	
 
msgid "Active"
 
msgstr "启用"
 

	
 
msgid "Members"
 
msgstr "成员"
 

	
 
msgid "No members yet"
 
msgstr "还没有成员"
 

	
 
msgid "Available members"
 
msgstr "启用成员"
 

	
 
msgid "Add user"
 
msgstr "添加用户"
 

	
 
msgid "Users"
 
msgstr "用户"
 

	
 
msgid "Password confirmation"
 
msgstr "确认密码"
 

	
 
msgid "Emails"
 
msgstr "电子邮件"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "确认删除用户:%s"
 

	
 
msgid "New password confirmation"
 
msgstr "确认新密码"
 

	
 
msgid "Support"
 
msgstr "支持"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurial版本库"
 

	
 
msgid "Git repository"
 
msgstr "Git版本库"
 

	
 
msgid "Summary"
 
msgstr "概况"
 

	
 
msgid "Changelog"
 
msgstr "修订记录"
 

	
 
msgid "Files"
 
msgstr "浏览"
 

	
 
msgid "Options"
 
msgstr "选项"
 

	
 
msgid "Compare"
 
msgstr "比较显示"
 

	
 
msgid "Search"
 
msgstr "搜索"
 

	
 
msgid "Follow"
 
msgstr "关注"
 

	
 
msgid "Unfollow"
 
msgstr "取消关注"
 

	
 
msgid "Fork"
 
msgstr "复刻"
 

	
 
msgid "Public journal"
 
msgstr "公共日志"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Log Out"
 
msgstr "退出"
 

	
 
msgid "Create repositories"
 
msgstr "创建版本库"
 

	
 
msgid "Fork repositories"
 
msgstr "复刻版本库"
 

	
 
msgid "Show"
 
msgstr "显示"
 

	
 
msgid "Permission"
 
msgstr "权限"
 

	
 
msgid "Edit Permission"
 
msgstr "编辑权限"
 

	
 
msgid "Stop following this repository"
 
msgstr "停止关注该版本库"
 

	
 
msgid "Start following this repository"
 
msgstr "开始关注该版本库"
 

	
 
msgid "Group"
 
msgstr "组"
 

	
 
msgid "Show Selected Changesets {0}"
 
msgstr "显示选中的修订集 {0}"
 

	
 
msgid "Select changeset"
 
msgstr "选择修订集"
 

	
 
msgid "Specify changeset"
 
msgstr "指定修订集"
 

	
 
msgid "Click to sort ascending"
 
msgstr "点击以升序排列"
 

	
 
msgid "Click to sort descending"
 
msgstr "点击以降序排列"
 

	
 
msgid "No records found."
 
msgstr "没有找到记录。"
 

	
 
msgid "Data error."
 
msgstr "数据错误。"
 

	
 
msgid "Loading..."
 
msgstr "载入中..."
 

	
 
msgid "%s Changelog"
 
msgstr "%s修订记录"
 

	
 
msgid "showing %d out of %d revision"
 
msgid_plural "showing %d out of %d revisions"
 
msgstr[0] "显示%d/%d个版本"
 

	
 
msgid "Clear selection"
 
msgstr "清除选择"
 

	
 
msgid "There are no changes yet"
 
msgstr "没有任何变更"
 

	
 
msgid "Removed"
 
msgstr "已移除"
 

	
 
msgid "Changed"
 
msgstr "已更改"
 

	
 
msgid "Added"
 
msgstr "已添加"
 

	
 
msgid "First (oldest) changeset in this list"
 
msgstr "此列表中首个(最旧)修订集"
 

	
 
msgid "Last (most recent) changeset in this list"
 
msgstr "此列表中末个(最近)修订集"
 

	
 
msgid "Position in this list of changesets"
 
msgstr "修订集在此列表中的位置"
 

	
 
msgid ""
 
"Changeset status: %s by %s\n"
 
"Click to open associated pull request %s"
 
msgstr ""
 
"修订集状态:%s 由 %s\n"
 
"点击打开相关联的拉取请求 %s"
 

	
 
msgid "Changeset status: %s by %s"
 
msgstr "修订集状态:%s 由 %s"
 

	
 
msgid "%s Changeset"
 
msgstr "%s 修订集"
 

	
 
msgid "Changeset status"
 
msgstr "修订集状态"
 

	
 
msgid "Merge"
 
msgstr "合并"
 

	
 
msgid "%s file changed"
 
msgid_plural "%s files changed"
 
msgstr[0] "修改%s个文件"
 

	
 
msgid "%s file changed with %s insertions and %s deletions"
 
msgid_plural "%s files changed with %s insertions and %s deletions"
 
msgstr[0] "修改%s个文件包括%s行插入和%s行删除"
 

	
 
msgid "on this changeset"
 
msgstr "在此修订集"
 

	
 
msgid "Set changeset status"
 
msgstr "设置修订集状态"
 

	
 
msgid "Close"
 
msgstr "关闭"
 

	
 
msgid "Comment"
 
msgstr "评论"
 

	
 
msgid "You need to be logged in to comment."
 
msgstr "您必须登录才能评论。"
 

	
 
msgid "Login now"
 
msgstr "现在登录"
 

	
 
msgid "Hide"
 
msgstr "隐藏"
 

	
 
msgid "%d comment"
 
msgid_plural "%d comments"
 
msgstr[0] "%d条评论"
 

	
 
msgid "%s Changesets"
 
msgstr "%s 修订集"
 

	
 
msgid "Changeset status: %s"
 
msgstr "修订集状态:%s"
 

	
 
msgid "Files affected"
 
msgstr "影响文件"
 

	
 
msgid "Modified"
 
msgstr "已修改"
 

	
 
msgid "Deleted"
 
msgstr "已删除"
 

	
 
msgid "Renamed"
 
msgstr "已重命名"
 

	
 
msgid "No changesets"
 
msgstr "无修订集"
 

	
 
msgid "is"
 
msgstr "有"
 

	
 
msgid "%s changesets"
 
msgstr "%s 修订集"
 

	
 
msgid "behind"
 
msgstr "落后于"
 

	
 
msgid "Swap"
 
msgstr "交换"
 

	
 
msgid "Showing %s commit"
 
msgid_plural "Showing %s commits"
 
msgstr[0] "显示%s个提交"
 

	
 
msgid "Public repository"
 
msgstr "公共版本库"
 

	
 
msgid "No changesets yet"
 
msgstr "尚无任何修订集"
 

	
 
msgid "Subscribe to %s rss feed"
 
msgstr "订阅%s的RSS"
 

	
 
msgid "Subscribe to %s atom feed"
 
msgstr "订阅%s的Atom"
 

	
 
msgid "Creating"
 
msgstr "创建中"
 

	
 
msgid "branch"
 
msgstr "分支"
 

	
 
msgid "File diff"
 
msgstr "文件差异"
 

	
 
msgid "Ignore whitespace"
 
msgstr "忽略空白"
 

	
 
msgid "Location"
 
msgstr "位置"
 

	
 
msgid "or"
 
msgstr "或者"
 

	
 
msgid "Loading file list..."
 
msgstr "加载文件列表..."
 

	
 
msgid "Size"
 
msgstr "大小"
 

	
 
msgid "Last Revision"
 
msgstr "最后修订号"
 

	
 
msgid "Source"
 
msgstr "源代码"
 

	
 
msgid "%s author"
 
msgid_plural "%s authors"
 
msgstr[0] "%s个作者"
 

	
 
msgid "Binary file (%s)"
 
msgstr "二进制文件(%s)"
 

	
 
msgid "annotation"
 
msgstr "显示注释"
 

	
 
msgid "No files at given path"
 
msgstr "指定的路径中没有文件"
 

	
 
msgid "%s Followers"
 
msgstr "%s个关注者"
 

	
 
msgid "Followers"
 
msgstr "关注者"
 

	
 
msgid "Started following -"
 
msgstr "开始关注 -"
 

	
 
msgid "Fork name"
 
msgstr "复刻名称"
 

	
 
msgid "Private"
 
msgstr "私有"
 

	
 
msgid "Copy permissions"
 
msgstr "拷贝权限"
 

	
 
msgid "Copy permissions from forked repository"
 
msgstr "从被复刻版本库拷贝权限"
 

	
 
msgid "Update after clone"
 
msgstr "克隆后更新"
 

	
 
msgid "Checkout source after making a clone"
 
msgstr "完成克隆后检出源代码"
 

	
 
msgid "%s Forks"
 
msgstr "%s个复刻"
 

	
 
msgid "Forks"
 
msgstr "复刻"
 

	
 
msgid "Forked"
 
msgstr "已复刻"
 

	
 
msgid "There are no forks yet"
 
msgstr "无复刻"
 

	
 
msgid "ATOM journal feed"
 
msgstr "订阅日志ATOM"
 

	
 
msgid "RSS journal feed"
 
msgstr "订阅日志RSS"
 

	
 
msgid "No entries yet"
 
msgstr "没有条目"
 

	
 
msgid "ATOM public journal feed"
 
msgstr "订阅公共日志ATOM"
 

	
 
msgid "RSS public journal feed"
 
msgstr "订阅公共日志RSS"
 

	
 
msgid "Title"
 
msgstr "标题"
 

	
 
msgid "Revision"
 
msgstr "修订"
 

	
 
msgid "Vote"
 
msgstr "投票"
 

	
 
msgid "Age"
 
msgstr "时间"
 

	
 
msgid "Closed"
 
msgstr "已关闭"
 

	
 
msgid "Delete Pull Request"
 
msgstr "删除拉取请求"
 

	
 
msgid "Confirm to delete this pull request"
 
msgstr "确认删除拉取请求"
 

	
 
msgid "Origin"
 
msgstr "来源"
 

	
 
msgid "on"
 
msgstr "于"
 

	
 
msgid "Target"
 
msgstr "目标"
 

	
 
msgid "Search term"
 
msgstr "搜索短语"
 

	
 
msgid "Search in"
 
msgstr "搜索范围"
 

	
 
msgid "File contents"
 
msgstr "文件内容"
 

	
 
msgid "Commit messages"
 
msgstr "提交信息"
 

	
 
msgid "File names"
 
msgstr "文件名"
 

	
 
msgid "Permission denied"
 
msgstr "权限不足"
 

	
 
msgid "Enable"
 
msgstr "启用"
 

	
 
msgid "Stats gathered: "
 
msgstr "已收集的统计: "
 

	
 
msgid "files"
 
msgstr "文件"
 

	
 
msgid "commits"
 
msgstr "提交"
 

	
 
msgid "files added"
 
msgstr "文件已添加"
 

	
 
msgid "files changed"
 
msgstr "文件已更改"
 

	
 
msgid "files removed"
 
msgstr "文件已删除"
 

	
 
msgid "commit"
 
msgstr "提交"
 

	
 
msgid "file added"
 
msgstr "文件已添加"
 

	
 
msgid "file changed"
 
msgstr "文件已更改"
 

	
 
msgid "file removed"
 
msgstr "文件已删除"
 

	
 
msgid "%s Summary"
 
msgstr "%s概要"
 

	
 
msgid "Fork of"
 
msgstr "复刻自"
 

	
 
msgid "Clone from"
 
msgstr "克隆自"
 

	
 
msgid "Trending files"
 
msgstr "文件趋势图"
 

	
 
msgid "Download"
 
msgstr "下载"
 

	
 
msgid "There are no downloads yet"
 
msgstr "无下载"
 

	
 
msgid "Downloads are disabled for this repository"
 
msgstr "这个版本库的下载已经禁用"
 

	
 
msgid "Download as zip"
 
msgstr "zip打包下载"
 

	
 
msgid "Check this to download archive with subrepos"
 
msgstr "勾选以下载包含子版本库的压缩包"
 

	
 
msgid "Feed"
 
msgstr "订阅源"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "通过Kallithea直接添加或者上传文件"
 

	
 
msgid "Existing repository?"
 
msgstr "已有版本库?"
 

	
 
msgid "Download %s as %s"
 
msgstr "下载%s为%s包"
kallithea/lib/auth.py
Show inline comments
 
@@ -217,97 +217,100 @@ class AuthUser(object):
 
                    p = 'repository.none'
 
                else:
 
                    p = perm.permission.permission_name
 
                repository_permissions[r_k] = p
 

	
 
            # user group repository permissions
 
            user_repo_perms_from_users_groups = \
 
             meta.Session().query(db.UserGroupRepoToPerm) \
 
                .join((db.UserGroup, db.UserGroupRepoToPerm.users_group_id ==
 
                       db.UserGroup.users_group_id)) \
 
                .filter(db.UserGroup.users_group_active == True) \
 
                .join((db.UserGroupMember, db.UserGroupRepoToPerm.users_group_id ==
 
                       db.UserGroupMember.users_group_id)) \
 
                .filter(db.UserGroupMember.user_id == self.user_id) \
 
                .options(joinedload(db.UserGroupRepoToPerm.repository)) \
 
                .options(joinedload(db.UserGroupRepoToPerm.permission)) \
 
                .all()
 
            for perm in user_repo_perms_from_users_groups:
 
                bump_permission(repository_permissions,
 
                    perm.repository.repo_name,
 
                    perm.permission.permission_name)
 

	
 
            # user permissions for repositories
 
            user_repo_perms = db.Permission.get_default_perms(self.user_id)
 
            for perm in user_repo_perms:
 
                bump_permission(repository_permissions,
 
                    perm.repository.repo_name,
 
                    perm.permission.permission_name)
 

	
 
        return repository_permissions
 

	
 
    @LazyProperty
 
    def repository_group_permissions(self):
 
        log.debug('Getting repository group permissions for %s', self)
 
        repository_group_permissions = {}
 
        default_repo_groups_perms = db.Permission.get_default_group_perms(kallithea.DEFAULT_USER_ID)
 

	
 
        if self.is_admin:
 
            for perm in default_repo_groups_perms:
 
                rg_k = perm.group.group_name
 
                p = 'group.admin'
 
                repository_group_permissions[rg_k] = p
 

	
 
        else:
 
            # defaults for repository groups taken from default user permission
 
            # on given group
 
            for perm in default_repo_groups_perms:
 
                rg_k = perm.group.group_name
 
                p = perm.permission.permission_name
 
                if perm.group.owner_id == self.user_id:
 
                    p = 'group.admin'
 
                else:
 
                    p = perm.permission.permission_name
 
                repository_group_permissions[rg_k] = p
 

	
 
            # user group for repo groups permissions
 
            user_repo_group_perms_from_users_groups = \
 
                meta.Session().query(db.UserGroupRepoGroupToPerm) \
 
                .join((db.UserGroup, db.UserGroupRepoGroupToPerm.users_group_id ==
 
                       db.UserGroup.users_group_id)) \
 
                .filter(db.UserGroup.users_group_active == True) \
 
                .join((db.UserGroupMember, db.UserGroupRepoGroupToPerm.users_group_id
 
                       == db.UserGroupMember.users_group_id)) \
 
                .filter(db.UserGroupMember.user_id == self.user_id) \
 
                .options(joinedload(db.UserGroupRepoGroupToPerm.permission)) \
 
                .all()
 
            for perm in user_repo_group_perms_from_users_groups:
 
                bump_permission(repository_group_permissions,
 
                    perm.group.group_name,
 
                    perm.permission.permission_name)
 

	
 
            # user explicit permissions for repository groups
 
            user_repo_groups_perms = db.Permission.get_default_group_perms(self.user_id)
 
            for perm in user_repo_groups_perms:
 
                bump_permission(repository_group_permissions,
 
                    perm.group.group_name,
 
                    perm.permission.permission_name)
 

	
 
        return repository_group_permissions
 

	
 
    @LazyProperty
 
    def user_group_permissions(self):
 
        log.debug('Getting user group permissions for %s', self)
 
        user_group_permissions = {}
 
        default_user_group_perms = db.Permission.get_default_user_group_perms(kallithea.DEFAULT_USER_ID)
 

	
 
        if self.is_admin:
 
            for perm in default_user_group_perms:
 
                u_k = perm.user_group.users_group_name
 
                p = 'usergroup.admin'
 
                user_group_permissions[u_k] = p
 

	
 
        else:
 
            # defaults for user groups taken from default user permission
 
            # on given user group
 
            for perm in default_user_group_perms:
 
                u_k = perm.user_group.users_group_name
 
                p = perm.permission.permission_name
 
                user_group_permissions[u_k] = p
 

	
 
            # user group for user group permissions
kallithea/lib/utils2.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program 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 General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea.lib.utils2
 
~~~~~~~~~~~~~~~~~~~~
 

	
 
Some simple helper functions.
 
Note: all these functions should be independent of Kallithea classes, i.e.
 
models, controllers, etc.  to prevent import cycles.
 

	
 
This file was forked by the Kallithea project in July 2014.
 
Original author and date, and relevant copyright and licensing information is below:
 
:created_on: Jan 5, 2011
 
:author: marcink
 
:copyright: (c) 2013 RhodeCode GmbH, and others.
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
import binascii
 
import datetime
 
import hashlib
 
import json
 
import logging
 
import os
 
import re
 
import string
 
import sys
 
import time
 
import urllib.parse
 
from distutils.version import StrictVersion
 

	
 
import bcrypt
 
import urlobject
 
from packaging.version import Version
 
from sqlalchemy.engine import url as sa_url
 
from sqlalchemy.exc import ArgumentError
 
from tg import tmpl_context
 
from tg.support.converters import asbool, aslist
 
from webhelpers2.text import collapse, remove_formatting, strip_tags
 

	
 
import kallithea
 
from kallithea.lib import webutils
 
from kallithea.lib.vcs.backends.base import BaseRepository, EmptyChangeset
 
from kallithea.lib.vcs.backends.git.repository import GitRepository
 
from kallithea.lib.vcs.conf import settings
 
from kallithea.lib.vcs.exceptions import RepositoryError
 
from kallithea.lib.vcs.utils import ascii_bytes, ascii_str, safe_bytes, safe_str  # re-export
 
from kallithea.lib.vcs.utils.lazy import LazyProperty
 

	
 

	
 
try:
 
    import pwd
 
except ImportError:
 
    pass
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
# mute pyflakes "imported but unused"
 
assert asbool
 
assert aslist
 
assert ascii_bytes
 
assert ascii_str
 
assert safe_bytes
 
assert safe_str
 
assert LazyProperty
 

	
 

	
 
# get current umask value without changing it
 
umask = os.umask(0)
 
os.umask(umask)
 

	
 

	
 
def convert_line_endings(line, mode):
 
    """
 
    Converts a given line  "line end" according to given mode
 

	
 
    Available modes are::
 
        0 - Unix
 
        1 - Mac
 
        2 - DOS
 
@@ -450,97 +450,97 @@ class PasswordGenerator(object):
 
        + ALPHABETS_NUM + ALPHABETS_SPECIAL
 
    ALPHABETS_ALPHANUM = ALPHABETS_BIG + ALPHABETS_SMALL + ALPHABETS_NUM
 
    ALPHABETS_BIG_SMALL = ALPHABETS_BIG + ALPHABETS_SMALL
 
    ALPHABETS_ALPHANUM_BIG = ALPHABETS_BIG + ALPHABETS_NUM
 
    ALPHABETS_ALPHANUM_SMALL = ALPHABETS_SMALL + ALPHABETS_NUM
 

	
 
    def gen_password(self, length, alphabet=ALPHABETS_FULL):
 
        assert len(alphabet) <= 256, alphabet
 
        l = []
 
        while len(l) < length:
 
            i = ord(os.urandom(1))
 
            if i < len(alphabet):
 
                l.append(alphabet[i])
 
        return ''.join(l)
 

	
 

	
 
def get_crypt_password(password):
 
    """
 
    Cryptographic function used for bcrypt password hashing.
 

	
 
    :param password: password to hash
 
    """
 
    return ascii_str(bcrypt.hashpw(safe_bytes(password), bcrypt.gensalt(10)))
 

	
 

	
 
def check_password(password, hashed):
 
    """
 
    Checks password match the hashed value using bcrypt.
 
    Remains backwards compatible and accept plain sha256 hashes which used to
 
    be used on Windows.
 

	
 
    :param password: password
 
    :param hashed: password in hashed form
 
    """
 
    # sha256 hashes will always be 64 hex chars
 
    # bcrypt hashes will always contain $ (and be shorter)
 
    if len(hashed) == 64 and all(x in string.hexdigits for x in hashed):
 
        return hashlib.sha256(password).hexdigest() == hashed
 
    try:
 
        return bcrypt.checkpw(safe_bytes(password), ascii_bytes(hashed))
 
    except ValueError as e:
 
        # bcrypt will throw ValueError 'Invalid hashed_password salt' on all password errors
 
        log.error('error from bcrypt checking password: %s', e)
 
        return False
 
    log.error('check_password failed - no method found for hash length %s', len(hashed))
 
    return False
 

	
 

	
 
git_req_ver = StrictVersion('1.7.4')
 
git_req_ver = Version('1.7.4')
 

	
 
def check_git_version():
 
    """
 
    Checks what version of git is installed on the system, and raise a system exit
 
    if it's too old for Kallithea to work properly.
 
    """
 
    if 'git' not in kallithea.BACKENDS:
 
        return None
 

	
 
    if not settings.GIT_EXECUTABLE_PATH:
 
        log.warning('No git executable configured - check "git_path" in the ini file.')
 
        return None
 

	
 
    try:
 
        stdout, stderr = GitRepository._run_git_command(['--version'])
 
    except RepositoryError as e:
 
        # message will already have been logged as error
 
        log.warning('No working git executable found - check "git_path" in the ini file.')
 
        return None
 

	
 
    if stderr:
 
        log.warning('Error/stderr from "%s --version":\n%s', settings.GIT_EXECUTABLE_PATH, safe_str(stderr))
 

	
 
    if not stdout:
 
        log.warning('No working git executable found - check "git_path" in the ini file.')
 
        return None
 

	
 
    output = safe_str(stdout).strip()
 
    m = re.search(r"\d+.\d+.\d+", output)
 
    if m:
 
        ver = StrictVersion(m.group(0))
 
        ver = Version(m.group(0))
 
        log.debug('Git executable: "%s", version %s (parsed from: "%s")',
 
                  settings.GIT_EXECUTABLE_PATH, ver, output)
 
        if ver < git_req_ver:
 
            log.error('Kallithea detected %s version %s, which is too old '
 
                      'for the system to function properly. '
 
                      'Please upgrade to version %s or later. '
 
                      'If you strictly need Mercurial repositories, you can '
 
                      'clear the "git_path" setting in the ini file.',
 
                      settings.GIT_EXECUTABLE_PATH, ver, git_req_ver)
 
            log.error("Terminating ...")
 
            sys.exit(1)
 
    else:
 
        ver = StrictVersion('0.0.0')
 
        ver = Version('0.0.0')
 
        log.warning('Error finding version number in "%s --version" stdout:\n%s',
 
                    settings.GIT_EXECUTABLE_PATH, output)
 

	
 
    return ver
kallithea/lib/vcs/utils/fakemod.py
Show inline comments
 
import imp
 
import importlib
 

	
 

	
 
def create_module(name, path):
 
    """
 
    Returns module created *on the fly*. Returned module would have name same
 
    as given ``name`` and would contain code read from file at the given
 
    ``path`` (it may also be a zip or package containing *__main__* module).
 
    """
 
    module = imp.new_module(name)
 
    module.__file__ = path
 
    exec(compile(open(path, "rb").read(), path, 'exec'), module.__dict__)
 

	
 
    spec = importlib.util.spec_from_file_location('module_name', path)
 
    module = importlib.util.module_from_spec(spec)
 
    spec.loader.exec_module(module)
 
    return module
kallithea/model/repo_group.py
Show inline comments
 
@@ -103,102 +103,96 @@ class RepoGroupModel(object):
 

	
 
        log.debug('renaming repos paths from %s to %s', old_path, new_path)
 

	
 
        if os.path.isdir(new_path):
 
            raise Exception('Was trying to rename to already '
 
                            'existing dir %s' % new_path)
 
        shutil.move(old_path, new_path)
 

	
 
    def _delete_group(self, group, force_delete=False):
 
        """
 
        Deletes a group from a filesystem
 

	
 
        :param group: instance of group from database
 
        :param force_delete: use shutil rmtree to remove all objects
 
        """
 
        paths = group.full_path.split(kallithea.URL_SEP)
 
        paths = os.sep.join(paths)
 

	
 
        rm_path = os.path.join(self.repos_path, paths)
 
        log.info("Removing group %s", rm_path)
 
        # delete only if that path really exists
 
        if os.path.isdir(rm_path):
 
            if force_delete:
 
                shutil.rmtree(rm_path)
 
            else:
 
                # archive that group
 
                _now = datetime.datetime.now()
 
                _ms = str(_now.microsecond).rjust(6, '0')
 
                _d = 'rm__%s_GROUP_%s' % (_now.strftime('%Y%m%d_%H%M%S_' + _ms),
 
                                          group.name)
 
                shutil.move(rm_path, os.path.join(self.repos_path, _d))
 

	
 
    def create(self, group_name, group_description, owner, parent=None,
 
               just_db=False, copy_permissions=False):
 
        try:
 
            if kallithea.lib.utils2.repo_name_slug(group_name) != group_name:
 
                raise Exception('invalid repo group name %s' % group_name)
 

	
 
            owner = db.User.guess_instance(owner)
 
            parent_group = db.RepoGroup.guess_instance(parent)
 
            new_repo_group = db.RepoGroup()
 
            new_repo_group.owner = owner
 
            new_repo_group.group_description = group_description or group_name
 
            new_repo_group.parent_group = parent_group
 
            new_repo_group.group_name = new_repo_group.get_new_name(group_name)
 

	
 
            meta.Session().add(new_repo_group)
 

	
 
            # create an ADMIN permission for owner except if we're super admin,
 
            # later owner should go into the owner field of groups
 
            if not owner.is_admin:
 
                self.grant_user_permission(repo_group=new_repo_group,
 
                                           user=owner, perm='group.admin')
 

	
 
            if parent_group and copy_permissions:
 
                # copy permissions from parent
 
                user_perms = db.UserRepoGroupToPerm.query() \
 
                    .filter(db.UserRepoGroupToPerm.group == parent_group).all()
 

	
 
                group_perms = db.UserGroupRepoGroupToPerm.query() \
 
                    .filter(db.UserGroupRepoGroupToPerm.group == parent_group).all()
 

	
 
                for perm in user_perms:
 
                    # don't copy over the permission for user who is creating
 
                    # this group, if he is not super admin he get's admin
 
                    # permission set above
 
                    if perm.user != owner or owner.is_admin:
 
                        db.UserRepoGroupToPerm.create(perm.user, new_repo_group, perm.permission)
 

	
 
                for perm in group_perms:
 
                    db.UserGroupRepoGroupToPerm.create(perm.users_group, new_repo_group, perm.permission)
 
            else:
 
                self._create_default_perms(new_repo_group)
 

	
 
            if not just_db:
 
                # we need to flush here, in order to check if database won't
 
                # throw any exceptions, create filesystem dirs at the very end
 
                meta.Session().flush()
 
                self._create_group(new_repo_group.group_name)
 

	
 
            return new_repo_group
 
        except Exception:
 
            log.error(traceback.format_exc())
 
            raise
 

	
 
    def _update_permissions(self, repo_group, perms_new=None,
 
                            perms_updates=None, recursive=None,
 
                            check_perms=True):
 
        from kallithea.lib.auth import HasUserGroupPermissionLevel
 

	
 
        if not perms_new:
 
            perms_new = []
 
        if not perms_updates:
 
            perms_updates = []
 

	
 
        def _set_perm_user(obj, user, perm):
 
            if isinstance(obj, db.RepoGroup):
 
                self.grant_user_permission(repo_group=obj, user=user, perm=perm)
 
            elif isinstance(obj, db.Repository):
 
                user = db.User.guess_instance(user)
 

	
 
                # private repos will not allow to change the default permissions
kallithea/templates/about.html
Show inline comments
 
## -*- coding: utf-8 -*-
 
<%inherit file="/base/base.html"/>
 
<%block name="title">
 
    ${_('About')}
 
</%block>
 
<%block name="header_menu">
 
    ${self.menu('about')}
 
</%block>
 
<%def name="main()">
 

	
 
<div class="panel panel-primary">
 
  <div class="panel-heading">
 
    <h5 class="panel-title">${_('About')} Kallithea</h5>
 
  </div>
 

	
 
  <div class="panel-body panel-about">
 
  <p><a href="https://kallithea-scm.org/">Kallithea</a> is a project of the
 
  <a href="http://sfconservancy.org/">Software Freedom Conservancy, Inc.</a>
 
  and is released under the terms of the
 
  <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License,
 
  v 3.0 (GPLv3)</a>.</p>
 

	
 
  <p>Kallithea is copyrighted by various authors, including but not
 
  necessarily limited to the following:</p>
 
  <ul>
 

	
 
  <li>Copyright &copy; 2012&ndash;2023, Mads Kiilerich</li>
 
  <li>Copyright &copy; 2012&ndash;2024, Mads Kiilerich</li>
 
  <li>Copyright &copy; 2024, Aristotelis Stageiritis</li>
 
  <li>Copyright &copy; 2024, Poesty Li</li>
 
  <li>Copyright &copy; 2019&ndash;2020, 2022&ndash;2023, Manuel Jacob</li>
 
  <li>Copyright &copy; 2023, Mathias De Mare</li>
 
  <li>Copyright &copy; 2023, qy117121</li>
 
  <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2022, Étienne Gilli</li>
 
  <li>Copyright &copy; 2016&ndash;2017, 2020, 2022, Asterios Dimitriou</li>
 
  <li>Copyright &copy; 2022, Jaime Marquínez Ferrándiz</li>
 
  <li>Copyright &copy; 2022, Louis Bertrand</li>
 
  <li>Copyright &copy; 2022, toras9000</li>
 
  <li>Copyright &copy; 2022, yzqzss</li>
 
  <li>Copyright &copy; 2022, МАН69К</li>
 
  <li>Copyright &copy; 2014&ndash;2021, Thomas De Schampheleire</li>
 
  <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2021, Étienne Gilli</li>
 
  <li>Copyright &copy; 2018&ndash;2021, ssantos</li>
 
  <li>Copyright &copy; 2019&ndash;2021, Private</li>
 
  <li>Copyright &copy; 2020&ndash;2021, fresh</li>
 
  <li>Copyright &copy; 2020&ndash;2021, robertus</li>
 
  <li>Copyright &copy; 2021, Eugenia Russell</li>
 
  <li>Copyright &copy; 2021, Michalis</li>
 
  <li>Copyright &copy; 2021, vs</li>
 
  <li>Copyright &copy; 2021, Александр</li>
 
  <li>Copyright &copy; 2017&ndash;2020, Allan Nordhøy</li>
 
  <li>Copyright &copy; 2017, 2020, Anton Schur</li>
 
  <li>Copyright &copy; 2020, Artem</li>
 
  <li>Copyright &copy; 2020, David Ignjić</li>
 
  <li>Copyright &copy; 2020, Dennis Fink</li>
 
  <li>Copyright &copy; 2020, J. Lavoie</li>
 
  <li>Copyright &copy; 2020, Ross Thomas</li>
 
  <li>Copyright &copy; 2020, Tim Ooms</li>
 
  <li>Copyright &copy; 2012, 2014&ndash;2017, 2019, Andrej Shadura</li>
 
  <li>Copyright &copy; 2019, Adi Kriegisch</li>
 
  <li>Copyright &copy; 2019, Danni Randeris</li>
 
  <li>Copyright &copy; 2019, Edmund Wong</li>
 
  <li>Copyright &copy; 2019, Elizabeth Sherrock</li>
 
  <li>Copyright &copy; 2019, Hüseyin Tunç</li>
 
  <li>Copyright &copy; 2019, leela</li>
 
  <li>Copyright &copy; 2019, Mateusz Mendel</li>
 
  <li>Copyright &copy; 2019, Nathan</li>
 
  <li>Copyright &copy; 2019, Oleksandr Shtalinberg</li>
 
  <li>Copyright &copy; 2019, THANOS SIOURDAKIS</li>
 
  <li>Copyright &copy; 2019, Wolfgang Scherer</li>
 
  <li>Copyright &copy; 2019, Христо Станев</li>
 
  <li>Copyright &copy; 2012, 2014&ndash;2018, Dominik Ruf</li>
 
  <li>Copyright &copy; 2014&ndash;2015, 2018, Michal Čihař</li>
 
  <li>Copyright &copy; 2015, 2018, Branko Majic</li>
 
  <li>Copyright &copy; 2018, Chris Rule</li>
 
  <li>Copyright &copy; 2018, Jesús Sánchez</li>
 
  <li>Copyright &copy; 2018, Patrick Vane</li>
 
  <li>Copyright &copy; 2018, Pheng Heong Tan</li>
 
  <li>Copyright &copy; 2018, Максим Якимчук</li>
 
  <li>Copyright &copy; 2018, Марс Ямбар</li>
 
  <li>Copyright &copy; 2012&ndash;2017, Unity Technologies</li>
 
  <li>Copyright &copy; 2015&ndash;2017, Søren Løvborg</li>
 
  <li>Copyright &copy; 2015, 2017, Sam Jaques</li>
 
  <li>Copyright &copy; 2017, Alessandro Molina</li>
 
  <li>Copyright &copy; 2017, Ching-Chen Mao</li>
 
  <li>Copyright &copy; 2017, Eivind Tagseth</li>
 
  <li>Copyright &copy; 2017, FUJIWARA Katsunori</li>
 
  <li>Copyright &copy; 2017, Holger Schramm</li>
 
  <li>Copyright &copy; 2017, Karl Goetz</li>
 
  <li>Copyright &copy; 2017, Lars Kruse</li>
kallithea/templates/admin/repo_groups/repo_group_edit_perms.html
Show inline comments
 
${h.form(url('edit_repo_group_perms', group_name=c.repo_group.group_name))}
 
<div class="form">
 
        <div>
 
            <table id="permissions_manage" class="table">
 
                <tr>
 
                    <td>${_('None')}<br />(${_('Not visible')})</td>
 
                    <td>${_('Read')}<br />(${_('Visible')})</td>
 
                    <td>${_('Write')}<br />(${_('Add repos')})</td>
 
                    <td>${_('Admin')}<br />(${_('Add/Edit groups')})</td>
 
                    <td>${_('User/User Group')}</td>
 
                    <td></td>
 
                </tr>
 
                ## USERS
 
                %for r2p in c.repo_group.repo_group_to_perm:
 
                    ##forbid revoking permission from yourself, except if you're an super admin
 
                    <tr id="id${id(r2p.user.username)}">
 
                      %if request.authuser.user_id != r2p.user.user_id or request.authuser.is_admin:
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none')}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read')}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write')}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin')}</td>
 
                        <td>
 
                            ${h.gravatar(r2p.user.email, cls="perm-gravatar", size=14)}
 
                            %if h.HasPermissionAny('hg.admin')() and r2p.user.username != 'default':
 
                             <a href="${h.url('edit_user',id=r2p.user.user_id)}">${r2p.user.username}</a>
 
                            %else:
 
                             ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
 
                            %endif
 
                        </td>
 
                        <td>
 
                          %if r2p.user.username !='default':
 
                            <button type="button" class="btn btn-default btn-xs" onclick="ajaxActionRevoke(${r2p.user.user_id}, 'user', '${'id%s'%id(r2p.user.username)}', '${r2p.user.username}')">
 
                             <i class="icon-minus-circled"></i>${_('Revoke')}
 
                            </button>
 
                          %endif
 
                        </td>
 
                      %else:
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.none', disabled="disabled")}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.read', disabled="disabled")}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.write', disabled="disabled")}</td>
 
                        <td>${h.radio('u_perm_%s' % r2p.user.username,'group.admin', disabled="disabled")}</td>
 
                        <td>
 
                            ${h.gravatar(r2p.user.email, cls="perm-gravatar", size=14)}
 
                            ${r2p.user.username if r2p.user.username != 'default' else _('Default')}
 
                        </td>
 
                        <td><i class="icon-user"></i>${_('Admin')}</td>
 
                      %endif
 
                    </tr>
 
                %endfor
 

	
 
                ## USER GROUPS
 
                %for g2p in c.repo_group.users_group_to_perm:
 
                    <tr id="id${id(g2p.users_group.users_group_name)}">
 
                        <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.none')}</td>
 
                        <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.read')}</td>
 
                        <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.write')}</td>
 
                        <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'group.admin')}</td>
 
                        <td>
 
                            <i class="icon-users"></i>
 
                            %if h.HasPermissionAny('hg.admin')():
 
                             <a href="${h.url('edit_users_group',id=g2p.users_group.users_group_id)}">
 
                                 ${g2p.users_group.users_group_name}
 
                             </a>
 
                            %else:
 
                             ${g2p.users_group.users_group_name}
 
                            %endif
 
                        </td>
 
                        <td>
 
                            <button type="button" class="btn btn-default btn-xs" onclick="ajaxActionRevoke(${g2p.users_group.users_group_id}, 'user_group', '${'id%s'%id(g2p.users_group.users_group_name)}', '${g2p.users_group.users_group_name}')">
 
                            <i class="icon-minus-circled"></i>${_('Revoke')}
 
                            </button>
 
                        </td>
 
                    </tr>
 
                %endfor
 
                ## New entries added by addPermAction here.
 
                <tr class="new_members last_new_member" id="add_perm_input"><td colspan="6"></td></tr>
 
                <tr>
 
                    <td colspan="6">
 
                        <button type="button" id="add_perm" class="btn btn-link btn-xs">
 
                            <i class="icon-plus"></i>${_('Add new')}
 
                        </button>
 
                    </td>
 
                </tr>
 
                <tr>
 
                    <td colspan="6">
 
                       ${_('Apply to children')}:
 
                       ${h.radio('recursive', 'none', label=_('None'), checked="checked")}
 
                       ${h.radio('recursive', 'groups', label=_('Repository Groups'))}
 
                       ${h.radio('recursive', 'repos', label=_('Repositories'))}
 
                       ${h.radio('recursive', 'all', label=_('Both'))}
 
                       <span class="help-block">${_('Set or revoke permission to all children of that group, including non-private repositories and other groups if selected.')}</span>
 
                    </td>
 
                </tr>
 
            </table>
 
        </div>
kallithea/templates/base/base.html
Show inline comments
 
## -*- coding: utf-8 -*-
 
<%inherit file="root.html"/>
 

	
 
<!-- CONTENT -->
 
<div id="content" class="container-fluid">
 
    ${self.flash_msg()}
 
    <div id="main">
 
        ${next.main()}
 
    </div>
 
</div>
 
<!-- END CONTENT -->
 

	
 
<!-- FOOTER -->
 
<div class="footer navbar navbar-inverse">
 
    <span class="navbar-text pull-left">
 
        ${_('Server instance: %s') % c.instance_id if c.instance_id else ''}
 
    </span>
 
    <span class="navbar-text pull-right">
 
        This site is powered by
 
        %if c.visual.show_version:
 
            <a class="navbar-link" href="${h.url('kallithea_project_url')}" target="_blank">Kallithea</a> ${c.kallithea_version},
 
        %else:
 
            <a class="navbar-link" href="${h.url('kallithea_project_url')}" target="_blank">Kallithea</a>,
 
        %endif
 
        which is
 
        <a class="navbar-link" href="${h.canonical_url('about')}#copyright">&copy; 2010&ndash;2023 by various authors &amp; licensed under GPLv3</a>.
 
        <a class="navbar-link" href="${h.canonical_url('about')}#copyright">&copy; 2010&ndash;2024 by various authors &amp; licensed under GPLv3</a>.
 
        %if c.issues_url:
 
            &ndash; <a class="navbar-link" href="${c.issues_url}" target="_blank">${_('Support')}</a>
 
        %endif
 
    </span>
 
</div>
 

	
 
<!-- END FOOTER -->
 

	
 
### MAKO DEFS ###
 

	
 
<%block name="branding_title">
 
    %if c.site_name:
 
    &middot; ${c.site_name}
 
    %endif
 
</%block>
 

	
 
<%def name="flash_msg()">
 
    <%include file="/base/flash_msg.html"/>
 
</%def>
 

	
 
<%def name="breadcrumbs()">
 
    <div class="panel-title">
 
    ${self.breadcrumbs_links()}
 
    </div>
 
</%def>
 

	
 
<%def name="admin_menu()">
 
  <ul class="dropdown-menu" role="menu">
 
      <li><a href="${h.url('admin_home')}"><i class="icon-book"></i>${_('Admin Journal')}</a></li>
 
      <li><a href="${h.url('repos')}"><i class="icon-database"></i>${_('Repositories')}</a></li>
 
      <li><a href="${h.url('repos_groups')}"><i class="icon-folder"></i>${_('Repository Groups')}</a></li>
 
      <li><a href="${h.url('users')}"><i class="icon-user"></i>${_('Users')}</a></li>
 
      <li><a href="${h.url('users_groups')}"><i class="icon-users"></i>${_('User Groups')}</a></li>
 
      <li><a href="${h.url('admin_permissions')}"><i class="icon-block"></i>${_('Default Permissions')}</a></li>
 
      <li><a href="${h.url('auth_home')}"><i class="icon-key"></i>${_('Authentication')}</a></li>
 
      <li><a href="${h.url('defaults')}"><i class="icon-wrench"></i>${_('Repository Defaults')}</a></li>
 
      <li class="last"><a href="${h.url('admin_settings')}"><i class="icon-gear"></i>${_('Settings')}</a></li>
 
  </ul>
 

	
 
</%def>
 

	
 

	
 
## admin menu used for people that have some admin resources
 
<%def name="admin_menu_simple(repositories=None, repository_groups=None, user_groups=None)">
 
  <ul class="dropdown-menu" role="menu">
 
   %if repositories:
 
      <li><a href="${h.url('repos')}"><i class="icon-database"></i>${_('Repositories')}</a></li>
 
   %endif
kallithea/tests/conftest.py
Show inline comments
 
@@ -159,58 +159,58 @@ def auto_clear_ip_permissions():
 
    invalidate_all_caches()
 
    session = meta.Session()
 
    session.commit()
 

	
 

	
 
@pytest.fixture
 
def test_context_fixture(app_fixture):
 
    """
 
    Encompass the entire test using this fixture in a test_context,
 
    making sure that certain functionality still works even if no call to
 
    self.app.get/post has been made.
 
    The typical error message indicating you need a test_context is:
 
        TypeError: No object (name: context) has been registered for this thread
 

	
 
    The standard way to fix this is simply using the test_context context
 
    manager directly inside your test:
 
        with test_context(self.app):
 
            <actions>
 
    but if test setup code (xUnit-style or pytest fixtures) also needs to be
 
    executed inside the test context, that method is not possible.
 
    Even if there is no such setup code, the fixture may reduce code complexity
 
    if the entire test needs to run inside a test context.
 

	
 
    To apply this fixture (like any other fixture) to all test methods of a
 
    class, use the following class decorator:
 
        @pytest.mark.usefixtures("test_context_fixture")
 
        class TestFoo(TestController):
 
            ...
 
    """
 
    with test_context(app_fixture):
 
        yield
 

	
 

	
 
class MyWSGIServer(WSGIServer):
 
    def repo_url(self, repo_name, username=TEST_USER_ADMIN_LOGIN, password=TEST_USER_ADMIN_PASS):
 
        """Return URL to repo on this web server."""
 
        host, port = self.server_address
 
        proto = 'http' if self._server.ssl_context is None else 'https'
 
        auth = ''
 
        if username is not None:
 
            auth = username
 
            if password is not None:
 
                auth += ':' + password
 
        if auth:
 
            auth += '@'
 
        return '%s://%s%s:%s/%s' % (proto, auth, host, port, repo_name)
 

	
 

	
 
@pytest.yield_fixture(scope="session")
 
@pytest.fixture(scope="session")
 
def webserver():
 
    """Start web server while tests are running.
 
    Useful for debugging and necessary for vcs operation tests."""
 
    server = MyWSGIServer(application=kallithea.tests.base.testapp)
 
    server.start()
 

	
 
    yield server
 

	
 
    server.stop()
kallithea/tests/other/test_vcs_operations.py
Show inline comments
 
@@ -105,143 +105,148 @@ class HgSshVcsTest(HgVcsTest, SshVcsTest
 
            ssh_key.user_ssh_key_id,
 
            repo_name)
 

	
 
class GitSshVcsTest(GitVcsTest, SshVcsTest):
 
    @staticmethod
 
    def _ssh_param(repo_name, user, ssh_key, client_ip):
 
        # Set a custom ssh command in the global environment
 
        os.environ['GIT_SSH_COMMAND'] = r"""bash -c 'SSH_ORIGINAL_COMMAND="$2" SSH_CONNECTION="%s 1024 127.0.0.1 22" kallithea-cli ssh-serve -c %s %s %s' --""" % (
 
            client_ip,
 
            kallithea.CONFIG['__file__'],
 
            user.user_id,
 
            ssh_key.user_ssh_key_id)
 
        return "ssh://someuser@somehost/%s""" % repo_name
 

	
 
parametrize_vcs_test = base.parametrize('vt', [
 
    HgHttpVcsTest,
 
    GitHttpVcsTest,
 
    HgSshVcsTest,
 
    GitSshVcsTest,
 
])
 
parametrize_vcs_test_hg = base.parametrize('vt', [
 
    HgHttpVcsTest,
 
    HgSshVcsTest,
 
])
 
parametrize_vcs_test_http = base.parametrize('vt', [
 
    HgHttpVcsTest,
 
    GitHttpVcsTest,
 
])
 

	
 
class Command(object):
 

	
 
    def __init__(self, cwd):
 
        self.cwd = cwd
 

	
 
    def execute(self, *args, **environ):
 
        """
 
        Runs command on the system with given ``args`` using simple space
 
        join without safe quoting.
 
        """
 
        command = ' '.join(args)
 
        ignoreReturnCode = environ.pop('ignoreReturnCode', False)
 
        if DEBUG:
 
            print('*** CMD %s ***' % command)
 
        testenv = dict(os.environ)
 
        testenv['LANG'] = 'en_US.UTF-8'
 
        testenv['LANGUAGE'] = 'en_US:en'
 
        testenv['HGPLAIN'] = ''
 
        testenv['HGRCPATH'] = ''
 
        testenv['GIT_CONFIG_SYSTEM'] = '/dev/null'
 
        testenv['GIT_CONFIG_GLOBAL'] = '/dev/null'
 
        testenv['GIT_COMMITTER_NAME'] = base.TEST_USER_ADMIN_LOGIN
 
        testenv['GIT_COMMITTER_EMAIL'] = base.TEST_USER_ADMIN_EMAIL
 
        testenv['GIT_AUTHOR_NAME'] = base.TEST_USER_REGULAR_LOGIN
 
        testenv['GIT_AUTHOR_EMAIL'] = base.TEST_USER_REGULAR_EMAIL
 
        testenv.update(environ)
 
        p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd, env=testenv)
 
        stdout, stderr = p.communicate()
 
        if DEBUG:
 
            if stdout:
 
                print('stdout:', stdout)
 
            if stderr:
 
                print('stderr:', stderr)
 
        if not ignoreReturnCode:
 
            assert p.returncode == 0
 
        return safe_str(stdout), safe_str(stderr)
 

	
 

	
 
def _get_tmp_dir(prefix='vcs_operations-', suffix=''):
 
    return tempfile.mkdtemp(dir=base.TESTS_TMP_PATH, prefix=prefix, suffix=suffix)
 

	
 

	
 
def _add_files(vcs, dest_dir, files_no=3):
 
    """
 
    Generate some files, add it to dest_dir repo and push back
 
    vcs is git or hg and defines what VCS we want to make those files for
 

	
 
    :param vcs:
 
    :param dest_dir:
 
    """
 
    added_file = '%ssetup.py' % next(_RandomNameSequence())
 
    open(os.path.join(dest_dir, added_file), 'a').close()
 
    Command(dest_dir).execute(vcs, 'add', added_file)
 

	
 
    email = 'me@example.com'
 
    if os.name == 'nt':
 
        author_str = 'User <%s>' % email
 
    else:
 
        author_str = 'User ǝɯɐᴎ <%s>' % email
 
    for i in range(files_no):
 
        cmd = """echo "added_line%s" >> %s""" % (i, added_file)
 
        Command(dest_dir).execute(cmd)
 
        if vcs == 'hg':
 
            cmd = """hg commit -m "committed new %s" -u "%s" "%s" """ % (
 
                i, author_str, added_file
 
            )
 
        elif vcs == 'git':
 
            cmd = """git commit -m "committed new %s" --author "%s" "%s" """ % (
 
                i, author_str, added_file
 
            )
 
        # git commit needs EMAIL on some machines
 
        Command(dest_dir).execute(cmd, EMAIL=email)
 
        Command(dest_dir).execute(cmd)
 

	
 
def _add_files_and_push(webserver, vt, dest_dir, clone_url, ignoreReturnCode=False, files_no=3):
 
    _add_files(vt.repo_type, dest_dir, files_no=files_no)
 
    # PUSH it back
 
    stdout = stderr = None
 
    if vt.repo_type == 'hg':
 
        stdout, stderr = Command(dest_dir).execute('hg push -f --verbose', clone_url, ignoreReturnCode=ignoreReturnCode)
 
    elif vt.repo_type == 'git':
 
        stdout, stderr = Command(dest_dir).execute('git push -f --verbose', clone_url, "master", ignoreReturnCode=ignoreReturnCode)
 

	
 
    return stdout, stderr
 

	
 

	
 
def _check_outgoing(vcs, cwd, clone_url):
 
    if vcs == 'hg':
 
        # hg removes the password from default URLs, so we have to provide it here via the clone_url
 
        return Command(cwd).execute('hg -q outgoing', clone_url, ignoreReturnCode=True)
 
    elif vcs == 'git':
 
        Command(cwd).execute('git remote update')
 
        return Command(cwd).execute('git log origin/master..master')
 

	
 

	
 
def set_anonymous_access(enable=True):
 
    user = db.User.get_default_user()
 
    user.active = enable
 
    meta.Session().commit()
 
    if enable != db.User.get_default_user().active:
 
        raise Exception('Cannot set anonymous access')
 

	
 

	
 
#==============================================================================
 
# TESTS
 
#==============================================================================
 

	
 

	
 
def _check_proper_git_push(stdout, stderr):
 
    assert 'fatal' not in stderr
 
    assert 'rejected' not in stderr
 
    assert 'Pushing to' in stderr
 
    assert 'master -> master' in stderr
 

	
 

	
 
@pytest.mark.usefixtures("test_context_fixture")
 
class TestVCSOperations(base.TestController):
 

	
 
    @classmethod
 
    def setup_class(cls):
 
        # DISABLE ANONYMOUS ACCESS
 
@@ -574,69 +579,69 @@ class TestVCSOperations(base.TestControl
 

	
 
        stdout, stderr = _add_files_and_push(webserver, vt, dest_dir, clone_url,
 
                                             ignoreReturnCode=True)
 
        assert 'failing_test_hook failed' in stdout + stderr
 
        assert 'Traceback' not in stdout + stderr
 
        assert 'prechangegroup.testhook hook failed' in stdout + stderr
 
        # there are still outgoing changesets
 
        stdout, stderr = _check_outgoing(vt.repo_type, dest_dir, clone_url)
 
        assert stdout != ''
 

	
 
        # set prechangegroup hook to exception throwing method
 
        db.Ui.create_or_update_hook('prechangegroup.testhook', 'python:kallithea.tests.fixture.exception_test_hook')
 
        meta.Session().commit()
 
        # re-try to push
 
        stdout, stderr = Command(dest_dir).execute('%s push' % vt.repo_type, clone_url, ignoreReturnCode=True)
 
        if vt is HgHttpVcsTest:
 
            # like with 'hg serve...' 'HTTP Error 500: INTERNAL SERVER ERROR' should be returned
 
            assert 'HTTP Error 500: INTERNAL SERVER ERROR' in stderr
 
        elif vt is HgSshVcsTest:
 
            assert 'remote: Exception: exception_test_hook threw an exception' in stdout
 
        else:
 
            assert False
 
        # there are still outgoing changesets
 
        stdout, stderr = _check_outgoing(vt.repo_type, dest_dir, clone_url)
 
        assert stdout != ''
 

	
 
        # set prechangegroup hook to method that returns False
 
        db.Ui.create_or_update_hook('prechangegroup.testhook', 'python:kallithea.tests.fixture.passing_test_hook')
 
        meta.Session().commit()
 
        # re-try to push
 
        stdout, stderr = Command(dest_dir).execute('%s push' % vt.repo_type, clone_url, ignoreReturnCode=True)
 
        assert 'passing_test_hook succeeded' in stdout + stderr
 
        assert 'Traceback' not in stdout + stderr
 
        assert 'prechangegroup.testhook hook failed' not in stdout + stderr
 
        # no more outgoing changesets
 
        stdout, stderr = _check_outgoing(vt.repo_type, dest_dir, clone_url)
 
        assert stdout == ''
 
        assert stderr == ''
 

	
 
    def test_add_submodule_git(self, webserver, testfork):
 
        dest_dir = _get_tmp_dir()
 
        clone_url = GitHttpVcsTest.repo_url_param(webserver, base.GIT_REPO)
 

	
 
        fork_url = GitHttpVcsTest.repo_url_param(webserver, testfork['git'])
 

	
 
        # add submodule
 
        stdout, stderr = Command(base.TESTS_TMP_PATH).execute('git clone', fork_url, dest_dir)
 
        stdout, stderr = Command(dest_dir).execute('git submodule add', clone_url, 'testsubmodule')
 
        stdout, stderr = Command(dest_dir).execute('git commit -am "added testsubmodule pointing to', clone_url, '"', EMAIL=base.TEST_USER_ADMIN_EMAIL)
 
        stdout, stderr = Command(dest_dir).execute('git commit -am "added testsubmodule pointing to', clone_url, '"')
 
        stdout, stderr = Command(dest_dir).execute('git push', fork_url, 'master')
 

	
 
        # check for testsubmodule link in files page
 
        self.log_user()
 
        response = self.app.get(base.url(controller='files', action='index',
 
                                    repo_name=testfork['git'],
 
                                    revision='tip',
 
                                    f_path='/'))
 
        # check _repo_files_url that will be used to reload as AJAX
 
        response.mustcontain('var _repo_files_url = ("/%s/files/");' % testfork['git'])
 

	
 
        response.mustcontain('<a class="submodule-dir" href="%s" target="_blank"><i class="icon-file-submodule"></i><span>testsubmodule @ ' % clone_url)
 

	
 
        # check that following a submodule link actually works - and redirects
 
        response = self.app.get(base.url(controller='files', action='index',
 
                                    repo_name=testfork['git'],
 
                                    revision='tip',
 
                                    f_path='/testsubmodule'),
 
                                status=302)
 
        assert response.location == clone_url
scripts/dbmigrate-test
Show inline comments
 
@@ -49,73 +49,73 @@ quiet_if_ok() (
 
    fi
 
)
 

	
 
HG() {
 
    "${HG:-hg}" --repository "$source_repo" "$@"
 
}
 

	
 
# If upgrading to "current revision", warn if working directory is dirty.
 
if [ ! "$to_rev" ] && [ "$(HG status -mard)" ]; then
 
    announce "Warning: Uncommitted changes in working directory will be ignored!"
 
fi
 

	
 
from_rev_hash=$(HG id --id --rev "${from_rev:-.}")
 
to_rev_hash=$(HG id --id --rev "${to_rev:-.}")
 
temp=$(readlink -f "$(mktemp --tmpdir -d 'dbmigrate-test.XXXXXX')")
 

	
 
cat <<EOD
 
Config file:    $config_file
 
EOD
 
sed -n -e 's/^sqlalchemy\.url *= */Database URL:   /p' "$config_file"
 
cat <<EOD
 
Working dir:    $temp
 
Repository:     $source_repo
 
Upgrade from:   $from_rev_hash (${from_rev:-current})
 
Upgrade to:     $to_rev_hash (${to_rev:-current})
 
Extra packages: ${EXTRA:-(none)}
 
EOD
 

	
 
mkdir "$temp/repos" # empty
 

	
 
# Enable caching for old pip versions (this will cache the pip upgrade)
 
# Newer pip versions cache automatically, and don't use this variable.
 
if [ ! "$PIP_DOWNLOAD_CACHE" ]; then
 
    export PIP_DOWNLOAD_CACHE=$HOME/.cache/pip/legacy
 
fi
 

	
 
install_kallithea() {
 
    local prefix=$1
 
    local rev=$2
 

	
 
    announce "Installing Kallithea $rev in $prefix..."
 

	
 
    "${VIRTUALENV:-virtualenv}" --quiet "$prefix-env"
 
    HG archive --rev "$rev" "$prefix"
 

	
 
    (
 
        cd "$prefix"
 
        . "$prefix-env/bin/activate"
 
        pip install --quiet --upgrade pip setuptools mercurial $EXTRA
 
        pip install --quiet --upgrade "pip<24.1" "setuptools<67" mercurial $EXTRA
 
        pip install --quiet -e .
 
    )
 
}
 

	
 
install_kallithea "$temp/from" "$from_rev_hash"
 
(
 
    cd "$temp/from"
 
    . "$temp/from-env/bin/activate"
 
    announce "Initializing database..."
 
    quiet_if_ok kallithea-cli db-create -c "$config_file" --repos="$temp/repos" --user=doe --email=doe@example.com --password=123456 --no-public-access --force-yes
 
    alembic -c "$config_file" current -v
 
)
 

	
 
install_kallithea "$temp/to" "$to_rev_hash"
 
(
 
    cd "$temp/to"
 
    . "$temp/to-env/bin/activate"
 

	
 
    announce "Commencing database upgrade from shown Alembic revision to head..."
 
    alembic -c "$config_file" current -v
 
    alembic -c "$config_file" upgrade head
 
    announce "Upgrade complete, now at the shown Alembic revision:"
 
    alembic -c "$config_file" current -v
 
)
scripts/deps.py
Show inline comments
 
@@ -83,96 +83,97 @@ stat
 
string
 
struct
 
subprocess
 
sys
 
tarfile
 
tempfile
 
textwrap
 
tgext
 
threading
 
time
 
traceback
 
traitlets
 
types
 
typing
 
urllib
 
urlobject
 
uuid
 
warnings
 
webhelpers2
 
webob
 
webtest
 
whoosh
 
win32traceutil
 
zipfile
 
'''.split())
 

	
 
top_modules = set('''
 
kallithea.alembic
 
kallithea.bin
 
kallithea.config
 
kallithea.controllers
 
kallithea.templates.py
 
scripts
 
'''.split())
 

	
 
bottom_external_modules = set('''
 
tg
 
mercurial
 
sqlalchemy
 
alembic
 
formencode
 
pygments
 
dulwich
 
beaker
 
psycopg2
 
docs
 
setup
 
conftest
 
packaging
 
'''.split())
 

	
 
normal_modules = set('''
 
kallithea
 
kallithea.controllers.base
 
kallithea.lib
 
kallithea.lib.auth
 
kallithea.lib.auth_modules
 
kallithea.lib.celerylib
 
kallithea.lib.db_manage
 
kallithea.lib.helpers
 
kallithea.lib.hooks
 
kallithea.lib.indexers
 
kallithea.lib.utils
 
kallithea.lib.utils2
 
kallithea.lib.vcs
 
kallithea.lib.webutils
 
kallithea.model
 
kallithea.model.async_tasks
 
kallithea.model.scm
 
kallithea.templates.py
 
'''.split())
 

	
 
shown_modules = normal_modules | top_modules
 

	
 
# break the chains somehow - this is a cleanup TODO list
 
known_violations = set([
 
('kallithea.lib.auth_modules', 'kallithea.lib.auth'),  # needs base&facade
 
('kallithea.lib.utils', 'kallithea.model'),  # clean up utils
 
('kallithea.lib.utils', 'kallithea.model.db'),
 
('kallithea.lib.utils', 'kallithea.model.scm'),
 
('kallithea.model', 'kallithea.lib.auth'),  # auth.HasXXX
 
('kallithea.model', 'kallithea.lib.auth_modules'),  # validators
 
('kallithea.model', 'kallithea.lib.hooks'),  # clean up hooks
 
('kallithea.model', 'kallithea.model.scm'),
 
('kallithea.model.scm', 'kallithea.lib.hooks'),
 
])
 

	
 
extra_edges = [
 
('kallithea.config', 'kallithea.controllers'),  # through TG
 
('kallithea.lib.auth', 'kallithea.lib.auth_modules'),  # custom loader
 
]
 

	
 

	
 
def normalize(s):
 
    """Given a string with dot path, return the string it should be shown as."""
 
    parts = s.replace('.__init__', '').split('.')
 
    short_2 = '.'.join(parts[:2])
scripts/i18n
Show inline comments
 
#!/usr/bin/env python3
 

	
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program 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 General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import os
 
import shutil
 
import sys
 

	
 
import click
 
import i18n_utils
 
from mercurial import util
 

	
 

	
 
"""
 
Tool for maintenance of .po and .pot files
 

	
 
Normally, the i18n-related files contain for each translatable string a
 
reference to all the source code locations where this string is found. This
 
meta data is useful for translators to assess how strings are used, but is not
 
relevant for normal development nor for running Kallithea. Such meta data, or
 
derived data like kallithea.pot, will inherently be outdated, and create
 
unnecessary churn and repository growth, making it harder to spot actual and
 
important changes.
 
"""
 

	
 
@click.group()
 
@click.option('--debug/--no-debug', default=False)
 
def cli(debug):
 
    if (debug):
 
        i18n_utils.do_debug = True
 
    pass
 

	
 
@cli.command()
 
@click.argument('po_files', nargs=-1)
 
@click.option('--merge-pot-file', default=None)
 
@click.option('--strip/--no-strip', default=False)
 
def normalize_po_files(po_files, merge_pot_file, strip):
 
    """Normalize the specified .po and .pot files.
 

	
 
    By default, only actual translations and essential headers will be
 
    preserved, just as we want it in the main branches with minimal noise.
 

	
 
    If a .pot file is specified, the po files will instead be updated by
 
    running GNU msgmerge with this .pot file, thus updating source code
 
    references and preserving comments and outdated translations.
 
    """
 
    for po_file in po_files:
 
        i18n_utils._normalize_po_file(po_file, merge_pot_file=merge_pot_file, strip=strip)
 

	
 
@cli.command()
 
@click.argument('local')
 
@click.argument('base')
 
@click.argument('other')
 
@click.argument('output')
 
@click.option('--merge-pot-file', default=None)
 
@click.option('--strip/--no-strip', default=False)
 
def normalized_merge(local, base, other, output, merge_pot_file, strip):
 
    """Merge tool for use with 'hg merge/rebase/graft --tool'
 

	
 
    i18n files are partially manually editored original source of content, and
 
    partially automatically generated and updated. That create a lot of churn
 
    and often cause a lot of merge conflicts.
 

	
 
    To avoid that, this merge tool wrapper will normalize .po content before
 
    running the merge tool.
 

	
 
    By default, only actual translations and essential headers will be
 
    preserved, just as we want it in the main branches with minimal noise.
 

	
 
    If a .pot file is specified, the po files will instead be updated by
 
    running GNU msgmerge with this .pot file, thus updating source code
 
    references and preserving comments and outdated translations.
 

	
 
    Add the following to your user or repository-specific .hgrc file to use it:
 
        [merge-tools]
 
        i18n.executable = /path/to/scripts/i18n
 
        i18n.args = normalized-merge $local $base $other $output
 

	
 
    and then invoke merge/rebase/graft with the additional argument '--tool i18n'.
 
    """
 
    from mercurial import context, simplemerge
 
    from mercurial import ui as uimod
 

	
 
    print('i18n normalized-merge: normalizing and merging %s' % output)
 

	
 
    i18n_utils._normalize_po_file(local, merge_pot_file=merge_pot_file, strip=strip)
 
    i18n_utils._normalize_po_file(base, merge_pot_file=merge_pot_file, strip=strip)
 
    i18n_utils._normalize_po_file(other, merge_pot_file=merge_pot_file, strip=strip)
 
    i18n_utils._normalize_po_file(output, merge_pot_file=merge_pot_file, strip=strip)
 

	
 
    # simplemerge will write markers to 'local' if it fails, keep a copy without markers
 
    localkeep = local + '.keep'
 
    shutil.copyfile(local, localkeep)
 

	
 
    ret = simplemerge.simplemerge(uimod.ui.load(),
 
         context.arbitraryfilectx(local.encode('utf-8')),
 
         context.arbitraryfilectx(base.encode('utf-8')),
 
         context.arbitraryfilectx(other.encode('utf-8')),
 
         label=[b'local', b'other', b'base'],
 
    merged_text, conflicts = simplemerge.simplemerge(
 
         simplemerge.MergeInput(context.arbitraryfilectx(local.encode('utf-8'), b'local')),
 
         simplemerge.MergeInput(context.arbitraryfilectx(base.encode('utf-8'), b'base')),
 
         simplemerge.MergeInput(context.arbitraryfilectx(other.encode('utf-8'), b'other')),
 
         mode='merge',
 
    )
 
    shutil.copyfile(local, output)  # simplemerge wrote to local - either resolved or with conflict markers
 
    if ret:
 
    util.writefile(output, merged_text)  # either resolved or with conflict markers
 
    if conflicts:
 
        shutil.copyfile(localkeep, local)
 
        basekeep = base + '.keep'
 
        otherkeep = other + '.keep'
 
        shutil.copyfile(base, basekeep)
 
        shutil.copyfile(other, otherkeep)
 
        sys.stderr.write("Error: simple merge failed and %s is left with conflict markers. Resolve the conflicts, then use 'hg resolve -m'.\n" % output)
 
        sys.stderr.write('Resolve with e.g.: kdiff3 %s %s %s -o %s\n' % (basekeep, localkeep, otherkeep, output))
 
        sys.exit(ret)
 
        sys.exit(1)
 

	
 
    os.remove(localkeep)
 

	
 
@cli.command()
 
@click.argument('file1')
 
@click.argument('file2')
 
@click.option('--merge-pot-file', default=None)
 
@click.option('--strip/--no-strip', default=False)
 
def normalized_diff(file1, file2, merge_pot_file, strip):
 
    """Compare two files while transparently normalizing them."""
 
    sys.exit(i18n_utils._normalized_diff(file1, file2, merge_pot_file=merge_pot_file, strip=strip))
 

	
 
if __name__ == '__main__':
 
    cli()
scripts/i18n_utils.py
Show inline comments
 
@@ -123,73 +123,73 @@ def _normalize_po(raw_content):
 
    msgstr ""
 
    "Expert"
 
    <BLANKLINE>
 
    msgid "%d minute"
 
    msgid_plural "%d minutes"
 
    msgstr[0] "minut"
 
    msgstr[1] "minutter"
 
    msgstr[2] ""
 
    ^^^
 
    """
 
    header_start = raw_content.find('\nmsgid ""\n') + 1
 
    header_end = raw_content.find('\n\n', header_start) + 1 or len(raw_content)
 
    chunks = [
 
        header_comment_strip_re.sub('', raw_content[0:header_start])
 
            .strip(),
 
        '',
 
        header_normalize_re.sub('', raw_content[header_start:header_end])
 
            .replace(
 
                r'"Content-Type: text/plain; charset=utf-8\n"',
 
                r'"Content-Type: text/plain; charset=UTF-8\n"')  # maintain msgmerge casing
 
            .strip(),
 
        '']  # preserve normalized header
 
    # all chunks are separated by empty line
 
    for raw_chunk in raw_content[header_end:].split('\n\n'):
 
        if '\n#, fuzzy' in raw_chunk:  # might be like "#, fuzzy, python-format"
 
            continue  # drop crazy auto translation that is worse than useless
 
        # strip all comment lines from chunk
 
        chunk_lines = [
 
            line
 
            for line in raw_chunk.splitlines()
 
            if line
 
            and not line.startswith('#')
 
        ]
 
        if not chunk_lines:
 
            continue
 
        # check lines starting from first msgstr, skip chunk if no translation lines
 
        msgstr_i = [i for i, line in enumerate(chunk_lines) if line.startswith('msgstr')]
 
        if (
 
            chunk_lines[0].startswith('msgid') and
 
            msgstr_i and
 
            all(line.endswith(' ""') for line in chunk_lines[msgstr_i[0]:])
 
        ):  # skip translation chunks that doesn't have any actual translations
 
            continue
 
        chunks.append('\n'.join(chunk_lines) + '\n')
 
    return '\n'.join(chunks)
 

	
 
def _normalize_po_file(po_file, merge_pot_file=None, strip=False):
 
    if merge_pot_file:
 
        runcmd(['msgmerge', '--width=76', '--backup=none', '--previous',
 
        runcmd(['msgmerge', '--width=76', '--backup=none', '--previous', '--no-fuzzy-matching',
 
                '--update', po_file, '-q', merge_pot_file])
 
    if strip:
 
        po_tmp = po_file + '.tmp'
 
        with open(po_file, 'r') as src, open(po_tmp, 'w') as dest:
 
            raw_content = src.read()
 
            normalized_content = _normalize_po(raw_content)
 
            dest.write(normalized_content)
 
        os.rename(po_tmp, po_file)
 

	
 
def _normalized_diff(file1, file2, merge_pot_file=None, strip=False):
 
    # Create temporary copies of both files
 
    temp1 = tempfile.NamedTemporaryFile(prefix=os.path.basename(file1))
 
    temp2 = tempfile.NamedTemporaryFile(prefix=os.path.basename(file2))
 
    debug('normalized_diff: %s -> %s / %s -> %s' % (file1, temp1.name, file2, temp2.name))
 
    shutil.copyfile(file1, temp1.name)
 
    shutil.copyfile(file2, temp2.name)
 
    # Normalize them in place
 
    _normalize_po_file(temp1.name, merge_pot_file=merge_pot_file, strip=strip)
 
    _normalize_po_file(temp2.name, merge_pot_file=merge_pot_file, strip=strip)
 
    # Now compare
 
    try:
 
        runcmd(['diff', '-u', temp1.name, temp2.name])
 
    except subprocess.CalledProcessError as e:
 
        return e.returncode
scripts/validate-commits
Show inline comments
 
#!/bin/bash
 
# Validate the specified commits against test suite and other checks.
 

	
 
if [ -n "$VIRTUAL_ENV" ]; then
 
    echo "Please run this script from outside a virtualenv."
 
    exit 1
 
fi
 

	
 
if ! hg update --check -q .; then
 
    echo "Working dir is not clean, please commit/revert changes first."
 
    exit 1
 
fi
 

	
 
revset=$1
 
if [ -z "$revset" ]; then
 
    echo "Warning: no revisions specified, checking draft changes up to the current one."
 
    revset='draft() and ancestors(.)'
 
fi
 

	
 
venv=$(mktemp -d kallithea-validatecommits-env-XXXXXX)
 
resultfile=$(mktemp kallithea-validatecommits-result-XXXXXX)
 
echo > "$resultfile"
 

	
 
cleanup()
 
{
 
    rm -rf /tmp/kallithea-test*
 
    rm -rf "$venv"
 
}
 
finish()
 
{
 
    cleanup
 
    # print (possibly intermediate) results
 
    cat "$resultfile"
 
    rm "$resultfile"
 
}
 
trap finish EXIT
 

	
 
for rev in $(hg log -r "$revset" -T '{node}\n'); do
 
    hg log -r "$rev"
 
    hg update "$rev"
 

	
 
    cleanup
 
    python3 -m venv "$venv"
 
    source "$venv/bin/activate"
 
    pip install --upgrade pip setuptools
 
    pip install --upgrade "pip<24.1" "setuptools<67"
 
    pip install -e . -r dev_requirements.txt python-ldap python-pam
 

	
 
    # run-all-cleanup
 
    if ! scripts/run-all-cleanup ; then
 
        echo "run-all-cleanup encountered errors!"
 
        result="NOK"
 
    else
 
        if ! hg update --check -q .; then
 
            echo "run-all-cleanup did not give clean results!"
 
            result="NOK"
 
            hg diff
 
            hg revert -a
 
        else
 
            result=" OK"
 
        fi
 
    fi
 
    echo "$result: $rev (run-all-cleanup)" >> "$resultfile"
 

	
 
    # pytest
 
    if py.test; then
 
        result=" OK"
 
    else
 
        result="NOK"
 
    fi
 
    echo "$result: $rev (pytest)" >> "$resultfile"
 

	
 
    deactivate
 
    echo
 
done
scripts/validate-minimum-dependency-versions
Show inline comments
 
#!/bin/bash
 
# Test that installation of all dependencies works fine if versions are set to
 
# the minimum ones.
 

	
 
set -e
 

	
 
if [ -n "$VIRTUAL_ENV" ]; then
 
    echo "This script will create its own virtualenv - please don't run it inside an existing one." >&2
 
    exit 1
 
fi
 

	
 
cd "$(hg root)"
 

	
 
venv=build/minimum-dependency-versions-venv
 
log=build/minimum-dependency-versions.log
 
min_requirements=build/minimum-dependency-versions-requirements.txt
 
echo "virtualenv: $venv"
 
echo "log: $log"
 
echo "minimum requirements file: $min_requirements"
 

	
 
# clean up previous runs
 
rm -rf "$venv" "$log"
 
mkdir -p "$venv"
 

	
 
# Make a light weight parsing of setup.py and dev_requirements.txt,
 
# finding all >= requirements and dumping into a custom requirements.txt
 
# while fixating the requirement at the lower bound.
 
sed -n 's/.*"\(.*\)>=\(.*\)".*/\1==\2/p' setup.py > "$min_requirements"
 
sed 's/>=/==/p' dev_requirements.txt >> "$min_requirements"
 

	
 
python3 -m venv "$venv"
 
source "$venv/bin/activate"
 
pip install --upgrade pip setuptools
 
pip install --upgrade "pip<24.1" "setuptools<67"
 
pip install -e . -r "$min_requirements" python-ldap python-pam 2> >(tee "$log" >&2)
 

	
 
# Treat any message on stderr as a problem, for the caller to interpret.
 
if [ -s "$log" ]; then
 
    echo
 
    echo "Error: pip detected following problems:"
 
    cat "$log"
 
    echo
 
    exit 1
 
fi
 

	
 
freeze_txt=build/minimum-dependency-versions.txt
 
pip freeze > $freeze_txt
 
echo "Installation of minimum packages was successful, providing a set of packages as in $freeze_txt . Now running test suite..."
 

	
 
pytest
 

	
 
echo "Test suite execution was successful."
 
echo "You can now do additional validation using virtual env '$venv'."
setup.py
Show inline comments
 
#!/usr/bin/env python3
 
# -*- coding: utf-8 -*-
 
import os
 
import platform
 
import re
 
import sys
 

	
 
import setuptools
 
# monkey patch setuptools to use distutils owner/group functionality
 
from setuptools.command import sdist
 

	
 

	
 
if sys.version_info < (3, 6):
 
    raise Exception('Kallithea requires Python 3.6 or later')
 

	
 

	
 
here = os.path.abspath(os.path.dirname(__file__))
 

	
 

	
 
def _get_meta_var(name, data, callback_handler=None):
 
    matches = re.compile(r'(?:%s)\s*=\s*(.*)' % name).search(data)
 
    if matches:
 
        s = eval(matches.groups()[0])
 
        if callable(callback_handler):
 
            return callback_handler(s)
 
        return s
 

	
 
_meta = open(os.path.join(here, 'kallithea', '__init__.py'), 'r')
 
_metadata = _meta.read()
 
_meta.close()
 

	
 
def callback(V):
 
    return '.'.join(map(str, V[:3])) + '.'.join(V[3:])
 
__version__ = _get_meta_var('VERSION', _metadata, callback)
 
__license__ = _get_meta_var('__license__', _metadata)
 
__author__ = _get_meta_var('__author__', _metadata)
 
__url__ = _get_meta_var('__url__', _metadata)
 
# defines current platform
 
__platform__ = platform.system()
 

	
 
is_windows = __platform__ in ['Windows']
 

	
 
requirements = [
 
    "alembic >= 1.0.10, < 1.5",
 
    "alembic >= 1.0.10, < 1.14",
 
    "gearbox >= 0.1.0, < 1",
 
    "waitress >= 0.8.8, < 1.5",
 
    "waitress >= 0.8.8, < 3.1",
 
    "WebOb >= 1.8, < 1.9",
 
    "backlash >= 0.1.2, < 1",
 
    "TurboGears2 >= 2.4, < 2.5",
 
    "tgext.routes >= 0.2.0, < 1",
 
    "Beaker >= 1.10.1, < 2",
 
    "WebHelpers2 >= 2.0, < 2.1",
 
    "FormEncode >= 1.3.1, < 2.1",
 
    "WebHelpers2 >= 2.0, < 2.2",
 
    "FormEncode >= 1.3.1, < 2.2",
 
    "SQLAlchemy >= 1.2.9, < 1.4",
 
    "Mako >= 0.9.1, < 1.2",
 
    "Pygments >= 2.2.0, < 2.7",
 
    "Mako >= 0.9.1, < 1.4",
 
    "Pygments >= 2.2.0, < 2.8",
 
    "Whoosh >= 2.7.1, < 2.8",
 
    "celery >= 5, < 5.1",
 
    "Babel >= 1.3, < 2.9",
 
    "python-dateutil >= 2.1.0, < 2.9",
 
    "celery >= 5, < 5.5",
 
    "Babel >= 1.3, < 2.16",
 
    "python-dateutil >= 2.1.0, < 2.10",
 
    "Markdown >= 2.2.1, < 3.2",
 
    "docutils >= 0.11, < 0.17",
 
    "docutils >= 0.11, < 0.20",
 
    "URLObject >= 2.3.4, < 2.5",
 
    "Routes >= 2.0, < 2.5",
 
    "dulwich >= 0.19.0, < 0.20",
 
    "mercurial >= 5.2, < 6.2",
 
    "decorator >= 4.2.1, < 4.5",
 
    "Paste >= 2.0.3, < 3.5",
 
    "bleach >= 3.2, < 4.2",
 
    "Click >= 7.0, < 8",
 
    "Routes >= 2.0, < 2.6",
 
    "dulwich >= 0.19.0, < 0.22",
 
    "mercurial >= 5.2, < 6.9",
 
    "decorator >= 4.2.1, < 5.2",
 
    "Paste >= 2.0.3, < 3.11",
 
    "bleach >= 3.2, < 5",
 
    "Click >= 7.0, < 8.2",
 
    "ipaddr >= 2.2.0, < 2.3",
 
    "paginate >= 0.5, < 0.6",
 
    "paginate_sqlalchemy >= 0.3.0, < 0.4",
 
    "bcrypt >= 3.1.0, < 3.2",
 
    "pip >= 20.0, < 999",
 
    "bcrypt >= 3.1.0, < 4.2",
 
    "pip >= 20.0, < 24.1",
 
    "chardet >= 3",
 
]
 
if sys.version_info < (3, 8):
 
    requirements.append("importlib-metadata < 5")
 

	
 
dependency_links = [
 
]
 

	
 
classifiers = [
 
    'Development Status :: 4 - Beta',
 
    'Environment :: Web Environment',
 
    'Framework :: Pylons',
 
    'Intended Audience :: Developers',
 
    'License :: OSI Approved :: GNU General Public License (GPL)',
 
    'Operating System :: OS Independent',
 
    'Programming Language :: Python :: 3.6',
 
    'Programming Language :: Python :: 3.7',
 
    'Programming Language :: Python :: 3.8',
 
    'Topic :: Software Development :: Version Control',
 
]
 

	
 

	
 
# additional files from project that goes somewhere in the filesystem
 
# relative to sys.prefix
 
data_files = []
 

	
 
description = ('Kallithea is a fast and powerful management tool '
 
               'for Mercurial and Git with a built in push/pull server, '
 
               'full text search and code-review.')
 

	
 
keywords = ' '.join([
 
    'kallithea', 'mercurial', 'git', 'code review',
 
    'repo groups', 'ldap', 'repository management', 'hgweb replacement',
 
    'hgwebdir', 'gitweb replacement', 'serving hgweb',
 
])
 

	
 
# long description
 
README_FILE = 'README.rst'
 
try:
 
    long_description = open(README_FILE).read()
 
except IOError as err:
 
    sys.stderr.write(
 
        "[WARNING] Cannot find file specified as long_description (%s): %s\n"
 
        % (README_FILE, err)
 
    )
 
    long_description = description
 

	
 

	
0 comments (0 inline, 0 general)